MongoDB搭建Replica Set Shard Cluster步驟

    本文記錄從頭搭建一個MongoDB 副本集分片集羣的過程。html

    咱們要建立一個這樣子的分佈式集羣:有兩個shard,每一個shard都是一個replica set,各有兩個副本(實際產品應用中還應加上一個僅用於投票aribiter);有三個config server;有一個mongos。步驟以下(前提:你已經安裝了MongoDB,而且假設你對分佈式系統的通常架構有認識):node

一、replica setmongodb

啓動兩個副本集:架構

replica set A
mkdir -p ./replset_shard1/node1
mkdir -p ./replset_shard1/node2
numactl --interleave=all mongod --port 20001 --dbpath ./replset_shard1/node1 --replSet set_a --oplogSize 1024 --logpath ./replset_shard1/node1/rs20001.log --fork
numactl --interleave=all mongod --port 20002 --dbpath ./replset_shard1/node2 --replSet set_a --oplogSize 1024 --logpath ./replset_shard1/node2/rs20002.log --fork
初始化,進入某個副本執行:
rs.initiate({"_id" : "set_a", "members" : [{_id: 0, host: "xxxhost:20001"}, {_id: 1, host: "xxxhost: 20002"}]})分佈式

replica set B
mkdir -p ./replset_shard2/node1
mkdir -p ./replset_shard2/node2
numactl --interleave=all mongod --port 30001 --dbpath ./replset_shard2/node1 --replSet set_b --oplogSize 1024 --logpath ./replset_shard2/node1/rs30001.log --fork
numactl --interleave=all mongod --port 30002 --dbpath ./replset_shard2/node2 --replSet set_b --oplogSize 1024 --logpath ./replset_shard2/node2/rs30002.log --fork測試

初始化
rs.initiate({"_id" : "set_a", "members" : [{_id: 0, host: "xxxhost:30001"}, {_id: 1, host: "xxxhost: 30002"}]})大數據

注意1:--replSet 指定副本名,一個副本集內的副本名必須同樣,--oplogSize 指定oplog大小(單位MB),若是不指定,默認爲DB所在磁盤空閒空間的5%,且大於1GB,不超過50GBspa

注意2:本例子爲測試使用,實際工做中副本要能抵禦單點故障:多個副本分佈在不一樣機器\機房上。rest

二、config serverserver

mkdir -p ./data/configdb1;mkdir -p ./data/configdb2;mkdir -p ./data/configdb3;

啓動mongo config server:

mongod --configsvr --fork --logpath ./data/configdb1/mongo17019.log --dbpath ./data/configdb1 --port 17019
mongod --configsvr --fork --logpath ./data/configdb2/mongo27019.log --dbpath ./data/configdb2 --port 27019
mongod --configsvr --fork --logpath ./data/configdb3/mongo37019.log --dbpath ./data/configdb3 --port 37019

三、mongos

mkdir -p ./mongosdb

啓動mongos:

mongos --configdb xxxhost:17019,xxxhost:27019,xxxhost:37019 --logpath ./mongosdb/mongos.log --fork --port 8100

啓動mongos時,config server的配置信息不使用localhost、也不使用127.0.0.1,不然添加其它機器的shard會出現錯誤提示:
"can’t use localhost as a shard since all shards need to communicate. either use all shards and configdbs in localhost or all in actual IPs host: xxxxx isLocalHost"

四、replica set 添加到 shard cluster

登錄mongos

test> use admin
switched to db admin
admin> db.runCommand({addShard: "set_a/xxxhost:20001"})
{ "shardAdded" : "set_a", "ok" : 1 }

admin> db.runCommand({addShard: "set_b/xxxhost:30001"})
{ "shardAdded" : "set_b", "ok" : 1 }

查看config.databases:
config> db.databases.find()
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "cswuyg", "partitioned" : false, "primary" : "set_a" }

查看shards:
config> db.shards.find()
{ "_id" : "set_a", "host" : "set_a/xxxhost:20001,xxxhost:20002" }
{ "_id" : "set_b", "host" : "set_b/xxxhost:30001,xxxhost:30002" }

五、對文檔使用shard功能

登錄mongos:

cswuyg> use admin
switched to db admin
admin> db.runCommand({"enablesharding": "cswuyg"})
{ "ok" : 1 }
admin> db.runCommand({"shardcollection": "cswuyg.a", "key": {"_id": 1}})
{ "collectionsharded" : "cswuyg.a", "ok" : 1 }

六、插入數據測試

