2012-07-20 72 views

回答

59

在縮放的MongoDB的上下文:

  • replication創建數據的額外副本,並允許自動故障轉移到另一個節點。如果您可以讀取可能不是最新的數據,則複製可能有助於讀取的水平縮放。

  • sharding允許數據水平擴展通過使用片鍵劃分在多個服務器上的數據寫入。這對choose a good shard key很重要。例如,分片密鑰選擇不當可能導致數據的「熱點」僅被寫入單個分片。

分片環境確實增加more complexity因爲MongoDB中現在有管理的碎片之間的分佈數據和請求 - 額外的配置和佈線過程被添加到管理這些方面。

通常組合複製和分片來創建每個分片由複製集支持的sharded cluster

從一個客戶端應用點,你也有相對於複製/分片相互作用一定的控制,特別是:

+2

「在MongoDB中,每個碎片都是一個副本集合」 - 這是不正確的。您可以將單個服務器添加爲碎片。 – 2012-07-20 07:55:02

+2

@SergioTulentsev:謝謝,澄清「是」爲「可以」。理想情況下,你的分片*應該是一個副本集,所以有一些冗餘/故障轉移。同樣,副本集*應該*在多個服務器上運行(但技術上,不必)。 – Stennie 2012-07-20 08:01:51

+1

我建議刪除「建立在複製」子句。它不建立在它上面。這兩件事是完全正交的。 :) – 2012-07-20 08:04:20

20

複製是一種大多數傳統的主/從設置,數據同步到備份成員,並且如果主服務器失敗,其中一個可以代替它。這是一個相當簡單的工具。它主要是爲了冗餘,儘管您可以通過添加副本集成員來擴展讀取。這有點複雜,但對於某些應用程序非常適用。

分片通常位於複製之上。 MongoDB中的「Shards」只是在其前面有一些名爲「路由器」的副本集。您的應用程序將連接到路由器,發出查詢,並且它將決定將哪些副本集(分片)轉發給該路由器。它比單個副本集複雜得多,因爲你需要處理路由器和配置服務器(這些服務器會跟蹤哪些數據存儲在哪裏)。

如果你想水平縮放Mongo,你會碎片。 10gen喜歡將路由器/配置服務器設置爲auto-sharding。有可能做更多的貧民窟分區形式,讓應用程序決定寫入哪個數據庫。

+12

愛「更多貧民區形式」這句 – scarpacci 2012-07-21 21:09:39

4

每當你想關於分片或複製,您需要在編寫器/更新操作的上下文中思考。如果你不需要擴展寫操作,那麼複製,因爲它相當簡單,對你來說是一個不錯的選擇。另一方面,如果你的工作量大部分是更新/寫入,那麼在某個時候你會遇到寫瓶頸。如果寫入請求來自Mongo阻止其他寫入請求。那些寫請求塊直到第一個請求完成。如果你想擴展這個寫入並且想要並行化,那麼你需要實現分片。

14

考慮你有你的硬盤有很大的音樂收藏,您存儲的音樂中,根據在不同的文件夾發行年份邏輯順序。 您擔心如果驅動器出現故障,您的收藏將會丟失。 所以你得到一個新的磁盤,並偶爾複製整個集合保持相同的文件夾結構。

拆分>>保持你的音樂文件在不同的文件夾

複製>>同步您的收藏到其他驅動器

+0

很好地解釋。 – mhndev 2017-04-25 10:42:43

+0

Stackoverflow在這種風格中需要更多的答案。 – dgg32 2017-11-15 13:49:23

12

拆分

拆分是拆分在多個服務器上收集了大量的技術。當我們分片時,我們部署了多個mongod服務器。而在前面,mongos這是一個路由器。該應用程序會與此路由器通話。然後該路由器與各種服務器進行通信,即mongod。應用程序和mongos通常位於同一臺服務器上。我們可以在同一臺機器上運行多個mongos服務。它也建議保留一組多個mongod S(合稱副本集),而不是一個單一的mongod每個服務器上。副本集保持數據在幾個不同的實例中同步,以便如果其中一個發生故障,我們不會丟失任何數據。從邏輯上講,每個副本集可以看作是分片。它是透明的應用程序,方式MongoDB選擇分片是我們選擇片鍵

MongoDB sharding

假設,student收集我們stdt_id作爲片鍵或者它可能是一個複合鍵。而mongos服務器,它是一個基於範圍的系統。因此,根據我們作爲分片鍵發送的stdt_id,它會將請求發送到右邊的mongod實例。

那麼,我們需要真正瞭解作爲一個開發者?

  • insert必須包括一個片鍵,所以如果它是一個多深裂碎片關鍵,我們必須包括整個片鍵
  • 我們已經瞭解的碎片關鍵是集合本身
  • 什麼對於update,remove,find - 如果mongos沒有給出分片鍵 - 那麼它將不得不將廣播請求發送到覆蓋集合的所有不同分片。
  • update - 如果我們不指定整個片鍵,我們要使它成爲一個多更新,以便它知道它需要廣播它