轉載自:http://blog.csdn.net/bluejoe2000/article/details/41323051
完整的搭建mongodb集羣(副本集+分片)的例子。。。html
準備四臺機器,分別是bluejoe1,bluejoe2,bluejoe3,以及bluejoe0java
副本集及分片策略肯定以下:mongodb
- 將建立3個副本集,命名爲shard1,shard2,shard3;
- 以上3個副本集做爲3個分片;
- 每一個副本集包含3個副本(主、輔一、輔2);
- 副本分開存儲,即shard1存在bluejoe一、bluejoe二、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/db3
- nohup /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:10001
-
- use admin
-
- db.runCommand(
- {
- "replSetInitiate":
- {
- "_id":"db1",
- "members":
- [
- {
- "_id":1,
- "host":"bluejoe1:10001"
- },
- {
- "_id":2,
- "host":"bluejoe2:10001"
- },
- {
- "_id":3,
- "host":"bluejoe3:10001"
- }
- ]
- }
- })
-
-
- mongo bluejoe1:10002
-
- use admin
-
- db.runCommand(
- {
- "replSetInitiate":
- {
- "_id":"db2",
- "members":
- [
- {
- "_id":1,
- "host":"bluejoe1:10002"
- },
- {
- "_id":2,
- "host":"bluejoe2:10002"
- },
- {
- "_id":3,
- "host":"bluejoe3:10002"
- }
- ]
- }
- })
-
- mongo bluejoe1:10003
-
- use admin
-
- db.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/configdb
- nohup /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:30000
-
- mongos> use admin
- switched to db admin
-
- db.runCommand({"addShard":"db1/bluejoe1:10001"})
- db.runCommand({"addShard":"db2/bluejoe1:10002"})
- db.runCommand({"addShard":"db3/bluejoe1:10003"})
- 查看分片狀況:
- mongos> db.runCommand({listshards:1})
- {
- <span style="white-space:pre"> </span>"shards" : [
- <span style="white-space:pre"> </span>{
- <span style="white-space:pre"> </span>"_id" : "db1",
- <span style="white-space:pre"> </span>"host" : "db1/bluejoe1:10001,bluejoe2:10001,bluejoe3:10001"
- <span style="white-space:pre"> </span>},
- <span style="white-space:pre"> </span>{
- <span style="white-space:pre"> </span>"_id" : "db2",
- <span style="white-space:pre"> </span>"host" : "db2/bluejoe1:10002,bluejoe2:10002,bluejoe3:10002"
- <span style="white-space:pre"> </span>},
- <span style="white-space:pre"> </span>{
- <span style="white-space:pre"> </span>"_id" : "db3",
- <span style="white-space:pre"> </span>"host" : "db3/bluejoe1:10003,bluejoe2:10003,bluejoe3:10003"
- <span style="white-space:pre"> </span>}
- <span style="white-space:pre"> </span>],
- <span style="white-space:pre"> </span>"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 })
- 查看數據分片存儲狀況:
- [root@hadoop0 ~]# mongo bluejoe3:10002
- MongoDB shell version: 2.6.5
- connecting to: bluejoe3:10002/test
- shard1: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> exit
- bye
- [root@hadoop0 ~]# mongo bluejoe2:10001
- MongoDB shell version: 2.6.5
- connecting to: bluejoe2:10001/test
- shard2:PRIMARY> db.person.find()
- { "_id" : ObjectId("546ff1013a0d0ec68b42a918"), "name" : "bluejoe4" }
- shard2:PRIMARY> exit
- bye
- [root@hadoop0 ~]# mongo bluejoe3:10001
- MongoDB shell version: 2.6.5
- connecting to: bluejoe3:10001/test
- shard3: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>