このトピックでは、Robocopyツールを使用して、Apsara file Storage NAS (NAS) のServer Message Block (SMB) ファイルシステム間でデータを移行する方法について説明します。
前提条件
ソースSMBファイルシステムが作成され、データが格納されます。 SMBファイルシステム用に仮想プライベートクラウド (VPC) タイプのマウントターゲットが作成されます。
背景情報
Robocopyは、Windowsによって提供されるディレクトリコピーコマンドです。 不要な重複ファイルをコピーすることなく、同じファイル構造を持つ2つのイメージコピーを作成できます。 日付やタイムスタンプなど、関連するすべてのファイル情報を保持できます。
課金
NASファイルシステム間の移行には、次のコストがかかります。
データ転送の中間ノードとしてElastic Compute Service (ECS) インスタンスを使用する場合、インスタンス設定に基づいてECSインスタンスに対して課金されます。 ECSの課金の詳細については、「概要」をご参照ください。
2つのNASファイルシステムのストレージ使用量に対して課金されます。 ストレージ使用料を相殺するためにリソースプランを購入することを推奨します。 NASの課金の詳細については、「課金の概要」をご参照ください。
Cloud Enterprise Network (CEN) を使用してVPCを接続する場合、使用したトランジットルーターおよびリージョン間接続に対して課金されます。 CENの課金の詳細については、「課金ルール」をご参照ください。
始める前に
NASファイルシステム間でデータを移行する場合、ECSインスタンスはソースNASファイルシステムとターゲットNASファイルシステムの両方にアクセスできる必要があります。 したがって、ソースNASファイルシステムとターゲットNASファイルシステムに同じVPCからアクセスできることを確認する必要があります。
ソースファイルシステムのマウントターゲットに関する情報を表示します。
データを移行する前に、ソースファイルシステムのマウントターゲットとマウントターゲットが存在するVPCに関する情報を取得する必要があります。 詳細については、「マウントターゲットの表示」をご参照ください。
説明NFSファイルシステムのマウントターゲットがクラシックネットワークで作成されている場合、ファイルシステムのVPCにマウントターゲットを作成する必要があります。 詳細については、「マウントターゲットの作成」をご参照ください。
移行先ファイルシステムのマウント対象を設定します。
ファイルシステムは同じリージョンにあります。
移行先ファイルシステムと移行元ファイルシステムのマウントターゲットが同じVPCに属している場合、マウントターゲットに関する情報を取得してデータを移行できます。 詳細については、「データの移行」をご参照ください。
移行先ファイルシステムと移行元ファイルシステムのマウントターゲットが異なるVPCに属している場合、次のいずれかの方法でマウントターゲットを準備できます。
ターゲットリージョンとゾーンにファイルシステムを作成します。 ファイルシステムのマウントターゲットが自動的に作成されます。 詳細については、「NASコンソールでの汎用NASファイルシステムの作成」をご参照ください。
説明SMBプロトコルで従量課金の汎用NASファイルシステム (容量、パフォーマンス、またはプレミアム) を購入する場合は、ソースマウントターゲットで使用されるVPCとvSwitchを選択します。 ファイルシステムのマウントターゲットが自動的に作成されます。 ファイルシステムを作成した後、リソースプランを購入して、ファイルシステムのストレージ使用料を相殺することができます。
ターゲットファイルシステムのマウントターゲットを作成します。 詳細については、「マウントターゲットの作成」をご参照ください。
CENを使用して、移行先マウントターゲットと移行元マウントターゲットのVPCを接続します。 詳細については、「CENを使用した同じリージョンのVPC間のNASファイルシステムのマウント」をご参照ください。
ファイルシステムは、異なるアカウントに属するか、異なるリージョンに存在します。
ターゲットファイルシステムとソースファイルシステムのマウントターゲットが異なるアカウントに属している場合、または異なるリージョンにある場合は、CENを使用してVPCを接続する必要があります。 詳細については、「CENを使用したアカウントとリージョン間のNASファイルシステムのマウント」をご参照ください。
データの移行
移行元と移行先のマウントターゲットを準備したら、新しいECSインスタンスを購入し、ECSインスタンスに2つのSMBファイルシステムをマウントしてから、Robocopyツールを使用してデータを複製します。 データを移行するには、次の手順を実行します。
ソースとターゲットのファイルシステムをECSインスタンスにマウントします。
重要データを移行する場合は、新しいECSインスタンスを購入することを推奨します。 既存のECSインスタンスを使用してデータを移行する場合、移行タスクは、実行中のワークロードに割り当てられているCPUおよびネットワーク帯域幅リソースを消費する可能性があります。
ECSコンソールにログインし、[インスタンスの作成] をクリックします。 表示されるページで、次のパラメーターを設定します。
リージョン: ソースファイルシステムが存在するリージョンを選択します。
ネットワークとゾーン: ソースファイルシステムが存在するVPCとゾーンを選択します。
インスタンス: 最小仕様を選択します。
イメージ: Windows Serverのバージョンを選択します。 Windows Server 2019を選択することを推奨します。
ストレージ: [NASファイルシステム (オプション)] をクリックし、[ファイルシステムの追加] をクリックします。 次の図は、詳細な設定を示しています。
説明ソースと宛先のマウントターゲットが同じVPCにある場合、ECS購入ページでNASファイルシステムのマウント情報を設定できます。 ECSインスタンスを起動すると、ソースNASファイルシステムとターゲットNASファイルシステムが自動的にインスタンスにマウントされます。
ソースマウントターゲットとターゲットマウントターゲットが異なるVPC、リージョン、またはアカウントに属している場合、ECS購入ページでソースファイルシステムを設定するだけで済みます。 ECSインスタンスを作成した後、ターゲットファイルシステムを手動でECSインスタンスにマウントできます。 詳細については、「SMB ファイルシステムのマウント」をご参照ください。
ECSインスタンスを作成し、ECSインスタンスにソースNASファイルシステムとターゲットNASファイルシステムをマウントした後、次のコマンドを実行して、マウントが成功したかどうかを確認します。
net use
次のような出力が表示された場合、ファイルシステムがマウントされます。 ソースファイルシステムはディスクZにマウントされ、デスティネーションファイルシステムはディスクYにマウントされます。
Status Local Remote Network ------------------------------------------------------------------------------ OK Y: \\29e9c24****-eab13.cn-wulanchabu.nas.aliyuncs.com\myshare MicrosoftWindowgNetwork OK Z: \\29fe7f4****-txr31.cn-wulanchabu.nas.aliyuncs.com\myshare MicrosoftWindowgNetwork
データを移行します。
次のコマンドを実行して、ソースファイルシステム (ディスクZ) からターゲットファイルシステム (ディスクY) にデータを移行します。
robocopy Z:\ Y:\ /e /w:5 /z /mt:32
説明指定されたディレクトリ内のデータのみが移行されます。 ディレクトリは移行されません。
下表に、各パラメーターを説明します。 パラメータの値を実際の値に置き換えます。
パラメーター
説明
/mt
同時スレッドの数を指定します。 デフォルト値: 8。
有効な値: 1 ~ 128
この例では、32スレッドがマルチスレッドレプリケーションに使用されます。
/w
エラーによる2回の連続した再試行の間の秒数を指定します。
/z
再開可能なアップロードを有効にします。
/e
空のディレクトリを含むすべてのサブディレクトリをコピーします。
/copyall
すべてのファイル情報をコピーします。 情報には次の項目が含まれます。
Data
Attributes
Timestamp
アクセス制御リスト (ACL)
オーナー情報
監査情報
説明10テラバイトを超える数億の小さなファイルなど、大量のデータの移行を高速化する場合は、Windows ECSインスタンスに最新のPythonプログラムをインストールできます。 詳細については、「SMBファイルシステムへのデータ移行を高速化するにはどうすればよいですか?」をご参照ください。
移行結果を確認します。
データ移行が完了したら、次のコマンドを実行して、ターゲットファイルシステムに格納されているデータが、ソースファイルシステムに格納されているデータと一致しているかどうかを確認します。
ROBOCOPY Z:\ Y:\ /e /l /ns /njs /njh /ndl /fp /log:reconcile.txt
下表に、各パラメーターを説明します。 パラメータの値を実際の値に置き換えます。
/e: 空のディレクトリを含むディレクトリのみを一覧表示します。
/l: ファイルを変更またはコピーせずに差分を記録します。
/fp: ログ内のファイルの完全なパスが含まれます。 このパラメーターは、/ndlパラメーターが指定されていない場合にのみ必要です。
/ns: ログにファイルサイズは含まれません。
/ndl: ログにフォルダは含まれません。
/njs: ジョブの概要は含まれません。
/njh: ジョブヘッダーは含まれません。
/log:reconcile.txt: 移行結果をreconcile.txtログファイルに書き込みます。 移行結果がすでにログファイルに存在する場合、既存のコンテンツは上書きされます。
ワークロードを新しいファイルシステムに切り替える
データの移行後に現在のワークロードを元のファイルシステムから新しいファイルシステムに切り替える場合は、すべてのECSインスタンスとコンテナから元のファイルシステムをアンマウントし、新しいファイルシステムをインスタンスとコンテナにマウントします。
新しいファイルシステムをECSインスタンスにマウントするには、次の手順を実行します。
net use
コマンドを実行して、既存のNASファイルシステムのマウント情報を取得します。 ファイルシステムがマウントされているローカルドライブ文字をメモします。次のコマンドを実行して、元のファイルシステムをアンマウントします。
net use Z: /delete
ドライブ文字Z: を環境固有のドライブ文字に置き換えます。
説明net use * /delete コマンドでは、利用可能な Windows 内のファイルシステムを 1 つずつアンマウントできます。
net use * /delete /y コマンドでは、Windows 内のすべてのファイルシステムを確認なしでアンマウントできます。
新しいファイルシステムを元のドライブ文字にマウントします。 詳細については、「SMB ファイルシステムのマウント」をご参照ください。
新しいファイルシステムにアクセスするプロセスを再起動して、プロセスがファイルシステムに対して期待どおりに読み取りおよび書き込み操作を実行できるかどうかを確認します。
元のマウントターゲットを新しいマウントターゲットに置き換えて、auto_mount.batファイルの自動マウント情報を変更します。
新しいファイルシステムをWindowsコンテナにマウントするには、次の手順を実行します。
元のマウントターゲットを新しいマウントターゲットに置き換えて、YAML構成ファイルを変更します。
変更した構成ファイルを使用して新しいポッドを生成します。 新しいファイルシステムがポッドにマウントされており、ポッドがファイルシステムに対して期待どおりに読み取りおよび書き込み操作を実行できることを確認します。
元のファイルシステムを使用するすべてのポッドをリサイクルします。
ワークロードを新しいファイルシステムに切り替えた後、元のファイルシステムに保存されているデータを少なくとも1週間保持します。 元のファイルシステムからすぐにデータを削除すると、誤った削除や誤った同期によりデータが失われる可能性があります。
よくある質問
SMBファイルシステムへのデータ移行を高速化するにはどうすればよいですか?
大量のビジネスデータをSMBファイルシステムに書き込み、大量のデータの移行を高速化する必要がある場合があります。たとえば、10テラバイトを超える数億の小さなファイル (各ファイルは約100 KB) です。 この場合、Windows ECSインスタンスに最新のPythonプログラムをインストールできます。 次の手順を実行する必要があります。
ダウンロード、最新のPythonプログラムをインストールします。
システム環境変数PATHをPython実行パスに設定します (例: C:\Python27) 。
set PATH=%PATH%;C:\python27
次の図に示すように、
where python
コマンドを実行して、Pythonのインストールパスを表示することもできます。migration.pyスクリプトをECSインスタンスのローカルディレクトリにコピーします。C:\.
#!/usr/bin/python import os import random import string import sys, getopt import datetime import time def execute_cmd(cmd): print('\tExecuting cmd: %s' % cmd) count = 0 rc = 0 while (count < 3*60): rc = os.system(cmd) if (rc != 0): count += 1 time.sleep(1) continue else: break if rc != 0: print('\tFailed to execute cmd: %s. rc:%d' %(cmd, rc)) return def migrate_subdirs(srcPath, dstPath, rangeBegin, rangeEnd, ignoreFile): currTimeStr = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S") print('Start to migrate from %s to %s for subdir range[%s, %s] at %s.\n' %(srcPath, dstPath, rangeBegin, rangeEnd, currTimeStr)) index = 0 for entry in os.listdir(srcPath): if os.path.isdir(os.path.join(srcPath, entry)): if index >= rangeBegin and index <= rangeEnd: srcSubDir = srcPath + "\\" + entry dstSubDir = dstPath + "\\" + entry print('\tBegin of migrating from the %d th dir %s to %s.' %(index, srcSubDir, dstSubDir)) cmd = "robocopy \"" + srcSubDir + "\" \"" + dstSubDir + "\" /e /w:5 /z /mt:32" if ignoreFile.strip(): cmd += " /XF \"" + ignoreFile + "\"" cmd += " >> robocopy.log" execute_cmd(cmd) print('\tEnd of migrating from %s to %s.\n' %(srcSubDir, dstSubDir)) index += 1 print('Finish to migrate from %s to %s for subdir range[%s, %s] at %s.\n' %(srcPath, dstPath, rangeBegin, rangeEnd, datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S"))) def migrate_regfiles(srcPath, dstPath, ignoreFile): currTimeStr = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S") print('Start to migrate from %s to %s for regular files at %s.\n' %(srcPath, dstPath, currTimeStr)) for entry in os.listdir(srcPath): if os.path.isfile(os.path.join(srcPath, entry)): print('\tBegin of migrating %s from %s to %s.\n' %(entry, srcPath, dstPath)) cmd = "attrib -R \"" + dstPath + "\\\\" + entry + "\"" execute_cmd(cmd) cmd = "copy \"" + srcPath + "\\\\" + entry + "\" \"" + dstPath + "\" /Y" if ignoreFile.strip(): cmd += " /XF \"" + ignoreFile + "\"" cmd += " >> robocopy.log" execute_cmd(cmd) print('\tEnd of migrating %s from %s to %s' %(entry, srcPath, dstPath)) print('Finish to migrate from %s to %s for regular files at %s.\n' %(srcPath, dstPath, datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S"))) def main(argv): srcPath = '' dstPath = '' range = '' ignoreFile = '' try: opts, args = getopt.getopt(argv,"hs:d:r:i:f",["srcPath=","dstPath=","range=","ignore="]) except getopt.GetoptError: print('migration.py -s <source path> -d <destination path> [-r BeginIndex:EndIndex | -f] [-i ignoredFile]') print('example: migration.py -s x:\pic -d z:\pic [-r 0:100]') sys.exit(2) subdironly = False fileonly = False for opt, arg in opts: if opt == '-h': print('migration.py -s <source path> -d <destination path> [-r BeginIndex:EndIndex | -f] [-i ignoredFile]') sys.exit() elif opt in ("-s", "--srcPath"): srcPath = arg elif opt in ("-d", "--dstPath"): dstPath = arg elif opt in ("-r", "--range"): range = arg subdironly = True elif opt in ("-f", "--file"): fileonly = True elif opt in ("-i", "--ignore"): ignoreFile = arg if not srcPath.strip() or not dstPath.strip(): print('migration.py -s <source path> -d <destination path> [-r BeginIndex:EndIndex | -f] [-i ignoredFile]') sys.exit() if subdironly and fileonly: print('migration.py -s <source path> -d <destination path> [-r BeginIndex:EndIndex | -f] [-i ignoredFile]') sys.exit() if not fileonly: if not range.strip(): rangeBegin = 0 rangeEnd = sys.maxsize-1 else: rangeBegin, rangeEnd = (int(x) for x in range.split(":")) if rangeBegin < 0 or rangeEnd >= sys.maxsize or rangeEnd < rangeBegin: print('migration.py -s <source path> -d <destination path> [-r BeginIndex:EndIndex | -f] [-i ignoredFile]') print('example: migration.py -s x:\pic -d z:\pic -r 0:99') sys.exit() migrate_subdirs(srcPath, dstPath, rangeBegin, rangeEnd, ignoreFile) if not subdironly: migrate_regfiles(srcPath, dstPath, ignoreFile) if __name__ == "__main__": main(sys.argv[1:])
データを移行します。 コマンド構文:
python。/migration.py -s <ソースパス> -d <宛先パス> [-r BeginIndex:EndIndex | -f] [-i ignoredFile]
.下表に、各パラメーターを説明します。
パラメーター
説明
-s <ソースパス>
ソースファイルシステムのマウントターゲットのディレクトリ。 たとえば、
-s Z:\
は、ソースファイルシステムのマウントターゲットにZドライブのルートディレクトリが指定されていることを示します。-d <宛先パス>
移行先ファイルシステムのマウント対象のディレクトリ。 たとえば、
-d Y:\
は、移動先ファイルシステムのマウント対象にYドライブのルートディレクトリが指定されていることを示します。-r BeginIndex:EndIndex
移行するファイルの範囲 (
BeginIndex
からEndIndex
) 。 たとえば、-r 1:100
は、1から100までのファイルが移行されることを示します。-f
ソースファイルシステムのディレクトリの最初のレベルにある通常のファイルのみを移行するように指定します。
ソースファイルシステム内のすべてのファイルを移行する場合は、-rおよび-fパラメーターを無視してください。
-i ignoredFile
ソースファイルシステムのディレクトリに移行する必要のないファイルを指定します。 たとえば、
-i ignored.txt
は、ignored.txt
という名前のファイルが移行されていないことを示します。説明デフォルトでは、-rまたは -fパラメーターを指定する必要はありません。 スクリプトは自動的にすべてのサブディレクトリをコピーし、最初のレベルで通常のファイルをコピーします。 複数のクライアントのcpu/networkディレクトリを使用して異なるサブディレクトリの移行を同時に高速化し、すべてのクライアントが同じソースディスクにアクセスできる場合は、サブディレクトリの範囲を指定できます。たとえば、最初のクライアントで使用する
-r 0:9999
、2番目のクライアントで使用する-r 10000:19999
です。たとえば、移行元ファイルシステムのZ:\ ディレクトリから移行先ファイルシステムのY:\ ディレクトリにデータを移行できます。 サンプルコマンド:
python ./migration.py -s Z:\ -d Y:\