简介
所谓分片,指的就是把数据拆分,将其分散到不同机器上的过程。MongoDB支持自动
分片,对应用而言,好像始终和一个单机的服务器交互一样。
分片和复制
复制是让多台服务器拥有相同的数据副本,而分片是每个分片都拥有整个数据集的
一个子集,且相互是不同的数据,多个分片的数据合起来构成整个数据集。
Mongos
用来执行客户端访问集群数据的路由,它维护着一个内容列表,记录了每个分片包
含的数据,应用程序只要连接上它,就跟操作单台服务器一样。
配置服务器
配置服务器就是普通的mongod服务器,保存整个集群和分片的元数据:集群中有哪
些分片,分片的是哪些集合,以及数据块的分布。它极其重要,必须启用日志功能。
在大型的集群中,建议配置3台配置服务器,就足够用了。启动配置服务器的方式:
1:先创建几个存放数据的文件夹,比如在前面的dbs下面创建confdb文件夹,然后在confdb下
面创建confdb1,confdb2,confdb3文件夹;
同理在前面的logs下面创建conflogs文件夹
2:然后分别启动这三个配置服务器,使用—configsvr指明是配置服务器,如下:
./mongod --configsvr --dbpath ../dbs/confdb/confdb1 --logpath ../logs/conflog/conflog1 --fork --port 30001
./mongod --configsvr --dbpath ../dbs/confdb/confdb2 --logpath ../logs/conflog/conflog2 --fork --port 30002
./mongod --configsvr --dbpath ../dbs/confdb/confdb3 --logpath ../logs/conflog/conflog3 --fork --port 30003
3:--configsvr默认的端口为27019,默认的数据目录为/data/configdb,可以使用--dbpath
和--port自己定义。
4:注意不要使用--replSet选项,配置服务器不是副本集成员。Mongos会向所有的3台配置服
务器发送写请求,并确保3台服务器拥有相同的数据。
启动mongos进程
1:
./mongos --configdb localhost:30001,localhost:30002,localhost:30003 --logpath ../logs/conflog/mongoslog --fork
2:可以启动任意多个mongos,通常是一个应用服务器使用一个mongos,也就是说mongos通常
与应用服务器运行在一个机器上
3:mongos的默认端口是27017,可以用chunkSize来指定块的大小,默认是200M
将副本集转换成为分片
1:如果没有副本集,按照前面讲的创建并初始化一个;如果有一个副本集,就打开相应的服
务器,把副本集运行起来
2:先连接到mongos use admin 也就是切换到使用admin的数据库
./mongo localhost:27017
use admin
3:然后连接到mongos,把副本集转换成为分片,示例如下:
sh.addShard("myrepl/127.0.0.1:20001,127.0.0.1:20002");
不用把所有副本集的成员都写出来,mongos会自动检查整个副本集。副本集的名称
myrepl就用作了分片的名称。
4:使用sh.status();察看状态,会发现整个副本集里面的服务都加入进来了。
5:注意:添加分片过后,客户端应该连接mongos进行操作,而不是连接副本集了。
6:也可以创建单mongod服务器的分片,但不建议在生产环境中使用
7:至此一个分片就创建好了,然后可以重复步骤,创建一个新的副本集,加入到分片中来
数据分片
需要明确指定分片的数据库和集合,MongoDB才会对数据进行自动分片。
1:对数据库启用分片
sh.enableSharding(“数据库名”);
2:然后指定分片的集合,还有分片的键,如果对已经存在的集合进行分片,那么指定的这个
分片键上必须有索引;如果集合不存在,mongos会自动在分片键上创建索引。例如:
sh.shardCollection("rep1.users",{"userId":1});