wKiom1Y6B0_Dw6WaAAFNY7nY7CI980.jpg

8台机器,4个分片及其各自之间的角色分配:

wKioL1Y6B47QK48aAAJNby2Synk073.jpg

注意:上表中颜色相同的代表在同一台服务器上,其实也可以每个成员单放一台机器,但是比如像arbiter(仲裁节点),configserver(配置服务器),mongos(路由)本身消耗资源不是很大,可以复用,但是一台服务器最好只运行一个mongod。所以我们采用的一台服务器只运行了一个mongod12个其他组成员,注意,一台服务器上不要运行同一组的多个成员,这样就起不到冗余的作用了。


//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上也写入了少量数据,比较奇怪,于是在shard1mongosniff --source NET eth0 --port 27040来抓取query,看看写入Recsys1库的query来自于哪里,于是发现是来自于一个mongos,其他的mongos均正常,这台mongos直接use Recsys1就进入的是shard1,但是执行db.printShardingStatus()没发现异常,怀疑是bug,结果关闭了这台mongos服务,解决问题。