2012-09-18 122 views
1

我一直在蒙戈工作了幾個星期,並在開發建設我的環境。我從一個節點開始,然後移動到一個分片集羣,現在想要移動到一個複製的分片集羣。從我讀一個複製碎片集羣是最好的最好的,可擴展性,耐用性,性能提升等轉換一個碎片集羣的複製碎片集羣

我讀過最在他們的幫助下(非常好)教程。看起來他們的課程建議從單個節點到複製集,再到分片複製集,不幸的是我做到了。我似乎無法找到將分片羣集升級到複製分片羣集的任何內容。

這裏有5臺主機,我有:

  • APPSERVER
  • CONFIGSERVER
  • SHARD1
  • SHARD2
  • SHARD3

我開始每個碎片服務器有:

mongod --shardsvr 

然後,我開始在配置服務器:

mongod --configsvr 

然後,我開始了mongos進程的APPSERVER有:

mongos --configdb CONFIGSERVER 

然後在mongos,我加了分片,使分片上我的數據庫,並定義了一個集合的shardkey:

sh.addShard("SHARD1:27018");//again for 2 and 3 
sh.enableSharding("beacon"); 
sh.shardCollection("beacon.alpha2", {"ip":1}); 

我想每個碎片都在其他兩個碎片上覆制。 (是嗎?)我需要打倒的mongod進程的碎片,並用不同的CL參數重新啓動呢?我需要在我的mongos shell中發出什麼命令來讓它複製?我是否應該導出所有數據,將所有內容全部刪除,重新啓動並重新導入?同樣,我看到了很多關於如何創建一個副本集教程,但我實在不明白如何做給分片系統開始與一個副本集東西。

謝謝!

回答

3

對於每個分片,您需要重新啓動當前成員,並使用--replset命令行選項啓動它和兩個新成員(或1個新成員和仲裁器)。你可以添加更多的成員,但是3是最低可行集合。然後從裏面是什麼將成爲新的主(當前的SHARD1爲例),你可以做到以下幾點:

rs.add("newmember1:port") 
rs.add("newmember2:port") 
rs.initiate(); 

你會那麼需要檢查並確保該sh.status()已更新,以反映新成員副本集。在2.2這已成爲稍微容易因爲它應該是自動的,以前的版本,有必要手動保存在配置數據庫中,這被反射分片組下的文檔中的碎片信息。如果已經自動添加,你會看到副本集列表中sh.status()輸出,類似於以下內容:

{ "_id" : "shard1", "host" : "shard1/SHARD1:port,newmember1:port,newmember2:port" } 

如果這不會自動發生,你將需要按照上面的文檔鏈接中列出的程序,即從內部mongos

db.getSiblingDB("config").shards.save({_id:"<name>", host:"<rsName>/member1,member2,..."}) 

按照上面的示例會像:

db.getSiblingDB("config").shards.save({_id:"SHARD1", host:"shard1/SHARD1:port,newmember1:port,newmember2:port"}) 

您需要爲每個分片執行此過程,並且您應該一次執行一次,以便在將所有SHARD1作爲副本集移到SHARD2之前。您還需要注意,每次複製集在初次選舉時都將變爲只讀,因此至少應該在停機時間或維護時間內安排。理想情況下,首先在臨時環境中進行測試。

+0

謝謝,我最終導出了所有的數據,並重建/配置整個系統,我從你的答案中拿出了一些概念 – Landon