lxyuma BLOG

開発関係のメモ

mongoDBでReplica Setを使ってるときのversion upgrade

概要

ReplicaSetを組んだmongodbのversionを新しいものにupgradeするやり方のまとめ。

  • point

    • secondary(arbiter) -> primaryの順で、一台ずつ落としてbinを差し替えていく
    • secondaryを落としている時、primaryが動いているので、特にアプリに影響は無い
    • primaryはstepDown()でsecondaryにしてから落とす。このフェールオーバーが公式ページによると、約10秒程接続出来ない状態になる。(data少なければ数秒)
  • 公式

進め方

  1. oplogの確認
  2. backupをとる
  3. 最新をdownloadする
  4. shutdownする(primaryはstepDownしてから)
  5. bin/mongo*を書き換える
  6. 起動する

oplogの確認

SECONDARY> db.getReplicationInfo()
{
  "logSizeMB" : 12345.123456789,
    "usedMB" : 9999,
    "timeDiff" : 12345678,
    "timeDiffHours" : 1234,
    "tFirst" : "Thu Jun 14 2013 17:57:28 GMT+0900 (JST)",
    "tLast" : "Fri Jun 28 2013 09:57:44 GMT+0900 (JST)",
    "now" : "Fri Jun 28 2013 09:57:45 GMT+0900 (JST)"
}

このtFirstとtLastがoplogに入ってる初めと最後のレコード。

この間隔にダウンしてる作業時間が入れば、大丈夫。

  • この間隔がダウンタイムより短い(orギリギリで余裕ない)場合、

ダウンしてる間にoplogでどんどん古いデータが削除されているので、

復旧できないデータがでてしまう可能性がある。

(その時は、そもそもエラーが出てレプリケーションは停止するそう。MongDBインアクションP204参照)

そういう場合は、事前にoplogSizeを変えておく。

backup

$ mongodump --db db_name

※もし、ファイルコピーする場合、整合性注意。ロックが必要。

上記mongodumpなら、安心。だが、遅い。と、言われるが、実際俺の環境では数秒。

download

$ curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.4.tgz

$ tar zxf mongodb-linux-x86_64-2.4.4.tgz

$ rm -f mongodb-linux-x86_64-2.4.4.tgz

shutdown

  • 今のparameterを確認しておく
$ ps aux | grep mongo
  • secondaryの場合
$ mongo

 > db.shutdownServer()

※serviceならservice mongod stopを

  • primaryの場合

一旦、fail overさせてからshutdownする。

$ mongo

 > rs.stepDown()

 > db.shutdownServer()

rs.stepDown()について

  • rs.stepDown()してる時のfail overが、公式ページによると、約10秒かかる。

    • 公式PageのQA?に10sec〜30sec
    • stackoverflowで誰かが45secかかってた
    • 実際、data少なければ2,3秒で済む
  • エラー

rs.stepDown()中に以下のエラーが出るが、無視してよいらしい(?)

PRIMARY> rs.stepDown()
Fri Jun 28 10:47:30 DBClientCursor::init call() failed
Fri Jun 28 10:47:30 query failed : admin.$cmd { replSetStepDown: 60.0 } to: 127.0.0.1
Fri Jun 28 10:47:30 Error: error doing query: failed shell/collection.js:151
Fri Jun 28 10:47:30 trying reconnect to 127.0.0.1
Fri Jun 28 10:47:30 reconnect 127.0.0.1 ok

bin/mongoの入れ替え

  • 念のため古いversionのバックアップ
$ mkdir /tmp/mongo_bin_backup/

$ cp /usr/bin/mongo* /tmp/mongo_bin_backup/

$ cp /usr/bin/bsondump /tmp/mongo_bin_backup/
  • 新しいversionの上書き
$ cp -r /usr/bin/mongo* /tmp/mongo_bin_backup/

$ cp -r --force mongodb-linux-x86_64-2.4.0/bin/* /usr/bin/

このbinの上書きは他のbinにも影響ありそうで、ちょっと乱暴。

ここのページのように、dirでversion管理しておいた方が良いんだろうな。

この辺りは、各環境で微調整を。

起動

mongod (paramはshutdown前のparamを参考に)

serviceだったら、serviceとして起動。

参考

皆一緒。