複製似乎比分片更簡單,除非我錯過了分片實際嘗試實現的好處。他們都不提供水平縮放嗎?在Mongo中分片和複製有什麼區別?
回答
在縮放的MongoDB的上下文:
replication創建數據的額外副本,並允許自動故障轉移到另一個節點。如果您可以讀取可能不是最新的數據,則複製可能有助於讀取的水平縮放。
sharding允許數據水平擴展通過使用片鍵劃分在多個服務器上的數據寫入。這對choose a good shard key很重要。例如,分片密鑰選擇不當可能導致數據的「熱點」僅被寫入單個分片。
分片環境確實增加more complexity因爲MongoDB中現在有管理的碎片之間的分佈數據和請求 - 額外的配置和佈線過程被添加到管理這些方面。
通常組合複製和分片來創建每個分片由複製集支持的sharded cluster。
從一個客戶端應用點,你也有相對於複製/分片相互作用一定的控制,特別是:
複製是一種大多數傳統的主/從設置,數據同步到備份成員,並且如果主服務器失敗,其中一個可以代替它。這是一個相當簡單的工具。它主要是爲了冗餘,儘管您可以通過添加副本集成員來擴展讀取。這有點複雜,但對於某些應用程序非常適用。
分片通常位於複製之上。 MongoDB中的「Shards」只是在其前面有一些名爲「路由器」的副本集。您的應用程序將連接到路由器,發出查詢,並且它將決定將哪些副本集(分片)轉發給該路由器。它比單個副本集複雜得多,因爲你需要處理路由器和配置服務器(這些服務器會跟蹤哪些數據存儲在哪裏)。
如果你想水平縮放Mongo,你會碎片。 10gen喜歡將路由器/配置服務器設置爲auto-sharding。有可能做更多的貧民窟分區形式,讓應用程序決定寫入哪個數據庫。
愛「更多貧民區形式」這句 – scarpacci 2012-07-21 21:09:39
每當你想關於分片或複製,您需要在編寫器/更新操作的上下文中思考。如果你不需要擴展寫操作,那麼複製,因爲它相當簡單,對你來說是一個不錯的選擇。另一方面,如果你的工作量大部分是更新/寫入,那麼在某個時候你會遇到寫瓶頸。如果寫入請求來自Mongo阻止其他寫入請求。那些寫請求塊直到第一個請求完成。如果你想擴展這個寫入並且想要並行化,那麼你需要實現分片。
拆分
拆分是拆分在多個服務器上收集了大量的技術。當我們分片時,我們部署了多個mongod
服務器。而在前面,mongos
這是一個路由器。該應用程序會與此路由器通話。然後該路由器與各種服務器進行通信,即mongod
。應用程序和mongos
通常位於同一臺服務器上。我們可以在同一臺機器上運行多個mongos
服務。它也建議保留一組多個mongod
S(合稱副本集),而不是一個單一的mongod
每個服務器上。副本集保持數據在幾個不同的實例中同步,以便如果其中一個發生故障,我們不會丟失任何數據。從邏輯上講,每個副本集可以看作是分片。它是透明的應用程序,方式MongoDB
選擇分片是我們選擇片鍵。
假設,student
收集我們stdt_id
作爲片鍵或者它可能是一個複合鍵。而mongos
服務器,它是一個基於範圍的系統。因此,根據我們作爲分片鍵發送的stdt_id
,它會將請求發送到右邊的mongod
實例。
那麼,我們需要真正瞭解作爲一個開發者?
insert
必須包括一個片鍵,所以如果它是一個多深裂碎片關鍵,我們必須包括整個片鍵- 我們已經瞭解的碎片關鍵是集合本身
- 什麼對於
update
,remove
,find
- 如果mongos
沒有給出分片鍵 - 那麼它將不得不將廣播請求發送到覆蓋集合的所有不同分片。 - 爲
update
- 如果我們不指定整個片鍵,我們要使它成爲一個多更新,以便它知道它需要廣播它
- 1. 索引和分片有什麼區別
- 2. 「複製」和「保留」有什麼區別?
- 3. 複製和克隆有什麼區別?
- 4. 文件結構和mongo,mongo shell,mongod和mongoDB有什麼區別
- 5. 在Mongo DB中保存和插入有什麼區別?
- 6. CPU和芯片組有什麼區別?
- 7. 鏡片和拉鍊有什麼區別?
- 8. .rdata和.idata片段有什麼區別?
- 9. 有什麼區別複製命令 - windows
- 10. 配置單元中的分區和分區有什麼區別?
- 11. Mongo中的findOne和find_one有什麼區別?
- 12. 有什麼區別`和$(Bash中有什麼區別?
- 13. MongoDB中的「副本對」和「主 - 主」複製有什麼區別?
- 14. 有什麼區別「複製」和「另存爲」,在MS Word文檔?
- 15. 段,卷和分區有什麼區別?(在存儲域中)
- 16. ()和[]動態分配有什麼區別?
- 17. 部分複製和分片之間的區別?
- 18. 強制和超載有什麼區別?
- 19. 製片人和普通演員之間有什麼區別?
- 20. Mongo stats()函數顯示「size」和「storageSize」有什麼區別
- 21. 在Prolog中==和= =有什麼區別?
- 22. =和在mysql中有什麼區別?
- 23. `|。有什麼區別? `和`|| `在java中?
- 24. &和|有什麼區別?在Linux中?
- 25. |有什麼區別?和||在MATLAB中?
- 26. 〜/和〜在linux中有什麼區別?
- 27. *和。*在matlab中有什麼區別?
- 28. < - 和=在data.frame中有什麼區別?
- 29. 在PHP中!==和!=有什麼區別?
- 30. &&和||有什麼區別?在JavaScript中?
「在MongoDB中,每個碎片都是一個副本集合」 - 這是不正確的。您可以將單個服務器添加爲碎片。 – 2012-07-20 07:55:02
@SergioTulentsev:謝謝,澄清「是」爲「可以」。理想情況下,你的分片*應該是一個副本集,所以有一些冗餘/故障轉移。同樣,副本集*應該*在多個服務器上運行(但技術上,不必)。 – Stennie 2012-07-20 08:01:51
我建議刪除「建立在複製」子句。它不建立在它上面。這兩件事是完全正交的。 :) – 2012-07-20 08:04:20