web-dev-qa-db-ja.com

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

シャーディングとレプリケーションの仕組みについて混乱しています。

ドキュメントで見つけた定義によると:

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

シャーディング:シャーディングは、複数のマシン間でデータを保管するための方法です。

私の理解では、75 GBのデータがある場合、レプリケーション(3台のサーバー)を使用すると、各サーバーに75 GBのデータが保存されます。つまり、サーバー1では75 GB、サーバー2では75 GB、サーバー3では75 GBです。 (私が間違っていれば私を訂正してください)。

また、シャーディングを使用すると、サーバー1に25 GBデータ、サーバー2に25 Gbデータ、サーバー3に25 GBデータとして保存されます。 (正しい?)。

しかし、私はチュートリアルでこの行に遭遇しました:

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

レプリカセットのサイズは75GBですが、シャードのサイズは25GBなので、それらはどのように同等ですか?

これは私をかなり混乱させます。私は明らかな何かを見逃していると思います。これで私を助けてください。

89
Saad Saadi

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

レプリカセットはフォールトトレランスも提供します。レプリカセットのメンバーの1つがダウンすると、他のメンバーが引き継ぎます。マスターがダウンすると、スレーブは新しいマスターを選出します。その理由 推奨 生産的な展開では常に少なくとも3つのサーバーのレプリカセットとしてMongoDBを使用し、そのうち2つはデータを保持します(3つ目はデータのない "アービター"であり、スレーブの1つがダウンしたときに新しいマスターを決定するために必要です)。

シャーディングされたクラスター は、クラスターの各シャード(レプリカセットでもかまいません)がデータの一部を処理することを意味します。読み取りと書き込みの両方の各要求は、データが存在するクラスターによって処理されます。つまり、クラスターにシャードを追加することで、読み取りと書き込みの両方のパフォーマンスを向上させることができます。どのドキュメントがどのシャードに存在するかは、各コレクションのシャードキーによって決まります。データがすべてのクラスターに均等に分散され、シャードキーが存在する最も一般的なクエリが明確になるように選択する必要があります(例:user_nameで頻繁にクエリする場合、シャード-keyにはフィールド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つのデータベースサーバーが必要です。各レプリカセットは、同じ25GBのデータを持つ2つのサーバーで構成されています。

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

127
Philipp
  • シャーディングデータセットを個別のパーツに分割します。
  • レプリケーションデータセットを複製します。

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

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

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

shardingによって、コレクションをいくつかの部分に分割します。
複製データベースは、データセットのミラーを作成することを意味します。

10
haper

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

4
Ashish Kumar