集群由三台服务器(假定ip地址为:serverA,serverB,serverC)组成,采用mongodb的复制集+分片(Replica Sets+Sharding) 实现集群的高可靠/高可用以及数据读写的负载均衡。 三台机器分成两个复制集,两个复制集组成一个集群的两个分片(shard1和shard2)。具体如下:
- ServerA的s1-1 / ServerB的s1-2 / ServerC的s1-3 组成一个3节点的复制集s1
- ServerA的s2-1 / ServerB的s2-2 / ServerC的s2-3 组成一个3节点的复制集s2
- 复制集s1和s2 组成有两个片的分片集群
- 为确保配置信息高可用,集群采用3个配置节点存储集群配置信息: ServerA的c1 / ServerB的c2 / ServerC的c3
- 为对外服务提供高可用,集群采用3个路由节点对外提供服务:ServerA的mongos 1 / ServerB的mongos 2/ ServerC的mongos 3,也可以结合keepalive对外提供一个vip.
mongodb集群逻辑结构:
每台机器运行4个服务进程(2+1+1),端口和目录规划:
在windows下对集群配置的具体步骤:
- 1、启动Shard1进程并配置Replica Set到复制集 setA :
在serverA上启动mongod shard11进程,副本集名称:setA:
mongod--dbpath=F:\mongodb_Replica-Sets_Sharding\ServerA\mongod-S1-1\data\db --logpath=F:\mongodb_Replica-Sets_Sharding\ServerA\mongod-S1-1\data\log\MongoDB.log --port 10000 --shardsvr --replSet setA --rest --oplogSize 64
在serverB上上启动mongod shard12进程,副本集名称:setA:
mongod--dbpath=F:\mongodb_Replica-Sets_Sharding\ServerB\mongod-S1-2\data\db --logpath=F:\mongodb_Replica-Sets_Sharding\ServerB\mongod-S1-2\data\log\MongoDB.log --port 10001 --shardsvr --replSet setA --rest --oplogSize 64
在serverC上上启动mongod shard13进程,副本集名称:setA:
mongod--dbpath=F:\mongodb_Replica-Sets_Sharding\ServerC\mongod-S1-3\data\db --logpath=F:\mongodb_Replica-Sets_Sharding\ServerC\mongod-S1-3\data\log\MongoDB.log --port 10002 --shardsvr --replSet setA --rest --oplogSize 64
初始化分片集
连接三个节点的任一个初始化复制集setA
use admin
config={_id:'setA',members:[{_id:0,host:'192.168.0.19:10000'},{_id:1,host:'192.168.0.19:10001'},{_id:2,host:'192.168.0.19:10002'}]}
rs.initiate(config)
- 2、 配置shard2用到复制集 s2:
在serverA上启动mongod shard21进程,副本集名称:setB:
mongod --dbpath=F:\mongodb_Replica-Sets_Sharding\ServerA\mongod-S2-1\data\db --logpath=F:\mongodb_Replica-Sets_Sharding\ServerA\mongod-S2-1\data\log\MongoDB.log --port 20000 --shardsvr --replSet setB --rest --oplogSize 64
在serverB上启动mongod shard22进程,副本集名称:setB:
mongod --dbpath=F:\mongodb_Replica-Sets_Sharding\ServerB\mongod-S2-2\data\db --logpath=F:\mongodb_Replica-Sets_Sharding\ServerB\mongod-S2-2\data\log\MongoDB.log --port 20001 --shardsvr --replSet setB --rest --oplogSize 64
在serverC上启动mongod shard23进程,副本集名称:setB:
mongod --dbpath=F:\mongodb_Replica-Sets_Sharding\ServerC\mongod-S2-3\data\db --logpath=F:\mongodb_Replica-Sets_Sharding\ServerC\mongod-S2-3\data\log\MongoDB.log --port 20002 --shardsvr --replSet setB --rest --oplogSize 64
初始化分片集
连接三个节点的任一个初始化复制集setB
use admin config={_id:'setB',members:[{_id:0,host:'192.168.0.19:20000'},{_id:1,host:'192.168.0.19:20001'},{_id:2,host:'192.168.0.19:20002'}]} rs.initiate(config);
- 3、配置三台Config Server:
在serverA上:
mongod--configsvr--logpath F:\mongodb_Replica-Sets_Sharding\ServerA\mongod-C1\data\log\MongoDB.log --logappend --dbpath F:\mongodb_Replica-Sets_Sharding\ServerA\mongod-C1\data\db --port 40000 --shardsvr
在serverB上:
mongod--configsvr--logpath F:\mongodb_Replica-Sets_Sharding\ServerB\mongod-C2\data\log\MongoDB.log --logappend --dbpath F:\mongodb_Replica-Sets_Sharding\ServerB\mongod-C2\data\db --port 40001 --shardsvr
在serverC上:
mongod--configsvr--logpath F:\mongodb_Replica-Sets_Sharding\ServerC\mongod-C3\data\log\MongoDB.log --logappend --dbpath F:\mongodb_Replica-Sets_Sharding\ServerC\mongod-C3\data\db --port 40002 --shardsvr
- 4、配置三台Route Server:
在serverA上:
mongos -configdb 192.168.0.19:40000,192.168.0.19:40001,192.168.0.19:40002 --logpath F:\mongodb_Replica-Sets_Sharding\ServerA\mongod-1\data\log\MongoDB.log --logappend --port 50000
在serverB上:
mongos -configdb 192.168.0.19:40000,192.168.0.19:40001,192.168.0.19:40002 --logpath F:\mongodb_Replica-Sets_Sharding\ServerB\mongod-2\data\log\MongoDB.log --logappend --port 50001
在serverC上:
mongos -configdb 192.168.0.19:40000,192.168.0.19:40001,192.168.0.19:40002 --logpath F:\mongodb_Replica-Sets_Sharding\ServerC\mongod-3\data\log\MongoDB.log --logappend --port 50002
- 5、配置Shard Cluster:
连接任一mongos进程执行以下命令:
use admin db.runCommand({addshard:"setA/192.168.0.19:10000,192.168.0.19:10001,192.168.0.19:10003",name:"ShardSetA"})
db.runCommand({addshard:"setB/192.168.0.19:20000,192.168.0.19:20001,192.168.0.19:20002",name:"ShardSetB"})
- 6、激活数据库及集合的分片功能:
连接任一mongos进程执行以下命令:
db.runCommand({enablesharding:"testdb"}) db.runCommand({shardcollection:"testdb.abc",key:{_id:1}})