NimoShake(DynamoShake とも呼ばれます)は、Alibaba Cloud によって開発されたデータ同期ツールです。 Amazon DynamoDB データベースを Alibaba Cloud に移行できます。
前提条件
ApsaraDB for MongoDB インスタンスが作成されていること。 詳細については、「レプリカセットインスタンスを作成する」または「シャーディングクラスタインスタンスを作成する」をご参照ください。
背景情報
NimoShake は、主に Amazon DynamoDB データベースからの移行用に設計されています。 移行先は ApsaraDB for MongoDB データベースである必要があります。詳細については、「NimoShake の概要」をご参照ください。
重要な考慮事項
リソース消費。 完全なデータ移行では、ソースデータベースとターゲットデータベースの両方でリソースが消費されます。 これにより、データベースサーバーの負荷が増加する可能性があります。 データベースのトラフィックが多い場合、またはサーバーの仕様が非常に低い場合は、データベースの負荷が増加する可能性があります。 データを移行する前に、パフォーマンスへの潜在的な影響を慎重に評価し、ピーク時以外の時間にマイグレーションを実行することを強くお勧めします。
ストレージ容量。 ApsaraDB for MongoDB インスタンスのストレージ容量が Amazon DynamoDB データベースのストレージ容量よりも大きいことを確認してください。
主な用語
再開可能な転送: この機能は、転送のためにタスクを複数の部分に分割します。 ネットワーク障害などの理由で転送が中断された場合、タスクは最初からやり直すのではなく、中断したところから再開できます。
説明完全移行では、再開可能な転送はサポートされていません。
増分移行では、再開可能な転送がサポートされています。 増分同期の接続が短期間で失われて回復した場合、同期は継続できます。 ただし、長時間切断された場合や以前のチェックポイントが失われた場合など、特定の状況では、完全同期が再度トリガーされる場合があります。
チェックポイント: 増分同期の再開可能な転送は、チェックポイントによって実現されます。 デフォルトでは、チェックポイントはターゲット MongoDB データベース、具体的には
nimo-shake-checkpointという名前のデータベースに書き込まれます。 各コレクションは独自のチェックポイントテーブルを記録し、status_tableは現在の同期が完全タスクか増分タスクかを記録します。
NimoShake の機能
NimoShake は現在、2 つのステップで実行される分離された同期メカニズムをサポートしています。
完全データ移行。
増分データ移行。
完全移行
完全移行は、データ移行とインデックス移行の 2 つの部分で構成されます。 次の図は、基本的なアーキテクチャを示しています。
データ移行: NimoShake は、複数の同時スレッドを使用してソースデータを取得します。次の図を参照してください。
スレッド
説明
Fetcher
Amazon が提供するプロトコル変換ドライバーを呼び出して、ソーステーブルからデータをバッチ取得し、すべてのソースデータが取得されるまでキューに配置します。
説明Fetcher スレッドは 1 つだけ提供されます。
Parser
キューからデータを読み取り、BSON 構造に解析します。 データが解析されると、パーサーはデータを Executor のスレッドに書き込みます。 複数のパーサースレッドを開始できます。 デフォルト値は 2 です。
FullDocumentParserパラメーターを使用して、パーサースレッドの数を調整します。Executor
キューからデータを取得し、データを集約してターゲット ApsaraDB for MongoDB データベースに書き込みます。 最大 16 MB のデータまたは 1,024 エントリを集約できます。 複数の Executor スレッドを開始できます。 デフォルト値は 4 です。
FullDocumentConcurrencyパラメーターを使用して、Executor スレッドの数を調整します。インデックス移行: NimoShake は、データ移行の完了後にインデックスを作成します。 インデックスは、自動生成インデックスとユーザー作成インデックスに分類されます。
自動生成インデックス:
パーティションキーとソートキーがある場合、NimoShake は一意な複合インデックスを作成し、MongoDB に書き込みます。
NimoShake は、パーティションキーのハッシュインデックスも作成し、MongoDB に書き込みます。
パーティションキーのみがある場合、NimoShake は MongoDB にハッシュインデックスと一意なインデックスを作成します。
ユーザー作成インデックス: ユーザー作成インデックスがある場合、NimoShake はプライマリキーに基づいてハッシュインデックスを作成し、ターゲット ApsaraDB for MongoDB データベースに書き込みます。
増分移行
増分移行はデータのみを同期します。増分同期プロセス中に生成されたインデックスは同期しません。 基本的なアーキテクチャは次のとおりです。
スレッド | 説明 |
Fetcher | ストリーム内のシャードの変更を監視します。 |
Manager | メッセージ通知と Dispatcher の作成を管理します。 各シャードは 1 つの Dispatcher に対応します。 |
Dispatcher | ソースから増分データを取得します。 再開可能な転送の場合、データの取得は最初からではなく、最後のチェックポイントから再開されます。 |
Batcher | Dispatcher スレッドによって取得された増分データを解析、パッケージ化、および集約します。 |
Executor | 集約されたデータをターゲット ApsaraDB for MongoDB データベースに書き込み、チェックポイントを更新します。 |
手順: Amazon DynamoDB から Alibaba Cloud に移行する (Ubuntu の例)
このセクションでは、Ubuntu システムを例として使用して、NimoShake を使用して Amazon DynamoDB データベースを ApsaraDB for MongoDB に移行する方法を示します。
NimoShake をダウンロードする: 次のコマンドを実行して、NimoShake パッケージをダウンロードします。
wget https://github.com/alibaba/NimoShake/releases/download/release-v1.0.14-20250704/nimo-shake-v1.0.14.tar.gz説明最新バージョンの NimoShake パッケージをダウンロードすることをお勧めします。
パッケージを解凍する: 次のコマンドを実行して、NimoShake パッケージを解凍します。
tar zxvf nimo-shake-v1.0.14.tar.gzディレクトリにアクセスする: 解凍後、
cd nimo-shake-v1.0.14コマンドを実行して、nimoフォルダーに移動します。構成ファイルを開く:
vi nimo-shake.confコマンドを実行して、NimoShake 構成ファイルを開きます。NimoShake を構成する:
nimo-shake.confファイル内のパラメーターを構成します。 次の表に、各構成項目を示します。パラメーター
説明
例
id
移行タスクの ID。 これはカスタマイズ可能で、PID ファイル、ログ名、チェックポイントストレージのデータベース名、およびターゲットデータベース名の出力に使用されます。
id = nimo-shakelog.file
ログファイルのパス。 このパラメーターが構成されていない場合、ログは
stdoutに表示されます。log.file = nimo-shake.loglog.level
ログレベル。 有効な値:
none: ログなしerror: エラーメッセージwarn: 警告情報info: システムステータスdebug: デバッグ情報
デフォルト値:
info。log.level = infolog.buffer
ログバッファリングを有効にするかどうかを指定します。 有効な値:
true: ログバッファリングが有効です。 ログバッファリングにより高パフォーマンスが保証されますが、終了時に最新のログエントリの一部が失われる可能性があります。false: ログバッファリングが無効です。 無効にすると、パフォーマンスが低下する可能性があります。 ただし、すべてのログエントリは終了時に表示されます。
デフォルト値:
true。log.buffer = truesystem_profile
PPROF ポート。デバッグとスタックフルコルーチン情報の表示に使用されます。
system_profile = 9330full_sync.http_port
完全移行フェーズの RESTful ポート。
curlを使用して、内部監視統計を表示します。 詳細については、wiki を参照してください。full_sync.http_port = 9341incr_sync.http_port
増分移行フェーズの RESTful ポート。
curlを使用して、内部監視統計を表示します。 詳細については、wiki を参照してください。incr_sync.http_port = 9340sync_mode
データ移行のタイプ。 有効な値:
all: 完全移行と増分移行full: 完全移行のみ
デフォルト値:
all。説明ソースが DynamoDB プロトコルと互換性のある ApsaraDB for MongoDB インスタンスの場合、
fullのみがサポートされます。sync_mode = allincr_sync_parallel
並列増分移行を実行するかどうかを指定します。 有効な値:
true: 並列増分移行が有効です。 これにより、より多くのメモリが消費されます。false: 並列増分移行が無効です。
デフォルト値:
false。incr_sync_parallel = falsesource.access_key_id
Amazon DynamoDB データベースの AccessKey ID。
source.access_key_id = xxxxxxxxxxxsource.secret_access_key
Amazon DynamoDB データベースの AccessKey シークレット。
source.secret_access_key = xxxxxxxxxxsource.session_token
Amazon DynamoDB データベースにアクセスするための一時キー。 一時キーを使用しない場合はオプションです。
source.session_token = xxxxxxxxxxsource.region
Amazon DynamoDB データベースのリージョン。 リージョンが適用されないか、自動検出される場合はオプションです。
source.region = us-east-2source.endpoint_url
ソースがエンドポイントタイプの場合は構成可能です。
重要このパラメーターを有効にすると、上記のソース関連パラメーターがオーバーライドされます。
source.endpoint_url = "http://192.168.0.1:1010"source.session.max_retries
セッション失敗後の最大再試行回数。
source.session.max_retries = 3source.session.timeout
セッションタイムアウト期間。
0は、セッションタイムアウトが無効になっていることを示します。 単位: ミリ秒。source.session.timeout = 3000filter.collection.white
移行するコレクション名のホワイトリスト。 たとえば、
filter.collection.white = c1;c2は、c1コレクションとc2コレクションが移行され、他のコレクションは除外されることを示します。filter.collection.white = c1;c2filter.collection.black
除外するコレクションの名前。 たとえば、
filter.collection.black = c1;c2は、c1コレクションとc2コレクションが除外され、他のコレクションは移行されることを示します。重要filter.collection.whiteと同時に使用することはできません。 両方が指定されている場合、すべてのコレクションが移行されます。filter.collection.black = c1;c2qps.full
完全移行中に
Scanコマンドの実行頻度を制限します(1 秒あたりの最大呼び出し回数)。デフォルト値: 1000。
qps.full = 1000qps.full.batch_num
完全移行中に 1 秒あたりに取得するデータエントリの数。
デフォルト値: 128。
qps.full.batch_num = 128qps.incr
増分移行中に
GetRecordsコマンドの実行頻度を制限します(1 秒あたりの最大呼び出し回数)。デフォルト値: 1000。
qps.incr = 1000qps.incr.batch_num
増分移行で 1 秒あたりに取得するデータエントリの数。
デフォルト値: 128。
qps.incr.batch_num = 128target.type
ターゲットデータベースのタイプ。有効な値:
mongodb: ApsaraDB for MongoDB インスタンス。aliyun_dynamo_proxy: DynamoDB 互換 ApsaraDB for MongoDB インスタンス。
target.type = mongodbtarget.address
ターゲットデータベースの接続文字列。MongoDB 接続文字列と DynamoDB 互換接続アドレスをサポートします。
MongoDB アドレスの詳細については、「レプリカセットインスタンスに接続する」または「シャーディングクラスタインスタンスに接続する」を参照してください。
target.address = mongodb://username:password@s-*****-pub.mongodb.rds.aliyuncs.com:3717target.mongodb.type
ターゲット ApsaraDB for MongoDB インスタンスのタイプ。 有効な値:
replica: レプリカセットインスタンス。sharding: シャーディングクラスタインスタンス。
target.mongodb.type = shardingtarget.db.exist
ターゲットで同じ名前の既存のコレクションを処理する方法を指定します。 有効な値:
rename: NimoShake は、タイムスタンプサフィックスを名前に追加することで、既存のコレクションの名前を変更します。 たとえば、NimoShake は c1 を c1.2019-07-01Z12:10:11 に変更します。警告これはビジネスに影響を与える可能性があります。 事前に準備してください。
drop: ターゲットの既存のコレクションを削除します。
構成されていない場合、ターゲットに同じ名前のコレクションがすでに存在すると、移行はエラーで終了します。
target.db.exist = dropsync_schema_only
テーブルスキーマのみを移行するかどうかを指定します。 有効な値:
true: テーブルスキーマのみが移行されます。false: False。
デフォルト値:
false。sync_schema_only = falsefull.concurrency
完全移行で同時に移行できるコレクションの最大数。
デフォルト値: 4。
full.concurrency = 4full.read.concurrency
完全移行中のテーブル内のドキュメントレベルの同時実行性。 このパラメーターは、単一のテーブルのソースから同時に読み取ることができるスレッドの最大数を示し、Scan インターフェースの TotalSegments パラメーターに対応します。
完全移行中に、ソースの単一テーブルからドキュメントを同時に読み取る同時スレッドの数。 Scan インターフェースの TotalSegments パラメーターに対応します。
full.read.concurrency = 1full.document.concurrency
完全移行のパラメーター。 完全移行中に、単一テーブルのドキュメントをターゲットに書き込む同時スレッドの数。 デフォルト: 4
デフォルト値: 4。
full.document.concurrency = 4full.document.write.batch
一度に集約して書き込むデータエントリの数。 ターゲットが DynamoDB プロトコル互換データベースの場合、最大値は 25 です。
full.document.write.batch = 25full.document.parser
完全移行のパラメーター。 DynamoDB プロトコルデータをターゲットの対応するプロトコルに変換する同時パーサースレッドの数。
デフォルト値: 2。
full.document.parser = 2full.enable_index.user
完全移行のパラメーター。 ユーザー定義のインデックスを移行するかどうかを指定します。 有効な値:
true: はい。false: いいえ。
デフォルト値:
true。full.enable_index.user = truefull.executor.insert_on_dup_update
完全移行のパラメーター。 ターゲットで重複キーが発生した場合に、
INSERT操作をUPDATE操作に変更するかどうかを指定します。 有効な値:true: はい。false: いいえ。
デフォルト値:
true。full.executor.insert_on_dup_update = trueincrease.concurrency
増分移行のパラメーター。 同時にキャプチャできるシャードの最大数。
デフォルト値: 16。
increase.concurrency = 16increase.executor.insert_on_dup_update
増分移行のパラメーター。 ターゲットに同じキーが存在する場合に、
INSERT操作をUPDATE操作に変更するかどうかを指定します。 有効な値:true: はい。false: いいえ。
デフォルト値:
true。increase.executor.insert_on_dup_update = trueincrease.executor.upsert
増分移行のパラメーター。 ターゲットでキーが見つからない場合に、
UPDATE操作をUPSERT操作に変更するかどうかを指定します。 有効な値:true: はいfalse: いいえ
説明UPSERT操作は、指定されたキーが存在するかどうかを確認します。 存在する場合、UPDATE操作が実行されます。 それ以外の場合、INSERT操作が実行されます。increase.executor.upsert = truecheckpoint.type
再開可能な転送(チェックポイント)情報のストレージタイプ。 有効な値:
mongodb: チェックポイント情報は ApsaraDB for MongoDB データベースに保存されます。 この値は、target.typeパラメーターがmongodbに設定されている場合にのみ使用できます。file: チェックポイント情報はコンピューターに保存されます。
checkpoint.type = mongodbcheckpoint.address
チェックポイント情報を保存するアドレス。
checkpoint.typeパラメーターがmongodbに設定されている場合は、ApsaraDB for MongoDB データベースの接続文字列を入力します。 構成されていない場合、チェックポイント情報はターゲット ApsaraDB for MongoDB データベースに保存されます。 詳細については、「レプリカセットインスタンスに接続する」または「シャーディングクラスタインスタンスに接続する」を参照してください。checkpoint.typeパラメーターがfileに設定されている場合は、相対パス(チェックポイントなど)を入力します。 構成されていない場合、デフォルトでは NimoShake 実行可能ファイルに対する相対パスのチェックポイントフォルダーになります。
checkpoint.address = mongodb://username:password@s-*****-pub.mongodb.rds.aliyuncs.com:3717checkpoint.db
チェックポイント情報のデータベースの名前。 構成されていない場合、データベース名は
<id>-checkpoint形式になります。例:
nimo-shake-checkpoint。checkpoint.db = nimo-shake-checkpointconvert._id
DynamoDB の
_idフィールドにプレフィックスを追加して、MongoDB の_idフィールドとの競合を回避します。convert._id = prefull.read.filter_expression
完全移行中にフィルタリングに使用する DynamoDB 式。
:beginと:endは、コロンで始まる変数です。 実際の値は、filter_attributevaluesで指定されます。full.read.filter_expression = create_time > :begin AND create_time < :endfull.read.filter_attributevalues
完全移行フィルタリングの
filter_expressionの変数に対応する値。Nは Number を表し、Sは String を表します。full.read.filter_attributevalues = begin```N```1646724207280~~~end```N```1646724207283移行を開始する: 次のコマンドを実行して、構成済みの
nimo-shake.confファイルを使用してデータ移行を開始します。./nimo-shake.linux -conf=nimo-shake.conf説明完全移行が完了すると、
full sync done!と表示されます。 エラーが原因で移行が終了した場合、プログラムは自動的に閉じられ、対応するエラーメッセージが出力されてトラブルシューティングに役立ちます。