登錄mongos,進入測試DB,執行測試js代碼:

var a = 10000
for (var i = 0; i < 1000000; ++i){
db.a.save({"b": i})
}
集合自動均衡後(或者手動啓動均衡:sh.startBalancer())chunks的分佈效果:
config> db.chunks.find()
{ "_id" : "cswuyg.a-_id_MinKey", "lastmod" : Timestamp(2, 0), "lastmodEpoch" : ObjectId("54f54f0a59b0d8e1cbf0784e"), "ns" : "cswuyg.a", "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : ObjectId("54f477859a27767875b03801") }, "shard" : "set_b" }
{ "_id" : "cswuyg.a-_id_ObjectId('54f477859a27767875b03801')", "lastmod" : Timestamp(3, 0), "lastmodEpoch" : ObjectId("54f54f0a59b0d8e1cbf0784e"), "ns" : "cswuyg.a", "min" : { "_id" : ObjectId("54f477859a27767875b03801") }, "max" : { "_id" : ObjectId("54f5507a86d364ad1c3f125f") }, "shard" : "set_b" }
{ "_id" : "cswuyg.a-_id_ObjectId('54f5507a86d364ad1c3f125f')", "lastmod" : Timestamp(4, 1), "lastmodEpoch" : ObjectId("54f54f0a59b0d8e1cbf0784e"), "ns" : "cswuyg.a", "min" : { "_id" : ObjectId("54f5507a86d364ad1c3f125f") }, "max" : { "_id" : ObjectId("54f551fe86d364ad1c44a844") }, "shard" : "set_a" }
{ "_id" : "cswuyg.a-_id_ObjectId('54f551fe86d364ad1c44a844')", "lastmod" : Timestamp(3, 2), "lastmodEpoch" : ObjectId("54f54f0a59b0d8e1cbf0784e"), "ns" : "cswuyg.a", "min" : { "_id" : ObjectId("54f551fe86d364ad1c44a844") }, "max" : { "_id" : ObjectId("54f552f086d364ad1c4aee1f") }, "shard" : "set_a" }
{ "_id" : "cswuyg.a-_id_ObjectId('54f552f086d364ad1c4aee1f')", "lastmod" : Timestamp(4, 0), "lastmodEpoch" : ObjectId("54f54f0a59b0d8e1cbf0784e"), "ns" : "cswuyg.a", "min" : { "_id" : ObjectId("54f552f086d364ad1c4aee1f") }, "max" : { "_id" : { "$maxKey" : 1 } }, "shard" : "set_b" }

七、爲副本集set_a添加新的副本

啓動新副本實例
mkdir -p ./replset_shard1/node3
numactl --interleave=all mongod --port 20003 --dbpath ./replset_shard1/node3 --replSet set_a --oplogSize 1024 --logpath ./replset_shard1/node3/rs20003.log --fork
新副本實例加入到副本集
進入到primary實例執行:
test> rs.add("xxxhost:20003")
{ "ok" : 1 }
加入以後的新副本實例須要時間初始化同步數據,大數據量數據初始化過程可能很長,對服務會有較大影響。並且若是同步初始化過程耗時太長時,且致使了oplog空間被寫滿一輪,則又要再次觸發同步初始化,這種狀況下能夠採用其它方式來實現添加副本:拷貝primary實例的磁盤文件到新目錄而後以副本啓動,而後加入到replica set,這樣子就不須要有同步初始化過程。

參考:

附上:刪除副本
cfg = rs.config()
cfg.members.splice(0,2) #刪除從位置0開始的2個成員
rs.reconfig(cfg, {'force':true})
參考:https://docs.mongodb.com/manual/tutorial/remove-replica-set-member/

八、其它

若是要把一個分片集羣轉爲副本集集羣,須要dump出數據,而後restore回去;
若是要把一個分片集羣轉爲副本集分片集羣,參考:
http://docs.mongodb.org/manual/tutorial/convert-standalone-to-replica-set/

若是是多機器的集羣,不要在replica中使用localhost、127.0.0.1,不然致使沒法使用多機器部署。

 

補充:

爲副本添加tag:

var conf = rs.conf()
conf.members[0].tags = { "location": "nj" }
conf.members[1].tags = { "location": "bj"}
conf.members[2].tags = { "location": "hz"  }
conf.members[3].tags = { "location": "gz"  }
rs.reconfig(conf)
 

本文所在:http://www.cnblogs.com/cswuyg/p/4356637.html

相關文章
相關標籤/搜索