💽

MongoDBのデータ移行

に公開

はじめに

MongoDBの Change Data Capture (CDC) 機能を使うことになりました
Change Data Capture (CDC) を使う場合、レプリカセットまたはシャードクラスタ の構成にする必要があり、既存のMongoDBからデータ移行が発生します
本記事では、Kubernetes(k8s)上のMongoDBのデータ移行方法をまとめます

環境

項目 バージョン
MongoDB 6.0.5

事前準備

  1. 移行元: 単独構成のMongoDB
  2. 移行先: レプリカセット構成の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のコマンドで簡単にデータ移行が完了しました
  • レプリカセット構成での直接同期等も今後試してみようかと思います
脚注
  1. AWS DMS による MongoDB 移行の実例 ↩︎

セリオ株式会社 テックブログ

Discussion