MongoDBでは、大規模なデータセットには高スループットの操作が含まれるため、単一サーバーの容量を圧倒する可能性があります。動作するデータセットが大きいと、ディスクデバイスのI / O容量により多くのストレスがかかり、ページフォールトなどの問題が発生する可能性があります。
これを解決するには、主に2つの方法があります...
- 垂直スケーリング強い> :単一サーバーの容量を増やします。 CPU、RAM、およびストレージスペースを追加することで実現しますが、次の制限があります。利用可能なテクノロジーにより、単一のマシンが一部のワークロードに対して十分に強力になることが制限される場合があります。実際には、垂直スケーリングには最大値があります。
- シャーディングによる水平スケーリング :これには、システムデータセットを複数のサーバーに分割することが含まれるため、単一サーバーの全体的なワークロードが削減されます。展開の容量を拡張するには、サーバーを追加するだけで、単一のマシンのハイエンドハードウェアよりも全体的なコストを削減できます。ただし、これには、展開のインフラストラクチャとメンテナンスが非常に複雑になるというトレードオフが伴います。災害が発生した場合にシャーディングされたクラスターのトラブルシューティングを行うと、複雑さが増します。このブログでは、役立つ可能性のあるトラブルシューティングの可能性をいくつか紹介します。
- シャードキーとクラスターの可用性の選択
- Mongosインスタンスが使用できなくなります
- メンバーがシャードレプリカセットに存在しなくなります
- レプリカセットのすべてのメンバーが存在しません
- 古い設定データはカーソルの失敗につながります
- 構成サーバーが使用できなくなります
- データベース文字列エラーの修正
- 構成サーバーを移動する際のダウンタイムの回避
シャードキーとクラスターの可用性の選択
シャーディングでは、データをシャードと呼ばれる小さなグループに分割して、特定のスループットの全体的なワークロードを削減します。手術。このグループ化は、シャーディングの前に主に最も重要な部分である最適なキーを選択することによって実現されます。最適なキーは次のことを保証する必要があります:
- Mongosは、ほとんどのクエリを特定のmongodに分離できます。たとえば、より多くの操作が単一のシャードの対象となる場合、そのシャードに障害が発生すると、そのシャードに関連付けられたデータのみがその時点で存在しなくなります。シャードがクラッシュした場合にデータが利用できなくなる量を減らすために、より多くのシャードを提供するシャードキーを選択することをお勧めします。
- MongoDBは、データをチャンク間で均等に分割できます。これにより、スループット操作も均等に分散され、ワークロードのストレスが増えるために失敗する可能性が低くなります。
- 高可用性を確保するために、クラスター全体にスケーラビリティーを書き込みます。各シャードはレプリカセットである必要があります。特定のmongodインスタンスに障害が発生した場合、残りのレプリカセットメンバーは別のメンバーをプライマリとして選択できるため、運用の継続性が確保されます。
いずれの場合でも、特定のシャードが失敗する傾向がある場合は、スループット操作の数を確認することから始めます。より多くのシャードを使用するために、より適切なシャーディングキーを選択することを検討してください。
もしも? Mongosインスタンスが不在になる
無意識のうちに変更した可能性があるため、最初に正しいポートに接続しているかどうかを確認してください。たとえば、AWSプラットフォームでのデプロイでは、セキュリティグループがそのポートでの接続を許可しない可能性があるため、この問題が発生する可能性があります。すぐにテストするには、完全なhost:portを指定して、ループバックインターフェイスを使用していることを確認してください。良い点は、各アプリケーションサーバーに独自のmongosインスタンスがある場合、アプリケーションサーバーがデータベースにアクセスし続ける可能性があることです。さらに、mongosインスタンスの状態は時間とともに変化し、必ずしもデータを失うことなく再起動できます。インスタンスが再接続されると、構成データベースのコピーが取得され、クエリのルーティングが開始されます。
再接続しようとしているポートが別のプロセスによって占有されていないことを確認してください。
>もしも?メンバーがシャードレプリカセットに不在になる
コマンドsh.status()を実行して、シャードのステータスを確認することから始めます。返された結果にclusterIdが含まれていない場合、シャードは実際には使用できません。可用性の中断と障害を常に調査し、可能な限り短い時間で復旧できない場合は、データの損失を防ぐために、できるだけ早く新しいメンバーを作成して交換してください。
セカンダリメンバーが使用できなくなったが、現在のoplogエントリがある場合、再接続すると、通常のレプリケーションプロセスとしてoplogから現在のデータを読み取ることによる最新の設定状態。データの複製に失敗した場合は、これら2つのオプションのいずれかを使用して初期同期を実行する必要があります...
- 空のデータディレクトリでmongodを再起動し、MongoDBの通常の初期同期機能でデータを復元します。ただし、このアプローチではデータのコピーに時間がかかりますが、非常に簡単です。
- レプリカセット内の別のメンバーからの最近のデータディレクトリのコピーを使用して、ホストマシンを再起動します。迅速なプロセスですが、複雑な手順が必要です
初期同期により、MongoDBで...
- 使用可能なすべてのデータベースのクローンを作成します。ローカルデータベース。データがコピーされている間、ターゲットメンバーにローカルデータベースに十分なディスク容量があり、oplogレコードを一時的に保存できることを確認してください。
- すべての変更をデータセットに適用しますソースからのoplogを使用します。このプロセスは、レプリカのステータスがSTARTUP2からSECONDARYに移行した場合にのみ完了します。
もしも?レプリカセットのすべてのメンバーが不在です
レプリカセットシャードのすべてのメンバーが存在しなくなると、シャードに保持されているデータは利用できなくなります。他のシャードは引き続き使用できるため、アプリケーションに部分的なデータが提供されることを除いて、読み取りおよび書き込み操作は引き続き可能です。中断の原因を調査し、できるだけ早くシャードの再アクティブ化を試みる必要があります。その問題の原因となった可能性のあるクエリプロファイラーまたはexplainメソッドを確認してください。
もしも?古い構成データがカーソルの失敗につながる
mongosインスタンスは、構成データベースからメタデータキャッシュを更新するのに時間がかかり、クエリが返される場合があります。警告:
could not initialize cursor across all shards because : stale config detected
このエラーは、mongosインスタンスがキャッシュを更新するまで常に表示されます。これは、アプリケーションに伝播して戻るべきではありません。これを修正するには、fluRouterConfigを実行してインスタンスを強制的に更新する必要があります。
特定のコレクション実行のキャッシュをフラッシュするには
db.adminCommand({ flushRouterConfig: "<db.collection>" } )
特定のデータベースのキャッシュをフラッシュするには
db.adminCommand({ flushRouterConfig: "<db>" } )
すべてのデータベースとそのコレクションのキャッシュをフラッシュするには:
db.adminCommand("flushRouterConfig")
db.adminCommand( { flushRouterConfig: 1 } )
もしも?構成サーバーが使用できなくなります
この場合の構成サーバーは、セカンダリノードがデータを複製するプライマリメンバーと見なすことができます。存在しない場合、使用可能なセカンダリノードは、プライマリになるためにメンバーの中から1つを選択する必要があります。構成サーバーがない可能性がある状況に陥らないようにするには、レプリカセットのメンバーを2つのデータセンターに分散することを検討してください...
- 1つのデータセンターがダウンした場合でも、単一のデータセンターを使用した場合、データは操作なしではなく読み取りに使用できます。 。
- 少数のメンバーを含むデータセンターがダウンした場合でも、レプリカセットは書き込み操作と読み取り操作の両方を実行できます。
メンバーを少なくとも3つのデータセンターに分散させることをお勧めします。
もう1つの分散の可能性は、データを保持するメンバーを2つのデータセンターと残りのメンバーに均等に分散することです。クラウド。
データベース文字列エラーの修正
MongoDB 3.4以降、SCCC構成サーバーはミラーリングされたmongodインスタンスではサポートされていません。シャーディングされたクラスターをバージョン3.4にアップグレードする必要がある場合は、構成サーバーをSCCCからCSRSに変換する必要があります。
構成サーバーを移動する際のダウンタイムの回避
ダウンタイムは、停電やネットワーク周波数などのいくつかの要因の結果として発生する可能性があり、その結果、構成サーバーのクラスターへの障害。 CNAMEを使用して、再接続中に名前の変更または番号の付け直しを行うサーバーを識別します。移行プロセス中にmoveChunkcommitコマンドが失敗した場合、MongoDBはエラーを報告します:
ERROR: moveChunk commit failed: version is at <n>|<nn> instead of
<N>|<NN>" and "ERROR: TERMINATING"
これは、シャードも構成データベースに接続されていないため、プライマリがこのメンバーを終了することを意味しますデータの不整合を回避するため。MongoDBサポートに相談して、チャンク移行の失敗を個別に解決する必要があります。また、ネットワークや電力などの安定したリソースをクラスターに提供するようにしてください。
結論
MongoDBシャードクラスターは、単一サーバーが受けるはずだったワークロードを削減し、パフォーマンスを向上させますスループット操作の。ただし、最適なシャードキーを選択するなど、一部のパラメータを正しく構成しないと、負荷の不均衡が生じる可能性があるため、一部のシャードが失敗することになります。
構成が正しく行われていると仮定すると、停電などの避けられない挫折も発生する可能性があります。最小限のダウンタイムでアプリケーションを引き続きサポートするには、少なくとも3つのデータセンターの使用を検討してください。 1つが失敗した場合、プライマリが影響を受けるメンバーの中にある場合、他は読み取り操作をサポートするために使用できます。また、より多くの機能をサポートするため、システムを少なくともバージョン3.4にアップグレードしてください。