Ubuntu 10.04 で MongoDB 2.2 を実行する 3 サーバーのレプリカセットがあり、最近、特定のデータベースが存在する各サーバーのハード ドライブをアップグレードする必要がありました。このデータベースには、Web サービス要求のログ情報が含まれており、現在のタイムスタンプを使用して 1 時間ごとのバケット内のコレクションに書き込み、名前を特定します (例: log_yyyymmddhh )。
私はこのプロセスを実行しました:
- mongodump --db log_dbを使用して、プライマリ サーバー上のデータベースをバックアップします。
- セカンダリ サーバーをオフラインにし、ディスクを交換する
- セカンダリ サーバーをスタンドアロン モードで起動します (つまり、サービスを開始する前に、/etc/mongodb.conf の replSet エントリをコメント アウトします)。
- mongorestore --drop --db log_dbを使用してセカンダリ サーバーにデータベースを復元します。
- セカンダリ サーバーをレプリカセットに追加してオンラインにし、レプリケーションがオフラインの間に更新/作成された 1 時間ごとのバケットに追いつくようにします。
バックアップ時に現在のバケットであったコレクションがレプリケーションによって最新のものにならなかったことを除いて、すべてが期待どおりに進んでいるように見えました。最新の状態にするには、そのコレクションを手動でコピーする必要がありました。バックアップ後に作成されたコレクションは問題なく同期されていることに注意してください。
MongoDB がその 1 つのコレクションの同期を取り戻せなかった原因は、このプロセスで何が欠けていたのでしょうか? 私は、oplogに関して何かがうまくいかなかったと思いますか?
編集1:
プライマリの oplog は、最初のタイムスタンプが数日さかのぼったことを示していたため、数時間 (セカンダリがオフラインだった時間) トランザクションを維持するための十分なスペースがあったはずです。
編集2:
MongoDB のインストールでは、/dev/sda1 と /dev/sdb1 の 2 つのディスク パーティションを使用します。プライマリ MongoDB ディレクトリ /var/lib/mongodb/ は /dev/sda1 にあり、いくつかのデータベースを保持しますが、ログ データベースは /dev/sdb1 に単独で存在します。/dev/sdb1 のディレクトリを指すシンボリックリンク/var/lib/mongodb/log_dbがあります。ログ データベースがいっぱいになったため、/dev/sdb1 のディスクをアップグレードする必要がありました。