mongoDBでReplica Setを使ってるときのversion upgrade
概要
ReplicaSetを組んだmongodbのversionを新しいものにupgradeするやり方のまとめ。
point
- secondary(arbiter) -> primaryの順で、一台ずつ落としてbinを差し替えていく
- secondaryを落としている時、primaryが動いているので、特にアプリに影響は無い
- primaryはstepDown()でsecondaryにしてから落とす。このフェールオーバーが公式ページによると、約10秒程接続出来ない状態になる。(data少なければ数秒)
公式
進め方
- oplogの確認
- backupをとる
- 最新をdownloadする
- shutdownする(primaryはstepDownしてから)
- bin/mongo*を書き換える
- 起動する
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として起動。
参考
皆一緒。