3

状況:

以前は、3台のマシンがありました:10.10.10.5、10.10.10.6、および10.10.10.7

10.10.10.5の実行:

  • 構成データベース
  • mongoS
  • shard3、shard4 mongodプロセス(これらはシャードのプライマリです)

10.10.10.6の実行:

  • mongoS
  • shard3 shard4 mongodプロセス(これらはシャードでセカンダリです)

10.10.10.7の実行:

  • mongoS
  • shard3、shard4 mongodプロセス(これらはアービターです)

私のアプリケーションは10.10.10.6mongoSに接続します。

約1年間、すべてが順調に稼働していました。次に、10.5と10.6は非常に重い負荷、特に10.6を経験しました。CPU使用率と負荷平均が非常に高かったため、クラスターに2台の新しいマシンを追加することを計画しました。

shard1とshard2の2つのシャードを作成しました。新しいマシン10.10.10.8は次のように実行されます。

  • shard1(プライマリ)、shard2(セカンダリ)
  • mongoS

新しいマシン10.10.10.9は次のように実行されます。

  • shard1(セカンダリ)、shard2(プライマリ)
  • mongoS

古いメンバー10.10.10.7に、shard1、shard2アービターも追加しました。

問題は、(addShardコマンドを使用して)2台の新しいマシンを追加したとき、約5時間後に移行が完了した後(確認できませんが)、10.10.10.6ホストの負荷が再び非常に高くなりました。負荷平均は約90.5(4 cpus)です。

一方、アプリケーションから10.10.10.6 mongoSへの書き込みと読み取りの要求は多数ありますが、新しい2台のマシンにデータが書き込まれることはほとんどありません。iostatを使用して、2台の新しいマシンにioバイトがほとんどないことを確認しました。

10.10.10.6の負荷が非常に高いのはなぜですか?

以前は、ピーク時でも最大負荷は約30.5でした

では、負荷の問題を修正して新しいマシンを稼働させる方法を教えていただけますか?

編集:私の環境に関する詳細情報

10.5、10.6、10.7、10.8、10.9はすべて同じリソースを持っています:4CPUS、6g Mem、150Gディスクスペース、netioは光ファイバーです。

Shard3データサイズ=16gおよびShard4データサイズ15g。

1.8.2を使用しています

4

1 に答える 1

3

編集:チャットで話し合った後

少なくとも最初は、新しいシャードを追加するときにオーバーヘッドが発生することが予想されます。これは、チャンクの移行を行う必要があり、これらはCPU、ディスク、およびネットワークI/Oを使用するためです。これにより、環境に負荷が追加されます。

読み取り設定がセカンダリから読み取るように設定されている場合、10.6サーバーは、2つのレプリカセットのレプリケーション(チャンクの移行により増加します)とアプリケーション自体からのトラフィックに対応しようとするため、すぐに過負荷になる可能性があります。セカンダリを追加することでこれを減らすことができる可能性がありますが、本番環境を厳密に模倣した環境でこれをテストする必要があります。

シャードを追加することも役立つ可能性がありますが、これも徹底的にテストする必要があります。以前にシャードを追加した場合、チャンクの移行が完了しなかったように見えるため、新しいシャードは、本来のようにロードを支援しませんでした。将来、シャードを再度追加する場合は、チャンクの数がすべてのシャードで等しいことを確認するためdb.getSiblingDB("config").locks.find({"_id":'balancer'})に、の出力をチェックして、チャンクの移行が完了していることを確認してください。db.printShardingStatus()

いくつかのより一般的な注意:

  • 本番環境では、単一の構成サーバーのみを実行することはお勧めできません。この単一の構成サーバーを失うと、クラスターは使用できなくなります。詳細はこちらこちらをご覧ください

  • 一般的 mongodに、同じマシンで2つのインスタンスを実行することはお勧めしません。2つのプロセスは、共有するリソースをめぐって競合します。これは、MongoDBのようにメモリマップトファイルを使用する場合に特に当てはまります。

  • いくつかの組み込みツールを使用して、どのクエリとプロセスが最も多くの負荷を引き起こしているかを判断できます。 mongostatおよび 編集:MongoTopは1.8.2では使用できません。の使用状況を追跡できる2つのコマンドラインユーティリティです。コンソール内で実行 して、現在の操作に関する詳細情報を取得することもできます。コンソールから発行することで、バランサーが何をしているか(現在バランサーラウンドを行っているかどうか)を知ることができます 。mongotop mongodbdb.currentOp()db.getSiblingDB("config").locks.find({"_id":'balancer'})

  • 非常に古いバージョンのMongoDBで実行しています。最新の厩舎(2.2.0)または最新の厩舎(2.0.7)に更新しない場合は、現在のブランチの最後の厩舎(1.8.5)に更新することを計画する必要があります。現在使用しているリリース以降、製品には多くの修正と改善が加えられており、多くの利点があります。

于 2012-09-04T01:55:30.740 に答える