2013-02-06 66 views
6

對於擴展/故障轉移,mongodb使用「副本集」,其中有一個主服務器和一個或多個輔助服務器。主要用於寫入。輔助用於讀取。這幾乎是SQL編程中使用的主從模式。 如果小學二年級的副學生取而代之的話。 因此,水平縮放和故障轉移的問題得到了解決。但是,這不是一個允許分解的解決方案。一個真正的碎片僅包含整個數據的一部分,因此如果副本集中的次要碎片是碎片,那麼如果它沒有爲請求提供服務所需的所有數據,它如何能夠成爲主要碎片?MongoDB如何同時執行分片和複製?

我們不需要爲每個碎片設置一個副本集嗎?

這顯然是一個初學者的問題,所以一個鏈接,視覺上或以其他方式說明如何做這將是有益的。

+0

該分片將有數據需要滿足發送給它的請求,是的,你可以有一個副本每個碎片,這裏是一個食譜教程:http://cookbook.mongodb.org/operations/convert-replica- set-to-replicated-shard-cluster/ – Sammaye

回答

3

您的假設是正確的,每個分片包含一個單獨的副本集。當寫入請求進入時,MongoS根據分片鍵爲它找到合適的分片,並將數據寫入該分片中包含的副本集的主節點。這會導致寫入擴展,因爲(精心挑選的)分片鍵應該將寫入分配到所有分片上。

+0

謝謝!它可以以相反的方式完成嗎?副本集羣中的每個服務器都是分片的。詳細說明:假設我們有一個副本集。偉大的我們有能力服務更多的讀取,我們得到了故障轉移。現在我們的問題是每個服務器(我稱之爲服務器)上的數據量變得相當大。所以我們在每臺服務器上分割數據。這與你所描述的相反嗎?還是從實施的角度來看,它們都是一樣的「東西」? –

+0

@alexsundukovskiy我不確定你的意思,但是你不能將一個副本集合本身 – Sammaye

+0

@alexsundukovskiy讓我們假設SHARD_KEY有可能的值{A,B,C,D},並且你有2個分片。每個分片都有由3臺機器組成的副本集。現在,理論上你的文件應該均勻分佈在你的SHARD_KEY上,即SHARD_KEY = A,SHARD_KEY = B等文件的數量應該相等。假設這種快樂情況持續一段時間。然後,開始發生以下兩件事之一:(繼續下面) –

0

您通常會映射單獨的分片以分離副本集。 有關MongoDB sharding的概述,請參閱http://docs.mongodb.org/manual/core/sharded-clusters/

+0

謝謝,我想知道它是否曾經發生過其他事情。換句話說,我們可以讓副本集中的每個節點分片嗎?如果不是這樣做有什麼問題? –

+0

我不知道我理解你的問題。您在數據庫中分割集合,分片在副本集上運行。 MongoDB沒有分割節點的概念。你當然可以選擇分割所有數據庫中的所有集合,但這可能是過度的,取決於你的工作量。 – epc

+0

假設我們有一個副本集。偉大的我們有能力服務更多的讀取,我們得到了故障轉移。現在我們的問題是每個服務器(我稱之爲節點)上的數據量變得相當大。所以我們在每臺服務器上分割數據。這與你所描述的相反嗎?還是從實施的角度來看,它們都是一樣的「東西」? –

1

分片是主副本(副本集)的主副本,所以是的,您必須在每個副本中設置副本集。

整個數據的一部分保存在主數據庫中,並與副數據庫共享以保持一致性。如果小學畢業,中學將被選爲新小學,並具有與其前任相同的數據以立即開始服務。這意味着分片數據仍然存在並且不會丟失。

+1

一個碎片是分片收集的數據的範圍,副本可以存在沒有碎片和@Sammaye我不明白怎麼副本集可以在分片環境自身存在的碎片可以在沒有副本存在 – Sammaye

+0

。 (你的意思是它不一定是非分片環境中的分片?)當我們說「分片」時,我們不是說複製集是更大數據範圍的一部分嗎?關於碎片能夠存在沒有副本集我同意。但是他並沒有這樣做,因此我調整了他對複製品情景的回答,而不是單個單位。 –

+0

分片的定義並不總是在複製環境中,它聽起來像分片中的「定義」存在於副本中。我仍然不確定你的「主要和次要總和」是什麼意思,因爲如果情況是這樣的話,主要(碎片)就不會有重複的數據。該次級是主要的副本,碎片,好樣的,取決於複製有 – Sammaye