mongodb分片共有四个组件:mongos、config server、shard、replica set
mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
shard,这就是传说中的片了,用来将数据读写压力分散到不同的机器上,片越多,数据则越分散,数据吞吐量也会越高,需要的机器资源也会更多。通常情况下,需要将每个片做成副本集,以防止其中某个片出问题后则这个片上的数据不可用。
replica set(副本集),如果没有 replica set 是个不完整架构,假设其中的一个分片挂掉那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对于每一个分片构建 replica set 副本集保证分片的可靠性。官方推荐的是一个replica set由3个副本组成,如果机器不够用,可以 2个副本 + 1个仲裁。
首先下载安装程序 官方下载地址
搭建configserver
由于configserver的重要性,强烈推荐由至少3台机器组成configserver副本集
解压并创建配置文件,并复制到3台机器上
配置文件中增加
配置文件
sharding:
clusterRole: configsvr
启动所有实例,并登录其中一台机器,运行mongo程序(如果需要打开登录认证功能,参见:为MongoDB添加身份验证)
执行初始化副本集脚本
示例
rs.initiate({
_id: "candao_qc_config",
configsvr: true,
members: [
{ _id : 0, host : "10.200.102.36:27117" ,"priority":100 },
{ _id : 1, host : "10.200.102.41:27117","priority":1 },
{ _id : 2, host : "10.200.102.45:27117","priority":1 }
]
})
等待初始化完成,此时configserver副本集就搭建完成了
搭建shard server
每个shard负责存储集群的一部分数据,如果数据损坏,则会导致这部分数据丢失,重要性不言而喻,同样强烈推荐由至少3台机器组成副本集
搭建副本集不在赘述,参见:副本集的搭建,与副本集不同的是,需要在每台机器的配置文件中添加如下配置:
配置示例
sharding:
clusterRole: shardsvr
想要分多少个片,就按述方法配置多少个副本集
配置mongos程序
创建mongos.conf
配置示例
net:
port: 27017
##日志文件
systemLog:
destination: file
path: "mongod.log"
logAppend: true
processManagement:
##以后台进程运行
fork: true
sharding:
configDB: candao_qc_config/10.200.102.36:27117,10.200.102.45:27117,10.200.102.41:27117
启动mongos进程./mongos -f mongos.conf (通常可以启动多个,可以将mongos进程部署在部署项目的机器上)
在mongos上将配置好的分片副本集加入分片集群 (直接在bin下:./mongo)
配置示例
sh.addShard( "candao_qc_shard1/10.200.102.31:27027");
sh.addShard( "candao_qc_shard2/10.200.102.31:27028");
sh.addShard( "candao_qc_shard3/10.200.102.31:27029");
将要分片的数据库开启分片 sh.enableSharding("datacenter_qc")
将表进行分片 sh.shardCollection("datacenter_qc.order", { "createTime":1, "brandId":1 } )
至此,分片搭建完成,如果刚才分片的集合中有数据,此时需要等待后台进程将数据按照片键均匀地迁移到其他机器上
在工具或者程序中,需要用可读可写账号进行访问mongo的数据,这个时候,需要在configserver中进行创建原来的集群中的可读、可写的账号。
本文出自 “萌哥,卡恩” 博客,请务必保留此出处http://xjf721.blog.51cto.com/889836/1902034
原文:http://xjf721.blog.51cto.com/889836/1902034