標籤:mongodb sharding
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/75/7C/wKiom1Y6B0_Dw6WaAAFNY7nY7CI980.jpg" style="float:none;" title="1.png.jpg" alt="wKiom1Y6B0_Dw6WaAAFNY7nY7CI980.jpg" />
8台機器,4個分區及其各自之間的角色指派:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/75/7A/wKioL1Y6B47QK48aAAJNby2Synk073.jpg" style="float:none;" title="2.png" alt="wKioL1Y6B47QK48aAAJNby2Synk073.jpg" />
注意:上表中顏色相同的代表在同一台伺服器上,其實也可以每個成員單放一台機器,但是比如像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服務,解決問題。
本文出自 “zhangdh開放空間” 部落格,請務必保留此出處http://linuxblind.blog.51cto.com/7616603/1709791
Mongodb sharding模式篇