標籤:root prim ble 檔案夾 進程 switch comm 串連 person
完整的搭建mongodb叢集(複本集+分區)的範例。。。
準備四台機器,各自是bluejoe1,bluejoe2,bluejoe3,以及bluejoe0
複本集及分區策略確定例如以下:
- 將建立3個複本集,命名為shard1,shard2,shard3;
- 以上3個複本集作為3個分區;
- 每一個複本集包括3個副本(主、輔1、輔2);
- 副本分開儲存,即shard1存在bluejoe1、bluejoe2、bluejoe3上各一份。。。
以此類推
- 將建立3個配置庫執行個體,一台機器一個
- bluejoe0上配置一個mongos(mongos一般能夠配置在應用端)
畫了一個圖:
詳細操作過程例如以下:
- 在bluejoe1上下載mongdb安裝包。
- 解壓至/usr/local/mongdb(注意改名)。
- 建立data/db1,db2,db3檔案夾,啟動3個mongod執行個體,注意replSet的名字:
mkdir /usr/local/mongodb/data/db1 /usr/local/mongodb/data/db2 /usr/local/mongodb/data/db3nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db1 --port 10001 --replSet db1 --logpath=/usr/local/mongodb/log/db1.log &nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db2 --port 10002 --replSet db2 --logpath=/usr/local/mongodb/log/db2.log &nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db3 --port 10003 --replSet db3 --logpath=/usr/local/mongodb/log/db3.log &
- 使用scp命令。將mongodb檔案夾複製至bluejoe2和bluejoe3機器,並依照第3步啟動每台機器上的3個執行個體;
- 初始化副本:
mongo bluejoe1:10001use admindb.runCommand({"replSetInitiate":{"_id":"db1","members":[{"_id":1,"host":"bluejoe1:10001"},{"_id":2,"host":"bluejoe2:10001"},{"_id":3,"host":"bluejoe3:10001"}]}})mongo bluejoe1:10002use admindb.runCommand({"replSetInitiate":{"_id":"db2","members":[{"_id":1,"host":"bluejoe1:10002"},{"_id":2,"host":"bluejoe2:10002"},{"_id":3,"host":"bluejoe3:10002"}]}})mongo bluejoe1:10003use admindb.runCommand({"replSetInitiate":{"_id":"db3","members":[{"_id":1,"host":"bluejoe1:10003"},{"_id":2,"host":"bluejoe2:10003"},{"_id":3,"host":"bluejoe3:10003"}]}})
- 觀察複本集的即時複製特性
- 串連上bluejoe1:10001。看到db1:PRIMARY>的字樣,說明它是db1的主節點
- 建立一張新表。建立幾條測試記錄
- 串連上bluejoe3:10002。看到shard1:SECONDARY>的字樣,說明它是shard1的輔助節點
- 注意此時無法查詢前面新增的記錄,會報錯not master and slaveOk=false
- 回到bluejoe1:10001,設定slaveOk
db.getMongo().setSlaveOk()
- 再回到bluejoe3:10002,就可以看到主節點寫入的記錄
觀察複本集的容錯移轉特性
- 殺掉bluejoe1:10001的進程
- 再次串連上bluejoe3:10002。看到shard1:PRIMARY>的字樣,說明它已經變成shard1的主節點
- 假設這時再啟動bluejoe1:10001,則發現它已經變成shard1:SECONDARY>
建立data/configdb。啟動配置庫執行個體:
mkdir /usr/local/mongodb/data/configdbnohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/configdb --port 20000 --logpath=/usr/local/mongodb/log/configdb.log &
假設須要關閉mongod服務,可使用--shutdown選項。如:
/usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/configdb --shutdown
到如今為止應該有12個mongd執行個體。當中3個為配置庫執行個體,剩下的屬於3個複本集。
接下來管理分區,在bluejoe0上啟動mongs:
nohup /usr/local/mongodb/bin/mongos --port 30000 --configdb bluejoe1:20000,bluejoe2:20000,bluejoe3:20000 &
串連上mongos,配置分區資訊:
mongo bluejoe0:30000mongos> use adminswitched to db admindb.runCommand({"addShard":"db1/bluejoe1:10001"})db.runCommand({"addShard":"db2/bluejoe1:10002"})db.runCommand({"addShard":"db3/bluejoe1:10003"})
查看分區情況:
mongos> db.runCommand({listshards:1}){"shards" : [{"_id" : "db1","host" : "db1/bluejoe1:10001,bluejoe2:10001,bluejoe3:10001"},{"_id" : "db2","host" : "db2/bluejoe1:10002,bluejoe2:10002,bluejoe3:10002"},{"_id" : "db3","host" : "db3/bluejoe1:10003,bluejoe2:10003,bluejoe3:10003"}],"ok" : 1}能夠看出,雖然注冊的時候僅僅是提供了複本集的主節點,但mongos已知曉了各輔助節點;
對某個庫開啟分區功能:
mongos> db.runCommand({"enablesharding":"test"}){ "ok" : 1 }mongos> db.runCommand({"shardcollection":"test.person","key":{_id:‘hashed‘}}){ "collectionsharded" : "test.person", "ok" : 1 }
插入測試資料:
mongos> for(var i=0;i<10;i++){db.person.insert({name:"bluejoe"+i});}WriteResult({ "nInserted" : 1 })
查看資料分區儲存情況:
[[email protected] ~]# mongo bluejoe3:10002MongoDB shell version: 2.6.5connecting to: bluejoe3:10002/testshard1:PRIMARY> db.person.find(){ "_id" : ObjectId("546ff1013a0d0ec68b42a914"), "name" : "bluejoe0" }{ "_id" : ObjectId("546ff1013a0d0ec68b42a915"), "name" : "bluejoe1" }{ "_id" : ObjectId("546ff1013a0d0ec68b42a91a"), "name" : "bluejoe6" }{ "_id" : ObjectId("546ff1013a0d0ec68b42a91b"), "name" : "bluejoe7" }{ "_id" : ObjectId("546ff1013a0d0ec68b42a91c"), "name" : "bluejoe8" }shard1:PRIMARY> exitbye[[email protected] ~]# mongo bluejoe2:10001MongoDB shell version: 2.6.5connecting to: bluejoe2:10001/testshard2:PRIMARY> db.person.find(){ "_id" : ObjectId("546ff1013a0d0ec68b42a918"), "name" : "bluejoe4" }shard2:PRIMARY> exitbye[[email protected] ~]# mongo bluejoe3:10001MongoDB shell version: 2.6.5connecting to: bluejoe3:10001/testshard3:PRIMARY> db.person.find(){ "_id" : ObjectId("546ff1013a0d0ec68b42a916"), "name" : "bluejoe2" }{ "_id" : ObjectId("546ff1013a0d0ec68b42a917"), "name" : "bluejoe3" }{ "_id" : ObjectId("546ff1013a0d0ec68b42a919"), "name" : "bluejoe5" }{ "_id" : ObjectId("546ff1013a0d0ec68b42a91d"), "name" : "bluejoe9" }shard3:PRIMARY>
搭建mongodb叢集(複本集+分區)