(案例2)副本集+分片部署

準備四臺機器,分別是bluejoe1,bluejoe2,bluejoe3,以及bluejoe0

副本集及分片策略確定如下:

  • 將創建3個副本集,命名爲shard1,shard2,shard3;
  • 以上3個副本集作爲3個分片;
  • 每個副本集包含3個副本(主、輔1、輔2);
  • 副本分開存儲,即shard1存在bluejoe1、bluejoe2、bluejoe3上各一份。。。以此類推
  • 將創建3個配置庫實例,一臺機器一個
  • bluejoe0上配置一個mongos(mongos一般可以配置在應用端)
畫了一個圖:

具體操作步驟如下:
  1. 在bluejoe1上下載mongdb安裝包;
  2. 解壓至/usr/local/mongdb(注意改名);
  3. 創建data/db1,db2,db3目錄,啓動3個mongod實例,注意replSet的名字:
    [java] view plain copy
     print?在CODE上查看代碼片派生到我的代碼片
    1. mkdir /usr/local/mongodb/data/db1 /usr/local/mongodb/data/db2 /usr/local/mongodb/data/db3  
    2. nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db1 --port 10001 --replSet db1 --logpath=/usr/local/mongodb/log/db1.log &  
    3. nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db2 --port 10002 --replSet db2 --logpath=/usr/local/mongodb/log/db2.log &  
    4. nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db3 --port 10003 --replSet db3 --logpath=/usr/local/mongodb/log/db3.log &  

  4. 使用scp命令,將mongodb目錄複製至bluejoe2和bluejoe3機器,並按照第3步啓動每臺機器上的3個實例;
  5. 初始化副本:
    [java] view plain copy
     print?在CODE上查看代碼片派生到我的代碼片
    1. mongo bluejoe1:10001  
    2.   
    3.     use admin  
    4.       
    5.     db.runCommand(  
    6.     {  
    7.         "replSetInitiate":  
    8.         {  
    9.             "_id":"db1",  
    10.             "members":  
    11.             [  
    12.                 {  
    13.                     "_id":1,  
    14.                     "host":"bluejoe1:10001"  
    15.                 },  
    16.                 {  
    17.                     "_id":2,  
    18.                     "host":"bluejoe2:10001"  
    19.                 },  
    20.                 {  
    21.                     "_id":3,  
    22.                     "host":"bluejoe3:10001"  
    23.                 }  
    24.             ]  
    25.         }  
    26.     })  
    27.       
    28.   
    29. mongo bluejoe1:10002  
    30.   
    31.     use admin  
    32.       
    33.     db.runCommand(  
    34.     {  
    35.         "replSetInitiate":  
    36.         {  
    37.             "_id":"db2",  
    38.             "members":  
    39.             [  
    40.                 {  
    41.                     "_id":1,  
    42.                     "host":"bluejoe1:10002"  
    43.                 },  
    44.                 {  
    45.                     "_id":2,  
    46.                     "host":"bluejoe2:10002"  
    47.                 },  
    48.                 {  
    49.                     "_id":3,  
    50.                     "host":"bluejoe3:10002"  
    51.                 }  
    52.             ]  
    53.         }  
    54.     })  
    55.       
    56. mongo bluejoe1:10003  
    57.   
    58.     use admin  
    59.       
    60.     db.runCommand(  
    61.     {  
    62.         "replSetInitiate":  
    63.         {  
    64.             "_id":"db3",  
    65.             "members":  
    66.             [  
    67.                 {  
    68.                     "_id":1,  
    69.                     "host":"bluejoe1:10003"  
    70.                 },  
    71.                 {  
    72.                     "_id":2,  
    73.                     "host":"bluejoe2:10003"  
    74.                 },  
    75.                 {  
    76.                     "_id":3,  
    77.                     "host":"bluejoe3:10003"  
    78.                 }  
    79.             ]  
    80.         }  
    81.     })  

  6. 觀察副本集的實時複製特性
    1. 連接上bluejoe1:10001,看到db1:PRIMARY>的字樣,說明它是db1的主節點
    2. 創建一張新表,創建幾條測試記錄
    3. 連接上bluejoe3:10002,看到shard1:SECONDARY>的字樣,說明它是shard1的輔助節點
    4. 注意此時無法查詢前面新增的記錄,會報錯not master and slaveOk=false
    5. 回到bluejoe1:10001,設置slaveOk
      [html] view plain copy
       print?在CODE上查看代碼片派生到我的代碼片
      1. db.getMongo().setSlaveOk()  
    6. 再回到bluejoe3:10002,即可看到主節點寫入的記錄
觀察副本集的故障轉移特性
  1. 殺掉bluejoe1:10001的進程
  2. 再次連接上bluejoe3:10002,看到shard1:PRIMARY>的字樣,說明它已經變成shard1的主節點
  3. 如果這時再啓動bluejoe1:10001,則發現它已經變成shard1:SECONDARY>
