MongoDBでのシャーディングとレプリケーションの違い


77

私は、シャーディングとレプリケーションがどのように機能するかについて混乱しています。定義によると

レプリケーション:MongoDBのレプリカセットは、同じデータセットを保持するmongodプロセスのグループです。

シャーディング:シャーディングは、複数のマシンにデータを保存する方法です。

75 GBのデータがあり、レプリケーション(3サーバー)がある場合、各サーバーに75 GBのデータが保存されますが、サーバー1では75 GB、サーバー2では75 GB、サーバー3では75 GBになります。私が間違っている場合)..そしてシャーディングによって、サーバー-1に25GBのデータとして、サーバー-2に25GBのデータとして、サーバー-3に25GBのデータとして保存されます(右?)...チュートリアル

シャードはデータを保存します。高可用性とデータの一貫性を提供するために、実稼働シャードクラスターでは、各シャードはレプリカセットです

レプリカセットは75GBですが、シャードは25GBであるため、どのように同等になる可能性がありますか。これで私を助けてください。

回答:


111

レプリカ・セットあなたは、それぞれがお互いの全てのデータをミラーリングするMongoDBの複数のインスタンスを有することを意味します。レプリカセットは、1つのマスター(「プライマリ」とも呼ばれます)と1つ以上のスレーブ(別名セカンダリ)で構成されます。読み取り操作はどのスレーブでも処理できるため、レプリカセットにスレーブを追加することで読み取りパフォーマンスを向上させることができます(クライアントアプリケーションが実際に異なるセットメンバーを使用できる場合)。ただし、書き込み操作は常にレプリカセットのマスターで行われ、その後スレーブに伝達されるため、スレーブを追加しても書き込みは速くなりません。

レプリカセットはフォールトトレランスも提供します。レプリカセットのメンバーの1つがダウンすると、他のメンバーが引き継ぎます。マスターがダウンすると、スレーブは新しいマスターを選出します。そのため、生産的な展開では、常に少なくとも3台のサーバーのレプリカセットとしてMongoDBを使用することをお勧めします。2台はデータを保持します(3台目は、データなしの「アービター」で、スレーブの1つがダウンします)。

かけら、クラスタは、(また、レプリカセットであることができる)、クラスタの各シャードは、データの一部の世話をすることを意味します。読み取りと書き込みの両方の各要求は、データが存在するクラスターによって処理されます。つまり、クラスターにシャードを追加することで、読み取りと書き込みの両方のパフォーマンスを向上させることができます。どのドキュメントがどのシャードに存在するかは、各コレクションのシャードキーによって決まります。データが均等にすべてのクラスタ上で配布することができるように選択されなければならないので、それがシャードキーが存在(例えば、最も一般的なクエリのための明確であること:あなたが頻繁による照会するとuser_name、あなたのシャード・キーが含まれている必要がありフィールドをuser_name使用して、各クエリをそのドキュメントを持つ1つのシャードのみに委任できます)。

欠点は、フォールトトレランスが低下することです。クラスターの1つの断片がダウンすると、その上のデータにアクセスできなくなります。そのため、クラスターの各メンバーもレプリカセットにする必要があります。これは必須ではありません。高可用性を気にしない場合、シャードは複製のない単一のmongodインスタンスにすることもできます。しかし、本番用には常にレプリケーションを使用する必要があります

それで、あなたの例にとってそれはどういう意味ですか?

                            Sharded Cluster             
             /                    |                    \
      Shard A                  Shard B                  Shard C
        / \                      / \                      / \
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
|Primary| |Secondary|    |Primary| |Secondary|    |Primary| |Secondary|
|  25GB |=| 25GB    |    | 25 GB |=| 25 GB   |    | 25GB  |=| 25GB    |   
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+

75GBのデータをそれぞれ25GBの3つのシャードに分割する場合、3つのレプリカセットで編成された少なくとも6つのデータベースサーバーが必要です。各レプリカセットは、同じ25 GBのデータを持つ2つのサーバーで構成されます。

また、3つのレプリカセットのアービター用のサーバー、およびクラスターのmongosルーターと構成サーバーも必要です。アービターは非常に軽量で、レプリカセットメンバーがダウンした場合にのみ必要なので、通常は同じハードウェアを他のハードウェアと共有できます。ただし、Mongosルーターとconfig-serverは冗長で、独自のサーバー上にある必要があります。


2
詳細な回答をありがとう...もう1つの質問...書き込みまたは読み取り操作が実行されているときにプライマリがダウンした場合.1)セカンダリからプライマリを選択する際の遅延と2)その遅延の間、データは一時的にどこに保存されますか?
サアドサーディ

4
@SaadSaadi 主要な選挙プロセスはドキュメントに記載されています。セカンダリがプライマリがダウンしていることに気付くには、10〜12秒かかります。一次選挙自体は通常、ミリ秒しかかかりません。プライマリが存在しない間、レプリカセットは読み取り専用です。この間にアプリケーションからデータを書き込もうとすると失敗します。
フィリップ

1
@Philipp:コメントは2つだけです。(1)シャードキーは変更できません(つまり、異なるキーを使用してシャードすることはできません)、(2)レプリカセットのセカンダリノードから読み取ることができますが、一貫性は書き込みの問題に依存します(一貫性を保つため、wオプションはレプリカセットsthと等しくする必要があります。これは、各シャードが意図的に、またはノードの障害により異なるレプリカセットサイズを持つ可能性があるため、実行できません。
マイクArgyriou

@Philippは、dba.stackexchange.com / questions / 208482 /…でさらにフォローアップの質問に答えてください。
user3198603

18
  • シャーディングは、データセットを個別の部分に分割します。
  • レプリケーションはデータセットを複製します。

これら2つは異なるため、積み重ねることができます。両方を使用すると、レプリカの複数のグループにデータセットを分割することになります。別の言い方をすれば、シャードを複製します。シャードのないデータセットは、単一の「シャード」です。

3つの断片と3つのレプリカを持つMongoクラスターには、9つのノードがあります。

  • 3ノードレプリカの3セット。
  • 各レプリカセットは単一のシャードを保持します。

1つの大きなファイルの場合、1つのシャードまたは複数のシャードに格納されますか(ノード全体で)?
トニー

MongoDB 3.4以降では、構成のためにmongoDBサーバーも必要になり、mongosルーターとして機能する追加のサーバーが必要になることに注意してください。これにより、例の3x3クラスターの合計が合計13台のサーバーになります。
-dthrasher

9

することでシャーディング、あなたはいくつかの部分にあなたのコレクションを分割します。データベースを
複製すると、データセットのミラーを作成できます。


4

提供される機能に関して。シャーディングは、スケーラビリティと並列性を提供します。レプリケーションは可用性を提供します


いや、複製だけでも、はるかに頻繁に書き込みよりも読み込みスケーラビリティ&並列処理与えられた提供
クリストフSZALAY
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.