見出し画像

MongoDBから別環境のMongoDBへのリアルタイム同期

はじめに

複数環境のMongoDBのデータに対して、片方のDBから片方のDBへデータを同期するための方法です。

MongoDBのReplicaSetを構築することで双方向の同期ができますが、一方方向の同期を実現させるまでに時間がかかったので、まとめました。

結論

mongo-connectorがよさそう

背景

APIなどで提供されているデータを収集・分析するpythonライブラリを開発しています。

データベースにMongoDBを使用していますが、本番環境と開発環境でデータが異なることで開発がスムーズにいかないことが問題となっていました。

また、使用制限がかかっているAPIを使用しているコードが存在するため、単純に本番環境のコードを開発環境で実行することができないという制限がありました。

そこで、本番環境のデータを開発環境に同期することを検討しました。

1. mongodump

MongoDB標準ライブラリに含まれる、mongodumpとmongorestoreを使用する方法です。

$ mongodump --port 27017 -d test

bsonファイルが生成されるので、これを対象のサーバーに転送し、restoreします。

$ mongorestore --port 27017 -d test

この方法の問題点は3つあり

- dumpとrestoreに時間がかかる
- データの転送が遅い
- 手動実行する必要がある

という点がありました。

2. データ実ファイル移行

MongoDBのデータが格納されているファイルをそのまま移行or転送し、MongoDBを立ち上げることでデータの同期を行う方法です。

特に、データの移行や同期が比較的素早く行える環境にある場合(AWSのスナップショットを使用できるなどの場合)は、時間の問題は解決されます。

ある程度の時間間隔でデータの同期がとれれば良い場合、このケースを使用しても良いと思います。

3. mongo-connector

3つ目がpythonで作成されているライブラリmongo-connectorを使用する方法です。ReplicaSetのoplogを使用して、更新差分を取得し別のdatabaseへ移行することができます。

mongo-connectorが優れているところは、リアルタイム同期が可能な点にあります。更新差分を検知して自動で差分を適用してくれるだけでなく、プロセスを一時停止してもその時点から同期を再開してくれます。

python環境で動作するため、dockerを作成して動かすことにしました。

Dockerfile

FROM python:lastet
RUN pip install mongo-connector
ADD config.json /config.json

config.json

{
  "mainAddress": "mongodb://127.0.0.1:27017,127.0.0.2:27017,127.0.0.3:27017/?replicaSet=testRepl&readPreference=secondaryPreferred&connectTimeoutMS=100000",
  "verbosity": 2,
  "timezoneAware": true,
  "logging": {
    "type": "stream"
  },
  "docManagers": [
    {
      "docManager": "mongo_doc_manager",
      "targetURL": "mongodb://127.0.0.4:27017"
    }
  ]
}

同期元となるMongoDBはReplicaSetを構築する必要があります。DBが1台でもReplicaSetは構築可能です。

verbosityはlogレベルを指定しています。標準のlogレベルだとほとんど情報が出ないので、少し多めに情報を出力しています。

logging.type: "stream"はdockerで動かすため、logを標準出力に出すように設定しています。

設定が完了したら、適当なサーバー上でdockerを使用してmongo-connectorを動かします。

$ docker build . -t mongo-connector-image
$ docker run -d --rm --name mongo-connector-container mongo-connector-image mongo-connector -c /config.json

これでリアルタイムに同期を行ってくれます。ログを確認したい場合は

$ docker logs mongo-connector-container

で確認することができます。

同期元DBの変更差分(挿入や削除など)が同期先DBへ反映され、同期先DBの変更差分は同期元DBへ反映されていないことが確認できると思います。

また、1や2の方法と組み合わせて、先にデータの同期をまとめて完了した状態からmongo-connectorを起動すると最初のsetupの時間が短くなります。

おわりに

mongo-connectorはElasticsearchへデータを同期するために使われている印象を持っていましたが、MongoDB同士の同期をスムーズに行うことができました。

私が所属している株式会社ACESでは、Deep Learningを用いた画像認識技術を中心に、APIによるアルゴリズムパッケージの提供や、共同研究開発を行なっています。特に、ヒトの認識・解析に強みを持って研究開発を行っておりますので、ご興味のある方は、ぜひお問い合わせください!
【詳細・お問い合わせはこちら↓】

◆画像認識アルゴリズム「SHARON」について
ヒトの行動や感情の認識、モノの検知などを実現する画像認識アルゴリズムを開発しています。スポーツにおけるパフォーマンス分析やマーケティングにおけるヒトの心の動きの可視化、ストレスなどの可視化による健康状態の管理を始めとするAIアルゴリズムを提供しています。

この記事が気に入ったらサポートをしてみませんか?