創建data/configdb,啓動配置庫實例:
[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. mkdir /usr/local/mongodb/data/configdb  
  2. nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/configdb --port 20000 --logpath=/usr/local/mongodb/log/configdb.log &  

如果需要關閉mongod服務,可使用--shutdown選項,如:
[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/configdb --shutdown  

到現在爲止應該有12個mongd實例,其中3個爲配置庫實例,剩下的屬於3個副本集;接下來管理分片,在bluejoe0上啓動mongs:

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. nohup /usr/local/mongodb/bin/mongos --port 30000 --configdb bluejoe1:20000,bluejoe2:20000,bluejoe3:20000 &  
連接上mongos,配置分片信息:
[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. mongo bluejoe0:30000  
  2.   
  3. mongos> use admin  
  4. switched to db admin  
  5.       
  6. db.runCommand({"addShard":"db1/bluejoe1:10001"})  
  7. db.runCommand({"addShard":"db2/bluejoe1:10002"})  
  8. db.runCommand({"addShard":"db3/bluejoe1:10003"})  
查看分片情況:
[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. mongos>  db.runCommand({listshards:1})  
  2. {  
  3. <span style="white-space:pre">  </span>"shards" : [  
  4. <span style="white-space:pre">      </span>{  
  5. <span style="white-space:pre">          </span>"_id" : "db1",  
  6. <span style="white-space:pre">          </span>"host" : "db1/bluejoe1:10001,bluejoe2:10001,bluejoe3:10001"  
  7. <span style="white-space:pre">      </span>},  
  8. <span style="white-space:pre">      </span>{  
  9. <span style="white-space:pre">          </span>"_id" : "db2",  
  10. <span style="white-space:pre">          </span>"host" : "db2/bluejoe1:10002,bluejoe2:10002,bluejoe3:10002"  
  11. <span style="white-space:pre">      </span>},  
  12. <span style="white-space:pre">      </span>{  
  13. <span style="white-space:pre">          </span>"_id" : "db3",  
  14. <span style="white-space:pre">          </span>"host" : "db3/bluejoe1:10003,bluejoe2:10003,bluejoe3:10003"  
  15. <span style="white-space:pre">      </span>}  
  16. <span style="white-space:pre">  </span>],  
  17. <span style="white-space:pre">  </span>"ok" : 1  
  18. }  
可以看出,儘管註冊的時候只是提供了副本集的主節點,但mongos已知曉了各輔助節點;

對某個庫開啓分片功能:
[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. mongos> db.runCommand({"enablesharding":"test"})  
  2. { "ok" : 1 }  
  3. mongos> db.runCommand({"shardcollection":"test.person","key":{_id:'hashed'}})  
  4. { "collectionsharded" : "test.person", "ok" : 1 }  
插入測試數據:
[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. mongos> for(var i=0;i<10;i++){db.person.insert({name:"bluejoe"+i});}  
  2. WriteResult({ "nInserted" : 1 })  
查看數據分片存儲情況:
[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. [root@hadoop0 ~]# mongo bluejoe3:10002  
  2. MongoDB shell version: 2.6.5  
  3. connecting to: bluejoe3:10002/test  
  4. shard1:PRIMARY> db.person.find()  
  5. { "_id" : ObjectId("546ff1013a0d0ec68b42a914"), "name" : "bluejoe0" }  
  6. { "_id" : ObjectId("546ff1013a0d0ec68b42a915"), "name" : "bluejoe1" }  
  7. { "_id" : ObjectId("546ff1013a0d0ec68b42a91a"), "name" : "bluejoe6" }  
  8. { "_id" : ObjectId("546ff1013a0d0ec68b42a91b"), "name" : "bluejoe7" }  
  9. { "_id" : ObjectId("546ff1013a0d0ec68b42a91c"), "name" : "bluejoe8" }  
  10. shard1:PRIMARY> exit  
  11. bye  
  12. [root@hadoop0 ~]# mongo bluejoe2:10001  
  13. MongoDB shell version: 2.6.5  
  14. connecting to: bluejoe2:10001/test  
  15. shard2:PRIMARY> db.person.find()  
  16. { "_id" : ObjectId("546ff1013a0d0ec68b42a918"), "name" : "bluejoe4" }  
  17. shard2:PRIMARY> exit  
  18. bye  
  19. [root@hadoop0 ~]# mongo bluejoe3:10001  
  20. MongoDB shell version: 2.6.5  
  21. connecting to: bluejoe3:10001/test  
  22. shard3:PRIMARY> db.person.find()  
  23. { "_id" : ObjectId("546ff1013a0d0ec68b42a916"), "name" : "bluejoe2" }  
  24. { "_id" : ObjectId("546ff1013a0d0ec68b42a917"), "name" : "bluejoe3" }  
  25. { "_id" : ObjectId("546ff1013a0d0ec68b42a919"), "name" : "bluejoe5" }  
  26. { "_id" : ObjectId("546ff1013a0d0ec68b42a91d"), "name" : "bluejoe9" }  
  27. shard3:PRIMARY>   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章