8台机器,4个分片及其各自之间的角色分配:
注意:上表中颜色相同的代表在同一台服务器上,其实也可以每个成员单放一台机器,但是比如像arbiter(仲裁节点),configserver(配置服务器),mongos(路由)本身消耗资源不是很大,可以复用,但是一台服务器最好只运行一个mongod。所以我们采用的一台服务器只运行了一个mongod和1至2个其他组成员,注意,一台服务器上不要运行同一组的多个成员,这样就起不到冗余的作用了。
//shard1
10.10.6.48 10.10.6.46
sudo mkdir -p /var/soft/data/shard1
sudo mkdir -p /var/soft/log
sudo /var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard1 --bind_ip0.0.0.0 --port 27040 --dbpath /var/soft/data/shard1/ -logpath/var/soft/log/shard1.log --logappend --nojournal --oplogSize=4096 --fork--noprealloc
10.10.6.90
sudo mkdir -p /var/soft/data/arbiter1/
sudo mkdir -p /var/soft/log
/var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard1--bind_ip 0.0.0.0 --port 27000 --dbpath /var/soft/data/arbiter1/ -logpath /var/soft/log/arbiter1.log--logappend --nojournal --oplogSize=4096 --fork
在10.10.6.46上执行
config = {_id: 'shard1', members: [{_id: 0, host:'mongodb46:27040'}, {_id: 1, host: 'mongodb48:27040'},{_id: 2, host:'mongodb90:27000', arbiterOnly: true}]}
rs.initiate(config);
//shard2
10.10.6.90 10.10.6.91
sudo mkdir -p /var/soft/data/shard2
sudo mkdir -p /var/soft/log
sudo /var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard2 --bind_ip0.0.0.0 --port 27050 --dbpath /var/soft/data/shard2/ -logpath /var/soft/log/shard2.log--logappend --nojournal --oplogSize=4096 --fork --noprealloc
10.10.6.92
sudo mkdir -p /var/soft/data/arbiter2/
sudo mkdir -p /var/soft/log
/var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard2--bind_ip 0.0.0.0 --port 27000 --dbpath /var/soft/data/arbiter2/ -logpath/var/soft/log/arbiter2.log --logappend --nojournal --oplogSize=4096 --fork
在10.10.6.91 上执行
config = {_id: 'shard2', members: [{_id: 0, host:'mongodb90:27050'}, {_id: 1, host: 'mongodb91:27050'},{_id: 2, host:'mongodb92:27000', arbiterOnly: true}]}
rs.initiate(config);
//shard3
10.10.6.92 10.10.6.93
sudo mkdir -p /var/soft/data/shard3
sudo mkdir -p /var/soft/log
sudo /var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard3 --bind_ip0.0.0.0 --port 27060 --dbpath /var/soft/data/shard3/ -logpath/var/soft/log/shard3.log --logappend --nojournal --oplogSize=4096 --fork--noprealloc
10.10.6.94
sudo mkdir -p /var/soft/data/arbiter3/
sudo mkdir -p /var/soft/log
/var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard3--bind_ip 0.0.0.0 --port 27000 --dbpath /var/soft/data/arbiter3/ -logpath/var/soft/log/arbiter3.log --logappend --nojournal --oplogSize=4096 --fork
在10.10.6.93 上执行
config = {_id: 'shard3', members: [{_id: 0, host:'mongodb92:27060'}, {_id: 1, host: 'mongodb93:27060'},{_id: 2, host:'mongodb94:27000', arbiterOnly: true}]}
rs.initiate(config);
//shard4
10.10.6.94 10.10.6.95
sudo mkdir -p /var/soft/data/shard4
sudo mkdir -p /var/soft/log
sudo /var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard4 --bind_ip0.0.0.0 --port 27070 --dbpath /var/soft/data/shard4/ -logpath/var/soft/log/shard4.log --logappend --nojournal --oplogSize=4096 --fork--noprealloc
10.10.6.46
sudo mkdir -p /var/soft/data/arbiter4/
sudo mkdir -p /var/soft/log
/var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard4--bind_ip 0.0.0.0 --port 27000 --dbpath /var/soft/data/arbiter4/ -logpath/var/soft/log/arbiter4.log --logappend --nojournal --oplogSize=4096 --fork
在10.10.6.95上执行
config = {_id: 'shard4', members: [{_id: 0, host:'mongodb94:27070'}, {_id: 1, host: 'mongodb95:27070'},{_id: 2, host:'mongodb46:27000', arbiterOnly: true}]}
rs.initiate(config);
//配置configserver:
在10.10.6.4810.10.6.93 10.10.6.95
sudo mkdir -p /var/soft/data/config
sudo mkdir -p /var/soft/log/config
/var/soft/mongodb2.2/bin/mongod --bind_ip 0.0.0.0 --fork --configsvr--port 20000 --dbpath /var/soft/data/config --logpath/var/soft/log/config/config.log --logappend
// 添加mongos
sudo mkdir -p /var/soft/log/mongos
10.10.6.90:
/var/soft/mongodb2.2/bin/mongos --port 30000 --configdb mongodb48:20000,mongodb93:20000,mongodb95:20000--logpath /var/soft/log/mongos/mongos.log --logappend --fork
10.10.6.48:
/var/soft/mongodb2.2/bin/mongos --port 30000 --configdb mongodb48:20000,mongodb93:20000,mongodb95:20000--logpath /var/soft/log/mongos/mongos.log --logappend --fork
10.10.6.92:
/var/soft/mongodb2.2/bin/mongos --port 30000 --configdb mongodb48:20000,mongodb93:20000,mongodb95:20000--logpath /var/soft/log/mongos/mongos.log --logappend --fork
在 10.10.6.90
/var/soft/mongodb2.2/bin/mongo --port 30000
db.runCommand({addshard :"shard1/mongodb46:27040,mongodb48:27040",name:"shard1",maxsize:504800});
db.runCommand({addshard :"shard2/mongodb90:27050,mongodb91:27050",name:"shard2",maxsize:504800});
db.runCommand({addshard :"shard3/mongodb92:27060,mongodb93:27060",name:"shard3",maxsize:504800});
db.runCommand({addshard :"shard4/mongodb94:27070,mongodb95:27070",name:"shard4",maxsize:504800});
>db.runCommand( { listshards : 1 } )
如果列出了以上二个你加的shards,表示shards已经配置成功
db.printShardingStatus();
按研发人员要求建立shard:
/var/soft/mongodb2.2/bin/mongos --port 30000 --configdbmongodb48:20000,mongodb93:20000,mongodb95:20000 --logpath/var/soft/log/mongos/mongos.log --logappend --fork
db.runCommand( { movePrimary: "recsys0", to:"shard1" })
db.runCommand( { movePrimary: "recsys1", to:"shard2" })
db.runCommand( { movePrimary: "recsys2", to: "shard3"})
db.runCommand( { movePrimary: "recsys3", to:"shard4" })
分片设置:
由于我们使用的手动分片,不是auto-sharding,所以也不需要执行类似db.runCommand({enablesharding:库名})这样的命令。我们只是在4个不同的shard上建立4个库。至于读写操作会对应哪个库,由程序来判断。
那么建库的时候要登陆mongos来建,建好一个库,mongos来自动给你分配是建立在哪个shard上,但是如果你对自动分配的shard不满意可以运行命令来把它移动到别的shard上。
例如:我在mongos上建立了一个库叫recsys0库。运行db.printShardingStatus()命令我们可以看到这个recsys0是建到了哪个shard,如果建到了shard4,你觉得不满意,你想改到shard1,那么可以运行命令,db.runCommand({ movePrimary: "recsys0", to: "shard1" }),这个库就会从shard4挪到shard1上。可通过db.printShardingStatus()再次检查。
维护方面:
每个分片是一个replica set复制集,所以问题的处理与之前的replica set篇相同。
出现过的问题:
Recsys1库明明配置的是在shard2上,但是shard1上也写入了少量数据,比较奇怪,于是在shard1用mongosniff --source NET eth0 --port 27040来抓取query,看看写入Recsys1库的query来自于哪里,于是发现是来自于一个mongos,其他的mongos均正常,这台mongos直接use Recsys1就进入的是shard1,但是执行db.printShardingStatus()没发现异常,怀疑是bug,结果关闭了这台mongos服务,解决问题。