このトピックでは、ApsaraDB for MongoDBシャードクラスターインスタンスについて説明します。 シャードクラスターインスタンスを使用して、大量のデータを保存できます。
シナリオ
- 単一の物理ホストのストレージ容量には制限があります。
- 単一の物理ホストの読み取りおよび書き込み機能は、CPU、メモリ、またはネットワークインターフェースコントローラ (NIC) リソースが不十分なために制限されます。
シャードノード数とmongosノード数
- シャードクラスタインスタンスは、頻繁にアクセスされない大量のデータを格納するためにのみ使用されます。 たとえば、単一のシャードノードに保存できるデータのサイズがMで、保存する必要があるデータの合計サイズがNの場合、次の式を使用して、シャードノードの数とmongosノードの数を計算します。
- シャードノード数=N/M/0.75 ストレージ使用量のウォーターマークは75% です。
- mongosノード数=2以上。 データに頻繁にアクセスしない場合は、高可用性を確保するために少なくとも2つのmongosノードをデプロイする必要があります。
- シャードクラスタインスタンスは、少量のデータを格納するために使用されます。このデータは、高同時性の読み取りまたは書き込み操作によってアクセスされます。 シャードクラスターインスタンスのシャードノードとmongosノードは、必要な読み書きパフォーマンスを提供する必要があります。 たとえば、単一のシャードノードの最大クエリ /秒 (QPS) はM、単一のmongosノードの最大QPSはMs、ビジネスに必要なQPSはQです。この場合、次の式を使用して、シャードノードの数とmongosノードの数を計算します。
- シャードノード数=Q/M/0.75 (ストレージ使用量のウォーターマークは75% です)
- mongosノード数=Q/Ms/0.75
説明 MongoDB内の単一のmongosまたはmongodノードのQPSは、有効になっている機能によって異なります。 実際のQPSを取得するには、テストを実行する必要があります。
- シャードクラスターインスタンスが上記の両方のシナリオの要件を満たすようにするには、より高い仕様要件に基づいて、インスタンス内のシャードノードの数とmongosノードの数を見積もる必要があります。
- 上記の式は、インスタンス内のデータとリクエストが均等に分散されているという仮定に基づいて、シャードクラスターインスタンス内のシャードノードの数とmongosノードの数を推定するために使用されます。 実際のシナリオでは、インスタンス内のデータと要求が不均一に分散される場合があります。 インスタンスの負荷を分散するには、各シャードノードに適切なシャードキーを選択する必要があります。
シャーキーの選択
- ApsaraDB for MongoDBは、次のシャーディング戦略をサポートしています。
- これは、シャードキー値によって決定される連続した範囲にデータを分割するために使用されます。
- 構成されたシャードノード間でデータを分散するために使用されるハッシュシャーディング
- タグ認識シャーディング。配布されるチャンクに基づいてルールをカスタマイズするために使用されます。 説明
- シャーディング戦略の仕組み
- ApsaraDB for MongoDBは、
sh.addShardTag()
メソッドを呼び出して、タグAをシャードノードに追加します。 - ApsaraDB for MongoDBは、
sh.addTagRange()
メソッドを呼び出して、コレクションの特定のチャンク範囲にタグAを追加します。 このようにして、ApsaraDB for MongoDBは、タグAでラベル付けされたチャンク範囲内のデータをタグAでラベル付けされたシャードノードに配信できます。ApsaraDB for MongoDBは、タグAでラベル付けされたチャンク範囲のスーパーセット内のデータをタグAでラベル付けされたシャードノードに配信することもできます。
- ApsaraDB for MongoDBは、
- シナリオ
- シャードノードがデプロイされているデータセンターに基づいて、タグをシャードノードに追加します。 これにより、ApsaraDB for MongoDBは、チャンク範囲内のデータを、チャンク範囲と同じタグを持つデータセンターに配信できます。
- シャードノードのQPS値に基づいて、タグをシャードノードに追加します。 これにより、ApsaraDB for MongoDBは、高いQPSを提供するシャードノードにより多くのチャンクを配布できます。
- 使用上の注意
ApsaraDB for MongoDBは、指定されたタグでラベル付けされたシャードノードにチャンクを直接配布することはできません。 チャンクの分割と移行は挿入と更新操作によって頻繁にトリガーされるため、チャンクは徐々に分散されます。 配布プロセス中にbalancerが有効になっていることを確認します。 タグがチャンク範囲に追加された後、書き込まれたデータは、チャンク範囲と同じタグを持つシャードノードに配信されない可能性があります。
詳細については、「タグ対応シャーディング」をご参照ください。
- シャーディング戦略の仕組み
- レンジシャーディングとハッシュシャーディングは、次の問題を解決できません。
- シャードキーの値の範囲が小さい。 たとえば、データセンターがシャードキーとして選択された場合、データセンターの数が限られているため、シャーディングは非効率的です。
- シャードキーの特定の値は、多数のドキュメントに含まれています。 この場合、1つのチャンクに多数の文書が格納されることがある。 チャンク内のドキュメントのサイズがチャンクあたりのサイズを超える場合、チャンクはジャンボチャンクとしてラベル付けされ、balancerによって移行することはできません。
- シャードキーではなく条件に基づいてデータをクエリおよび更新すると、すべての操作が分散収集クエリになり、時間がかかります。
- シャーディングは、シャードキーに次の特性がある場合に効率的です。
- 十分なカーディナリティ
- 均等に分散された書き込み操作
- ターゲット読み取り操作Targeted read operations
例:
IoTアプリケーションは、シャードクラスタインスタンスを使用して、数百万のデバイスのログを保存します。 各デバイスは、10秒ごとに1回、シャードクラスターインスタンスにログを送信します。 ログには、デバイスIDやタイムスタンプなどの情報が含まれます。 特定の時間範囲にわたって特定のデバイスに対して生成されたログは、頻繁に照会されます。
以下のシャーディング方法が提供されます。
- 方法1: 推奨。 デバイスIDとタイムスタンプの組み合わせをシャードキーとして使用し、範囲分割を実行します。
- 書き込まれたデータは、複数のシャードノードに均等に分散されます。
- 同じデバイスIDを搬送するデータは、データのタイムスタンプに基づいて複数のチャンクにさらに分割および分散され得る。
- 特定の時間範囲にわたって特定のデバイスに対して生成されたログをクエリする場合、ApsaraDB for MongoDBはデバイスIDとタイムスタンプを組み合わせて複合インデックスを作成し、それに基づいてクエリを完了できます。
- 方法2: タイムスタンプをシャードキーとして使用し、レンジシャーディングを実行します。
- 連続したタイムスタンプを持つ書き込みデータは、同じシャードノードに配布されます。 これは、書き込まれたデータの不均一な分布を引き起こす。
- デバイスIDベースのクエリは、すべてのシャードノードに分散されます。 これは、クエリ効率を低下させる。
- 方法3: タイムスタンプをシャードキーとして使用し、ハッシュシャーディングを実行します。
- 書き込まれたデータは、複数のシャードノードに均等に分散されます。
- デバイスIDベースのクエリは、すべてのシャードノードに分散されます。 これは、クエリ効率を低下させる。
- 方法4: デバイスIDをシャードキーとして使用し、ハッシュシャーディングを実行します。 説明 デバイスIDにルールが適用されていない場合は、レンジドシャーディングを実行できます。
- 書き込まれたデータは、複数のシャードノードに均等に分散されます。
- 同じデバイスIDを持つデータは、同じチャンクにのみ配布できます。 これにより、ジャンボチャンクが発生します。 各デバイスIDベースのクエリは、単一のシャードノードにのみ配布でき、シャードノードは、クエリで指定されたタイムスタンプ範囲に基づいてすべてのテーブルをスキャンしてソートする必要があります。
ジャンボチャンクとチャンクあたりのサイズ
シャードクラスタインスタンスのチャンクあたりのデフォルトサイズは64 MBです。 チャンクのサイズが64 MBを超え、チャンクを分割できない場合、チャンクはジャンボチャンクとしてラベル付けされます。 たとえば、すべてのドキュメントが同じシャードキー値を持つ場合、これらのドキュメントは同じチャンクに格納され、分割できません。 バランサーは、負荷の不均衡を引き起こす可能性があるジャンボチャンクを移行できません。 ジャンボチャンクを防ぐことを推奨します。
- ジャンボチャンクを分割します。 ジャンボチャンクが分割された後、設定されたmongosノードは自動的にチャンクからジャンボラベルを削除します。
- チャンクを分割できない場合は、そのチャンクがジャンボチャンクではないことを確認し、そのチャンクからジャンボラベルを手動で削除します。 説明 チャンクからジャンボラベルを削除する前に、意図しない操作によって引き起こされるデータの破損を防ぐために、configという名前のデータベースをバックアップする必要があります。
- チャンクあたりのサイズを増やします。 ジャンボチャンクのサイズがチャンクあたりのサイズを超えなくなると、ジャンボラベルは自動的にチャンクから削除されます。 ただし、データが書き込まれると、まだジャンボチャンクになるチャンクもあります。 ジャンボチャンクを防ぐ最善の方法は、適切なシャードキーを選択することです。
- チャンクの移行中にI/Oの負荷が高い場合は、チャンクあたりのサイズを小さくできます。
- テストを実行してシャーディング効率を確認する場合、チャンクあたりのサイズを減らすことができます。
- チャンクあたりの初期サイズが大きく、ジャンボチャンクの数が多いために負荷が不均衡になっている場合は、チャンクあたりのサイズを増やすことができます。
- テラバイト単位のデータを格納するコレクションを分割する場合は、チャンクあたりのサイズを大きくする必要があります。 詳細については、「Sharding Existing Collection Data Size」をご参照ください。
バランサー
シャードクラスタインスタンスの自動負荷分散は、インスタンスのmongosノードで実行されるバックグラウンドスレッドによって実装されます。 特定の時点で、各コレクションに対して実行できる移行タスクは1つだけです。 負荷分散は、各シャードノードのコレクションごとのチャンク数に基づいてトリガーされます。 シャードノード上のコレクションのチャンク数とコレクションのチャンク総数の差が指定されたしきい値に達すると、ApsaraDB for MongoDBはコレクションのチャンクをシャードノードから他のシャードノードに移行し始めます。 チャンクの総数に基づいてしきい値を指定する必要があります。
use config
db.settings.update(
{ _id: "balancer" },
{ $set: { activeWindow : { start : "02:00", stop : "06:00" } } },
{ upsert: true }
)
sh.stopBalancer()
moveChunkコマンドでのアーカイブ設定
シャードクラスタインスタンスがMongoDB 3.0以前を実行している場合、データ書き込みが停止した後でも、データカタログのディスク領域使用量が増加し続けることがあります。
上記の問題は、moveChunkコマンドのsharding.archiveMovedChunks
パラメーターの値が原因です。 MongoDB 3.0以前では、このパラメーターのデフォルト値はtrue
です。 値trueは、チャンクがシャードAからシャードBに移行された後にシャードAにアーカイブされることを示します。シャードBのチャンクが破損した場合、シャードAからチャンクを復元できます。チャンクはシャードAとシャードBの両方のストレージスペースを占有します。
false
です。 値falseは、チャンクがシャードAからシャードBに移行された後にシャードAにアーカイブされないことを示します。