8

比較的単純なシャード MongoDB セットアップがあります。各シャードが少なくとも 3 つのメンバーを持つレプリカ セットである 4 つのシャードです。各コレクションは、多数のファイルからロードされたデータで構成されています。各ファイルには単調に増加する ID が与えられ、ID のハッシュに基づいてシャーディングが行われます。

私たちのコレクションのほとんどは、期待どおりに機能しています。ただし、シャード間でチャンクを適切に分散していないように見えるコレクションが 1 つあります。コレクションには、インデックスが作成されて分割される前に最大 30 GB のデータが読み込まれていましたが、これは私が知る限り問題ではありません。コレクションの統計は次のとおりです。

mongos> db.mycollection.stats()
{
        "sharded" : true,
        "ns" : "prod.mycollection",
        "count" : 53304954,
        "numExtents" : 37,
        "size" : 35871987376,
        "storageSize" : 38563958544,
        "totalIndexSize" : 8955712416,
        "indexSizes" : {
                "_id_" : 1581720784,
                "customer_code_1" : 1293148864,
                "job_id_1_customer_code_1" : 1800853936,
                "job_id_hashed" : 3365576816,
                "network_code_1" : 914412016
        },
        "avgObjSize" : 672.9578525853339,
        "nindexes" : 5,
        "nchunks" : 105,
        "shards" : {
                "rs0" : {
                        "ns" : "prod.mycollection",
                        "count" : 53304954,
                        "size" : 35871987376,
                        "avgObjSize" : 672.9578525853339,
                        "storageSize" : 38563958544,
                        "numExtents" : 37,
                        "nindexes" : 5,
                        "lastExtentSize" : 2146426864,
                        "paddingFactor" : 1.0000000000050822,
                        "systemFlags" : 0,
                        "userFlags" : 0,
                        "totalIndexSize" : 8955712416,
                        "indexSizes" : {
                                "_id_" : 1581720784,
                                "job_id_1_customer_code_1" : 1800853936,
                                "customer_code_1" : 1293148864,
                                "network_code_1" : 914412016,
                                "job_id_hashed" : 3365576816
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}

そして、このコレクションの sh.status() :

            prod.mycollection
                    shard key: { "job_id" : "hashed" }
                    chunks:
                            rs0     105
                    too many chunks to print, use verbose if you want to force print

このコレクションが rs0 にのみ配布される理由について、私が見逃しているものはありますか? リバランスを強制する方法はありますか?他のコレクションを分割するために同じ手順を実行したところ、適切に分散されました。シャーディングに成功したコレクションの統計は次のとおりです。

mongos> db.myshardedcollection.stats()
{
        "sharded" : true,
        "ns" : "prod.myshardedcollection",
        "count" : 5112395,
        "numExtents" : 71,
        "size" : 4004895600,
        "storageSize" : 8009994240,
        "totalIndexSize" : 881577200,
        "indexSizes" : {
                "_id_" : 250700688,
                "customer_code_1" : 126278320,
                "job_id_1_customer_code_1" : 257445888,
                "job_id_hashed" : 247152304
        },
        "avgObjSize" : 783.3697513591966,
        "nindexes" : 4,
        "nchunks" : 102,
        "shards" : {
                "rs0" : {
                        "ns" : "prod.myshardedcollection",
                        "count" : 1284540,
                        "size" : 969459424,
                        "avgObjSize" : 754.7133012595949,
                        "storageSize" : 4707762176,
                        "numExtents" : 21,
                        "nindexes" : 4,
                        "lastExtentSize" : 1229475840,
                        "paddingFactor" : 1.0000000000000746,
                        "systemFlags" : 0,
                        "userFlags" : 0,
                        "totalIndexSize" : 190549856,
                        "indexSizes" : {
                                "_id_" : 37928464,
                                "job_id_1_customer_code_1" : 39825296,
                                "customer_code_1" : 33734176,
                                "job_id_hashed" : 79061920
                        },
                        "ok" : 1
                },
                "rs1" : {
                        "ns" : "prod.myshardedcollection",
                        "count" : 1287243,
                        "size" : 1035438960,
                        "avgObjSize" : 804.384999568846,
                        "storageSize" : 1178923008,
                        "numExtents" : 17,
                        "nindexes" : 4,
                        "lastExtentSize" : 313208832,
                        "paddingFactor" : 1,
                        "systemFlags" : 0,
                        "userFlags" : 0,
                        "totalIndexSize" : 222681536,
                        "indexSizes" : {
                                "_id_" : 67787216,
                                "job_id_1_customer_code_1" : 67345712,
                                "customer_code_1" : 30169440,
                                "job_id_hashed" : 57379168
                        },
                        "ok" : 1
                },
                "rs2" : {
                        "ns" : "prod.myshardedcollection",
                        "count" : 1131411,
                        "size" : 912549232,
                        "avgObjSize" : 806.5585644827565,
                        "storageSize" : 944386048,
                        "numExtents" : 16,
                        "nindexes" : 4,
                        "lastExtentSize" : 253087744,
                        "paddingFactor" : 1,
                        "systemFlags" : 0,
                        "userFlags" : 0,
                        "totalIndexSize" : 213009328,
                        "indexSizes" : {
                                "_id_" : 64999200,
                                "job_id_1_customer_code_1" : 67836272,
                                "customer_code_1" : 26522944,
                                "job_id_hashed" : 53650912
                        },
                        "ok" : 1
                },
                "rs3" : {
                        "ns" : "prod.myshardedcollection",
                        "count" : 1409201,
                        "size" : 1087447984,
                        "avgObjSize" : 771.6769885914075,
                        "storageSize" : 1178923008,
                        "numExtents" : 17,
                        "nindexes" : 4,
                        "lastExtentSize" : 313208832,
                        "paddingFactor" : 1,
                        "systemFlags" : 0,
                        "userFlags" : 0,
                        "totalIndexSize" : 255336480,
                        "indexSizes" : {
                                "_id_" : 79985808,
                                "job_id_1_customer_code_1" : 82438608,
                                "customer_code_1" : 35851760,
                                "job_id_hashed" : 57060304
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}

適切に分割されたコレクションの sh.status():

            prod.myshardedcollection
                    shard key: { "job_id" : "hashed" }
                    chunks:
                            rs2     25
                            rs1     26
                            rs3     25
                            rs0     26
                    too many chunks to print, use verbose if you want to force print
4

1 に答える 1

13

MongoDB では、シャード システムに移動し、バランスが取れていない場合、いくつかの原因の 1 つが考えられます。

  1. バランシングをトリガーするのに十分なデータがない可能性があります。これは間違いなくあなたの状況ではありませんでしたが、デフォルトのチャンク サイズが 64MB の場合、データの一部を分割して他のチャンクに分散するのに十分なデータが挿入されるまでに、しばらく時間がかかる可能性があることに気付いていない人もいるかもしれません。

  2. バランサーが実行されていない可能性があります-他のコレクションがバランスを取っていたため、何らかの理由でバランサーが停止した後にこのコレクションが最後にシャードされない限り、これはありそうもないことです。

  3. コレクション内のチャンクは移動できません。これは、シャード キーの細かさが不十分で、データを十分に小さいチャンクに分割できない場合に発生する可能性があります。シャードキーがこの大規模なコレクションに対して十分な粒度ではないことが判明したため、これはあなたのケースでした.105個のチャンク(おそらく一意のjob_id値の数に対応)と30GBを超えるデータがあります. チャンクが大きすぎてバランサーが移動できない場合、「ジャンボ」としてタグ付けされます (そのため、チャンクを移行しようとしてホイールを回転させません)。

シャード キーの不適切な選択から回復するにはどうすればよいですか? 通常、シャード キーを変更するのは非常に面倒です。シャード キーは不変であるため、別のシャード キーを使用してコレクションに入れるには、完全なデータ移行と同等の操作を行う必要があります。ただし、あなたの場合、コレクションはすべて 1 つのシャード上にあるため、コレクションを「アンシャード」して新しいシャード キーで再シャーディングするのは比較的簡単です。job_id の数は比較的少ないため、通常のインデックスを使用して job_id,customer_code を分割することをお勧めします。これは、おそらくクエリを実行するためであり、ドキュメントの作成時に常に設定されていると思います。

于 2013-06-04T14:34:41.030 に答える