準備四臺機器,分別是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/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>