💽
MongoDBのデータ移行
はじめに
MongoDBの Change Data Capture (CDC) 機能を使うことになりました
Change Data Capture (CDC) を使う場合、レプリカセットまたはシャードクラスタ の構成にする必要があり、既存のMongoDBからデータ移行が発生します
本記事では、Kubernetes(k8s)上のMongoDBのデータ移行方法をまとめます
環境
項目 | バージョン |
---|---|
MongoDB | 6.0.5 |
事前準備
- 移行元: 単独構成のMongoDB
- 移行先: レプリカセット構成のMongoDB
データ容量ごとの推奨方法
AWS DMS などのクラウド移行ツールの実装例[1]から、データ容量毎の推奨の移行方法をまとめました
今回の対象データは 5G未満のため、 mongodump
+ mongorestore
を使って移行を行います
データ容量 | 推奨方法 | 備考 |
---|---|---|
〜5GB程度 |
mongodump / mongorestore
|
シンプルで高速。ダウンタイムも短く済む |
5GB〜50GB |
mongodump / mongorestore (可能)または mongoexport / mongoimport (CSV/JSON形式) |
スキーマ変換や部分移行が必要なら mongoexport 系も検討 |
50GB〜数百GB |
レプリカセット構成での直接同期 または バックアップ&リストア(Ops Manager / Cloud Manager) |
ダウンタイムを最小化したい場合はレプリカセットを使った移行が有効 |
1TB以上 |
ファイルベースのバックアップ(LVMスナップショットなど) または MongoDB Atlas Live Migration |
商用ツールやクラウド機能の活用が推奨される |
手順
1. mongo-tools用Podを作成
MongoDBのDocker Imageには mongodump
/ mongorestore
はデフォルトではインストールされていません
これらのツールは MongoDB Database Tools に含まれており、MongoDB サーバー本体とは別パッケージとして提供されています
MongoDB Database Tools を含む専用イメージを以下のDockerfileで作成します
FROM ubuntu:20.04
# MongoDB Database Tools のダウンロード URL(バージョンは適宜変更)
ENV MONGO_TOOLS_URL=https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2004-x86_64-100.7.1.deb
RUN apt-get update && \
apt-get install -y wget gnupg && \
wget $MONGO_TOOLS_URL -O /tmp/mongodb-tools.deb && \
apt install -y /tmp/mongodb-tools.deb && \
rm /tmp/mongodb-tools.deb
mongodb-tools
という名前でcontainer registryに登録し、k8sにPodを作成します
apiVersion: v1
kind: Pod
metadata:
name: mongo-tools
spec:
containers:
- name: mongo-tools
image: mongodb-tools:latest
command: ["sleep", "3600"]
restartPolicy: Never
2. dump & restore
Pod に入ってmongodump
/ mongorestore
コマンドを実行します
なお、ユーザ情報(admin.system.users)やロール情報(admin.system.roles )はデフォルトではdumpされません
また、restore中もCDCにデータが送信されるため、CDCは停止しておきましょう
kubectl exec -it mongo-tools -- bash
# ダンプ
mongodump --uri="mongodb://user:pass@mongodb-from:27017" --gzip --archive=/dump.gz
# リストア
mongorestore --uri="mongodb://user:pass@mongodb-to-cluster-svc:27017/?authSource=admin&replicaSet=rs0" --drop --gzip --archive=/dump.gz
まとめ
- 少量データの場合、
mongodump
/mongorestore
のコマンドで簡単にデータ移行が完了しました -
レプリカセット構成での直接同期
等も今後試してみようかと思います
Discussion