中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

Mongoクエリー・ベース・レプリケーション

レプリカセット間レプリケーション

MongoDBではレプリカセットを跨いでデータを同期する手段が無い。
そもそもレプリカセット自体が冗長構成を目的としているので設計に組み込まれていないのだろう。
しかし現実は Staging環境や、PV系/集計系の分離など、用途はある。


今は、レプリカセットのslaveを1台切り離してそこで何かするしかない。
フレッシュデータじゃないし運用も面倒。

monmo-repl

https://github.com/monmo/monmo-repl

なければ作れば良いので作った。

oplogベースの同期を行う。-s で指定したレプリカセットのPRIMARYのoplogを読み、-d で指定したレプリカセットに反映していく。
PRIMARYダウン時の挙動など、まだ未テストの部分は多いが

『とりあえず動く』

程度の完成度。

ReplicaSet1 =sync=> ReplicaSet2
[ 127.0.0.1 ]              [ 127.0.0.1 ]
  - 27017                     - 28017
  - 27018                     - 28018
  - 27019                     - 28019

./bin/monmo-repl.sh -s 127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019  -d 127.0.0.1:28017,127.0.0.1:28018,127.0.0.1:28019 -i

仕様

  • 例によって bash , mongo シェルしか要らない
  • 同期元のレプリカセットのmasterのoplogを読む(将来、選択可能になる可能性あり)
  • インデックスの同期はオプショナル(解析用には専用のindex持ちたいだろうし)
  • 起動時に完全同期オプション(-f) は遅い。。。
  • 同期対象DB を指定できる(デフォルト全て)