下面是在生产环境下部署mongodb sharded replica set集群的步骤:
系统环境配置情况:
3个副本集(replica set),每个副本集由不同的机器上的3个mongod实例组成。
3个sharding。每个shard是一个副本集。
3个配置服务器。每个服务器是在不同的机器上。
1个mongos路由。
集群架构如下,这套步骤在如下Ubuntu服务器上测试成功:
Server 1: 10.31.142.101 Server 2: 10.31.142.102 Server 3: 10.31.142.103
最佳实践:
1.在生产环境下,您必须部署有三个配置服务器实例,并且每一个运行在在不同服务器上,以保证良好的性能和数据的安全性。在测试环境中,可以运行在一台服务器配置所有三个实例。
2.一个shard可以是一个独立的mongod或副本集。在生产环境中,每个碎片应该是一个副本集。
3.副本集应该保证有奇数个成员,这将确保选举能顺利进行。每个成员实例应该放在不同的服务器上。在生产环境中,三个成员实例可以保证数据的安全性。
4.这套mongos是轻量级的,不需要数据目录。可以在上面运行其它集群组件,诸如运行应用服务或跑mongod进程。
好吧,我们现在开始:
1. 创建replica set 1
在每台服务器上执行如下操作:
$ sudo mkdir -p /data $ sudo chown `id -u` /data $ mkdir /data/db1 $ nohup mongod --shardsvr --dbpath /data/db1 --port 10001 --replSet myset1 > /tmp/shard1.log &
说明:
nohup命令让mongod后台运行。
`shardsvr`选项配置此mongod实例作为一个分区集群shard。
`DBPATH的<path>`选项指定数据存储到文件夹/data/db1。
`<PORT>`选项指定实例侦听端口10001。
`replSet<setname>`选项指定副本集的名称。在副本集中的所有主机必须具有相同的一组名称。该组的名字是我的设定是1。
日志数据写入到/tmp/shard1.log.You可以使用cat /tmp/shard1.log来查看日志。
执行MogoDB 命令创建replica set。
$ mongo localhost:10001/admin config = {_id: 'myset1', members: [ {_id: 0, host: '10.31.142.101:10001'}, {_id: 1, host: '10.31.142.102:10001'}, {_id: 2, host: '10.31.142.103:10001'}] }
说明:
congfig对象定义了replica set的成员
id 对应了replSet
rs.initiate(config) 初始化replica set
rs.status()返回replica set的状态
注意,这些命令必须在所有三台机器上都执行一遍,不仅仅是在server1上。
启动三个config server
在所有服务器上执行如下命令:
$ mkdir /data/config $ nohup mongod --configsvr --dbpath /data/config --port 20000 > /tmp/config.log &
启动mongos query路由
在server1上执行:
$ nohup mongos --configdb 10.31.142.101:20000,10.31.142.102:20000,10.31.142.103:20000 --port 30000 > /tmp/mongos.log &
创建shard 1
在server1上执行:
$ mongo localhost:30000/admin mongos> db.runCommand({addshard : "myset1/10.31.142.101:10001,10.31.142.102:10001,10.31.142.103:10001"}) { "shardAdded" : "myset1", "ok" : 1 }
开启sharding collection
在server1上执行:
$ mongo localhost:30000/admin mongos> use admin mongos> db.runCommand( { enablesharding : "test" } ); mongos> db.runCommand( { shardcollection : "test.data" , key : { name : 1 } } )
可以执行下面的命令列出shard的状态:
mongos> db.runCommand( {listshards : 1} )
创建replica set 2
在所有节点上执行:
$ mkdir /data/db2 $ nohup mongod --shardsvr --dbpath /data/db2 --port 10002 --replSet myset2 > /tmp/shard2.log &
在Server1上执行如下MongoDB shell,并且执行命令创建replica set
$ mongo localhost:10002/admin config = {_id: 'myset2', members: [ {_id: 0, host: '10.31.142.101:10002'}, {_id: 1, host: '10.31.142.102:10002'}, {_id: 2, host: '10.31.142.103:10002'}] } rs.initiate(config) rs.status()
创建shard 2
在server 1 上执行:
$ mongo localhost:30000/admin mongos> db.runCommand({addshard : "myset2/10.31.142.101:10002,10.31.142.102:10002,10.31.142.103:10002"}) { "shardAdded" : "myset2", "ok" : 1 }
创建replica set 3
在所有节点上执行:
$ mkdir /data/db3 $ nohup mongod --shardsvr --dbpath /data/db3 --port 10003 --replSet myset3> /tmp/shard3.log &
在Server1上执行如下MongoDB shell,并且执行命令创建replica set
$ mongo localhost:10003/admin config = {_id: 'myset3', members: [ {_id: 0, host: '10.31.142.101:10003'}, {_id: 1, host: '10.31.142.102:10003'}, {_id: 2, host: '10.31.142.103:10003'}] } rs.initiate(config) rs.status()
创建shard 3
在server 1 上执行:
$ mongo localhost:30000/admin mongos> db.runCommand({addshard : "myset3/10.31.142.101:10003,10.31.142.102:10003,10.31.142.103:10003"}) { "shardAdded" : "myset3", "ok" : 1 }
现在sharding 状态:
server1上执行
$ mongo localhost:30000/admin mongos> db.runCommand( {listshards : 1} ) mongos> db.printShardingStatus()
在query router上保存和查询数据
router是管理集群上存储数据的实例,客户端连接mongos而不是链接mongod实例。
server1上执行如下:
$ mongo localhost:30000/test mongos> db.data.insert({"name":"jeffrey"}) mongos> db.data.find()
启动另一个query router
server1上执行:
$ nohup mongos --configdb 10.31.142.101:20000,10.31.142.102:20000,10.31.142.103:20000 --port 30001 > /tmp/mongos1.log &
原作者:jeffreysun http://www.sunzhongkui.me
参考文档:
[1] mongod command options
http://docs.mongodb.org/manual/reference/program/mongod/
[2] mongos command options
http://docs.mongodb.org/manual/reference/program/mongos/