2011-11-25 22 views
11

私が達成したいのは、Mongodbをもっと確実に起動する/etc/init.dスクリプトを、ハードにダウンしたとしても、システムの場合には自動修復を試みるべきですロック状態にある。生産中のMongodbの再起動/自動修復

はい、私はこれを自分でスクリプトすることができましたが、誰かがこれを既に実行しているに違いないと思います。

サーバがダウンした後、Mongodbは/etc/init.d/mongodスクリプトで再起動しない状態になっています。明らかに、ロックファイルは削除する必要があり、 - repairオプションで起動し、--dbpathを修正してから正常に再起動する必要があります。場合によっては、db-filesの所有権をmongodbを実行するユーザに変更する必要もあります。もう1つの問題は、標準の/etc/init.d/mongodスクリプトがこのような状況で失敗を報告するのではなく、Mongodが起動したことを報告する「OK」ステータスで喜んで、誤って返されることです。

$ sudo /etc/init.d/mongod start 
Starting mongod: forked process: 9220 
all output going to: /data/mongo/log/mongod.log 
                  [ OK ] 
$ sudo /etc/init.d/mongod status 
mongod dead but subsys locked 

OSはCentOSまたはFedoraです。

誰でも/etc/init.dスクリプトやそのようなスクリプトへのポインタを修正していますか?その状況で自動的に修復を試みますか?モンゴートの監視犬として機能する別のツールがありますか?

なぜmongodbを自動的に修復しようとすると悪い考えがあるのですか?

$ sudo /etc/init.d/mongod status 
mongod dead but subsys locked 

$ sudo ls -l /var/lib/mongo/mongod.lock 
-rw-r--r--. 1 mongod mongod 5 Nov 19 11:52 /var/lib/mongo/mongod.lock 


$ sudo tail -50 /data/mongo/log/mongod.log 
************** 
old lock file: /data/mongo/db/mongod.lock. probably means unclean shutdown 
recommend removing file and running --repair 
see: http://dochub.mongodb.org/core/repair for more information 
************* 
Sat Nov 19 11:55:44 exception in initAndListen std::exception: old lock file, terminating 
Sat Nov 19 11:55:44 dbexit: 

Sat Nov 19 11:55:44 shutdown: going to close listening sockets... 
Sat Nov 19 11:55:44 shutdown: going to flush oplog... 
Sat Nov 19 11:55:44 shutdown: going to close sockets... 
Sat Nov 19 11:55:44 shutdown: waiting for fs preallocator... 
Sat Nov 19 11:55:44 shutdown: closing all files... 
Sat Nov 19 11:55:44  closeAllFiles() finished 

Sat Nov 19 11:55:44 dbexit: really exiting now 

答えて

4

ので言及した最初のビットは、ジャーナリングです。ジャーナリングは、「高速修復」として効果的に請求されます。ジャーナリングはデフォルトで2.0以降で有効になっており、デフォルトでは「修復」が実行されます。

ディスクがジャーナリングの余分な書き込みスループットを処理できる場合、これが問題を解決する可能性があります。

なぜmongodbを自動的に修復しようとすると悪い考えがあるのですか?

自動的にMongoDBを修復する際の#1の問題は、単に時間の1つです。

あなたは200ギガバイトのデータベースを持っている場合、システムは以下の修理時に実行する必要があります:(?あなたはドライブの空き容量を持っていない

  1. ファイルの〜200ギガバイトを割り当てを
  2. のすべてを読みますメモリへの既存のファイルからのデータ(200GB read
  3. 200GB write)有効性のために、各ドキュメントをチェックして、戻って新しいファイルにそれを書く
  4. 再作成し、すべてのインデックス(ディスク

から)

  • フラッシュ、すべてあなたが修復を実行するには、ドライブのスラッシングの深刻な量だ私のノートを見れば。

    しかし、ほとんどの本番インストールではレプリカセットが実行されています。この場合、修復する代わりに、バックアップから復元するだけで済みます。バックアップからリストアするのは、データを一度書き込むだけです。すでに完了している必要があります。

    を返すinit.dスクリプトがあるにも関わらず、システムモニタリングでDBが起動していないことがわかります。

  • +0

    詳細な回答ありがとうございます。ジャーナリングは道に似ています..どのバージョンでジャーナリングを導入しましたか? – Tilo

    +2

    ジャーナリングは1.8+で導入されました。設定ファイルに 'journal = true'を設定するだけです。 2.0以降では、ジャーナリングはデフォルトで有効になっています。ジャーナリングは「無料」ではないことに注意してください。 32ビットでは動作しません。追加のRAM、追加のディスクスペース、追加のIOを使用します。 (カウンターのような)インプレース更新をたくさん行う場合、これは重要な意味を持つ可能性があります。したがって、生産に盲目的に押し込む前に、ジャーナルモードをテストしてください。 –

    +0

    偉大な答え!それは本当にスクリプトではありません:)ジャーナリングはおそらくトリックを行います。 32ビットは私の問題ではありません。ジャーナリングを試してみるよ!ご協力いただきありがとうございます! – Tilo

    1

    ジャーナリングは、が32ビット版で動作することを指摘したいだけです。ただし、デフォルトでは32ビットではオンになっていません。

    +0

    ジャーナリングは32ビット版で[デフォルトで無効になっています](http://www.mongodb.org/display/DOCS/Journaling#Journaling-32bitnuances%3F)ですが、有効にすることはできますが、データベースで使用できる(すでに制限されている)メモリの量を減らします。多くの[32ビットビルドの制限事項](http://www.mongodb.org/display/DOCS/32+bit)があり、常に64ビットをプロダクション用に使用する必要があります。 – Stennie

    +0

    あなたの答えには間違いなくタイプミスがあります... 32ビットと32ビットの違いは? ;) – Tilo

    +0

    Tilo、申し訳ありませんが、私の文言が "32ビット"を繰り返すことで厄介なものになってしまったのです。ジャーナリングは32ビット版で動作しますが、デフォルトではオンになっていません。 – user483263

    関連する問題