セカンダリからの読み取りは、必ずしも期待どおりに負荷を「分散」するわけではありません。パフォーマンスの問題の根本にたどり着くことなく、さらに多くの課題に備えることができます。
特に、既存のサーバーにセカンダリを追加すると、次のようになります。
- セカンダリを追加するサーバーのI/O負荷を増やします(これで、データの完全な追加コピーを複製して書き込みます)
- セカンダリが同期しているサーバーから読み取るためのより多くの競合を提供します
- 大量の読み取りアクティビティ中にセカンダリがプライマリより遅れる可能性があります(強い一貫性が期待される場合は、これが問題になる可能性があります)。
また、失敗した場合に何が起こるかを考慮する必要があります。サーバーが現在の負荷で苦労している場合、物理サーバーのいずれかに問題があり、すべてのトラフィックが1つのサーバーに到達すると、状況はおそらく劇的に崩壊します。
理想的には、mongostatまたは同様の監視ツールを実行して、サーバーのパフォーマンス特性と、負荷の原因となる可能性のあるもの(メモリの負荷、ロック率、I / O、ネットワークなど)をよりよく理解する必要があります。モンゴスタットの出力のサンプルをPasteBinなどに投稿できれば便利です。
また、 explain()を使用して一般的なクエリを確認し、インデックスの使用法を理解し、それらがすべてのシャードへのアクセスを必要とするか、特定のシャードに転送されているかを確認する必要があります。
3台のサーバーすべてが同じハードウェア仕様である場合、短期的な改善として、次のことを検討します。
アービターを削除し、セカンダリノードに置き換えます。これにより、サーバーの1つに障害が発生した場合に追加のデータ冗長性が提供され、すべての負荷が1つのサーバーに到達するのを防ぐことができます。
NodeIのプライマリをステップダウンして、NodeIとNodeIIがそれぞれプライマリとセカンダリを持つようにします(NodeIの2つのプライマリとNodeIIの2つのセカンダリではありません)。プライマリサーバーとセカンダリサーバーの書き込み特性が異なるため、負荷分散が向上する可能性があります。
シャードキーと一般的なクエリをチェックして、読み取りと書き込みのバランスが適切に取れていることを確認します。コレクションへのすべての書き込みが単一のシャードにヒットする「ホットスポット」や、結果を得るためにすべてのシャードにヒットするクエリなどの潜在的な問題。
セカンダリから読み取らない場合のパフォーマンスの変化をテストします。直感に反しているように見えるかもしれませんが、クエリの性質によっては、セカンダリからの読み取りが実際に他の問題を引き起こしている可能性があります。
最後に、1.8.2を使用することに言及しました。MongoDB 2.0および2.2には、パフォーマンスとロック/イールドの大幅な改善、およびその他のバグ修正があります。いくつかの問題に対処できる可能性があるため、開発環境でアップグレードをテストする価値があります。