七叶笔记 » 数据库 » MongoDB分片详解

MongoDB分片详解

mongos会将这个查询直接发送给Q-Z片,获得响应后,直接转发给客户端

mongos会将其先发送给A-F和G-P片,然后将结果转发给客户端.

mongos会在所有片上查询,返回结果时还会做归并排序,确保结果顺序正确.

mongos用游标从各个服务器上获取数据,所以不必等到全部数据都拿到才向客户端发送批量结果.

mongos并不追踪"email"键,所以也不知道应该将查询发给那个片.所以他就向所有片顺序发送查询.

如果是插入文档,mongos会依据"name"键的值,将其发送到相应的片上.

 7.建立分片

建立分片有两步:启动实际的服务器,然后决定怎么切分数据.

分片一般会有3个组成部分:

a.片

片就是保存子集合数据的容器,片可是单个的mongod服务器(开发和测试用),也可以是副本集(生产用).所以一片

有多台服务器,也只能有一个主服务器,其他的服务器保存相同的数据.

b.mongos

mongos就是MongoDB配的路由器进程.它路由所有的请求,然后将结果聚合.它本身并不存储数据或者配置信息

但会缓存配置服务器的信息.

c.配置服务器

配置服务器存储了集群的配置信息:数据和片的对应关系.mongos不永久存房数据,所以需要个地方存放分片的配置.

它会从配置服务器获取同步数据.

 8.启动服务器

首先要启动配置服务器和mongos.配置服务器需要先启动.因为mongos会用到其上的配置信息.

配置服务器的启动就像普通的mongod一样

mongod --dbpath "F:mongodbsconfig" --port 20000 --logpath "F:mongologsconfigMongoDB.txt" --rest

配置服务器不需要很多的空间和资源(200M实际数据大约占用1kB的配置空间)

 建立mongos进程,一共应用程序连接.这种路由服务器连接数据目录都不需要,但一定要指明配置服务器的位置:

mongos --port 30000 --configdb 127.0.0.1:20000 --logpath "F:mongologsmongosMongoDB.txt"

分片管理通常是通过mongos完成的.

添加片

片就是普通的mongod实例(或副本集)

mongod --dbpath "F:mongodbsshard" --port 10000 --logpath "F:mongologsshardMongoDB.txt" --rest

mongod --dbpath "F:mongodbsshard1" --port 10001 --logpath "F:mongologsshard1MongoDB.txt" --rest

连接刚才启动的mongos,为集群添加一个片.启动shell,连接mongos:

确定连接的是mongos而不是mongod,通过addshard命令添加片:

当在本机运行片的时候,得设定allowLocal键为1.MongoDB尽量避免由于错误的配置,将集群配置到本地,

所以得让它知道这仅仅是开发,而且我们很清楚自己在做什么.如果是生产环境中,则要将其部署在不同的机器上.

想添加片的时候,就运行addshard.MongoDB会负责将片集成到集群.

切分数据

MongoDB不会将存储的每一条数据都直接发布,得先在数据库和集合的级别将分片功能打开.

如果是连接配置服务器,

应该是连接 路由服务器:

db.runCommand({"enablesharding":"test"})//将test数据库启用分片功能.

对数据库分片后,其内部的集合便会存储到不同的片上,同时也是对这些集合分片的前置条件.

在数据库级别启用了分片以后,就可以使用shardcollection命令堆积和进行分片:

如果现在对refactor集合添加数据,就会依据"name"的值自动分散到各个片上.

9.生产配置

进入生产环境后,需要更健壮的分片方案,成功的构建分片需要如下条件:

多个配置服务器

多个mongos服务器

每个片都是副本集

正确的设置w

健壮的配置

设置多个配置服务器是很简单的.

设置多个配置服务器和设置一个配置服务器一样

启动mongos的时候应将其连接到3个配置服务器上:

配置服务器使用的是两步提交机制,而不是普通的MongoDB的异步复制,来维护集群配置的不同副本.这样能保证集群的状态

的一致性.这意味着,某台配置服务器宕机后,集群的配置信息是只读的.客户端还是能够读写,但是只有所有配置服务器备份了

以后才能重新均衡数据.

多个mongos

mongos的数量不受限制,建议针对一个应用服务器只运行一个mongos进程.这样每个应用服务器就可以与mongos进行

本地回话,如果服务器不工作了,就不会有应用试图与不存的mongos通话了

健壮的片

生产环境中,每个片都应是副本集,这样单个服务器坏了,就不会导致整个片失效.用addshard命令就可以将副本集作为片添加,

添加时,只要指定副本集的名称和种子就行了.

如要添加副本集refactor,其中包含一个服务器127.0.0.1:10000(还有别的服务器),就可以用下列命令将其添加到集群中:

如果127.0.0.1:10000服务器挂了,mongos会知道它所连接的是一个副本集,并会使用新的主节点.

10.管理分片

分片信息主要存放在config数据库上,这样就能被任何连接到mongos的进程访问到了.

配置集合

在shell中连接了mongos,并使用了use config数据库

a.片

可以在shareds集合中查到所有的片

b.数据库

databases集合含有已经包含在片上的数据库列表和一些相关信息

返回的文档解释:

"_id"

表示数据库名

"partitioned"

表示是否启用了分片功能

"primary"

这个值与"_id"相对应,表名这个数据的"大本营"在哪里.不论分片与否,数据库总会有个大本营.要是分片的话,创建数据库时会

随机选择一个片.也就是说,大本营是开始创建数据库文档的位置.虽然分片时数据库也会用到很多别的服务器,但会从这个片开始.

c.块

块信息存储在chunks集合中.这可以看到数据到底是怎么切分到集群中的

分片命令

获得概要

删除片

用removeshard就能从集群中删除片.removeshard会把给定片上的所有块的数据都挪到其他片上

db.runCommand({"removeshard":"127.0.0.1:10001"})

在挪动过程中,removeshard会显示进程

 

相关文章