mongodbインデックスが遭遇したピットを作成する

1136 ワード

最近、オンラインのmongodbにインデックスを作成しました.当時mongodb単collectionには約1億件の記録が保存されており、インデックス作成中にプログラムアラームが発見され、mongodb書き込みがタイムアウトし、MQのメッセージをタイムリーに消費できなかった.
インデックスを作成する過程が遅く、mongodbの読み書き要求をブロックしていたに違いないと思った.直接資料を調べてみるとmongodbドキュメントは以下の通りです.
       By default, creating an index blocks all other operations on a database. When building an index on a collection, the database that holds the collection is unavailable for read or write operations until the index build completes. Any operation that requires a read or write lock on all databases (e.g. listDatabases) will wait for the foreground index build to complete.
mongodbインデックスの作成デフォルトは、このセットの読み書き操作をブロックし、backgroundを指定してこそバックグラウンドでインデックスを作成することができ、個人の直感とは正反対で、ピットを感じます.バックグラウンドでインデックスを作成するには、次のようにします.
db.people.createIndex( { zipcode: 1}, {background: true} )

またmongodbに問題が発生した場合、mongostatを使用してmongodbのステータスを表示できます.たとえば、1秒あたりの読み書き回数などです.
当時mongostatではmongodbに接続できませんでした.mongodbのlogでmongodbの状態を表示するしかありません.mongodbのlogにより、mongodbがインデックスを確立するプロセスの進捗状況が表示されます.当初はこの進捗を見たおかげでmongodbを再起動しなかったが、途中で直接mongodbを殺す可能性があり、mongodbはより多くの時間を描いて回復し、起きられない可能性もある(推測だけ).