AlibabaCloudへのマイグレーション -ストレージ編-

こんにちは!SBクラウドソリューションアーキテクトLeoです。現在マイグレーションをテーマにした投稿をしております。当記事はその第2段!オブジェクトストレージ編です。

アプリのバックアップ等で用いているストレージをAlibaba Cloud OSS(Object Storage Service)へマイグレーションする際の方法を簡単にご紹介していきます。

その他サーバーやDBに関しては他の手法も別記事でご紹介いたします。ぜひご覧ください!

 

AlibabaCloudへのマイグレーション -サーバー編-

Data Transmission Service(DTS)を使ったAlibaba CloudへのDB移行について

 

クラウドマイグレーションを捉える

サーバーのマイグレーションといってもそのパターンはいくつも存在するということはご存知のことと思います。我々も日々パターン検証を行っているところでありますが、まずは1つの例として以下の構成をご覧ください。

 

オンプレ上のWebアプリがあったとして、そこからマイグレーションする場合は「バックアップとして立てているストレージをAlibaba CloudのOSSへ」という形になります。「AWSのS3」をという場合も迷わずECSへ移しましょう。

ではどうやって実施すれば良いか?この場合重要なツールになるのがOssImportになります。

 

ストレージ移行ツール

 Alibaba Cloud 独自のリソース移行ツールです。ローカルまたは他のクラウドストレージシステムに格納されたデータを OSS に移行でき、以下のような特徴があります。

  • 豊富なデータソースをサポート(ローカル、AWS S3、Azure Blob etc.)
  • データ転送を中断しても途中から再開可能
  • トラフィック制御をサポート
  • パラレルでデータのアップロード・ダウンロードが可能
  • スタンドアロンモードと分散モードをサポート。スタンドアロンモードは展開と使用が容易で、分散モードは大規模なデータ移行に適しています。

実際にこのツールを動かすにはECS(Alibaba Cloud Elastic Compute Service) が必要になります。全体的な手順は以下の通りです。

  1. ツール稼動用のECS, 移行先となるOSSバケットを作成
  2. ECSへOssImportをインストール
  3. 移行ジョブ設定ファイルに移行元/移行先の情報を付与する
  4. OssImportを実行する

 

導入実例

それでは実際にストレージの移行作業をご覧いただきたいと思います。今回のご紹介では移行元のストレージにAWSのS3を使用していることにし適当なファイルを配置しておきます。ここに対しECSにて移行ツールを実行、Alibaba Cloud OSSにて同様ファイル構成を再現していきます。

*本来ご紹介すべきはローカルからのマイグレーションとは思うのですが、準備の関係でクラウドからクラウドでの事例になっています。もしローカルからという場合であれば、OssImportはローカル上で導入/実行してください

 

移行先となるOSSバケットを作成

OSSのバケット作成は当ブログの他の記事でもご紹介していますのでこちらをご覧ください。作業としては以下の

  • Alibaba CloudのコンソールからOSSを選択
  • バケットを1つ新規作成
  • 空のディレクトリを作成

で完了です。

 

ECSの構築

続いてツール実行用にECSを立てます。2Core4GBを推奨スペックとしてしておりますので参考にしてください。またマイグレーション後に仮想サーバーを別の用途に流用するといった場合は最初からそのスペックでご購入いただいても構いません。

 

ECSへOssImportを導入

無事にECSが購入できたらsshでそのサーバーへログインしてください。インストール自体は以下を参考にしてください。(unzip等も含む)

# yum install -y unzip
# wget http://gosspublic.alicdn.com/ossimport/standalone/ossimport-2.3.1.zip?spm=a2c4g.11186623.2.4.QjujkL&file=ossimport-2.3.1.zip
# mkdir ossimport
# mv ossimport-2.3.1.zip\?spm\=a2c4g.11186623.2.4.QjujkL ossimport-2.3.1.zip
# mv ossimport-2.3.1.zip ossimport
# cd ossimport
# unzip ossimport-2.3.1.zip

無事に解答できると以下のファイルがあることと思います。

# ll
合計 19376
-rw-r--r-- 1 root root     6298  7月 10  2017 README.md
drwxr-xr-x 2 root root     4096 12月 20  2017 bin
drwxr-xr-x 2 root root     4096 10月 23 17:04 conf
-rw-r--r-- 1 root root     1363 10月 11  2017 console.bat
-rw-r--r-- 1 root root     3611 10月 20  2017 console.sh
-rw-r--r-- 1 root root     1740  8月 23  2017 import.bat
-rw-r--r-- 1 root root     3998 10月 20  2017 import.sh
drwxr-xr-x 2 root root     4096  7月 29  2017 logs
-rw-r--r-- 1 root root 19801481 12月 20  2017 ossimport-2.3.1.zip

 

移行ジョブ設定ファイルに移行元/移行先の情報を付与する

confディレクトリに移動し、local_job.cfgを編集いきます。(以下コマンドでは念のためバックアップを取っています)

# cd conf
# cp -p local_job.cfg local_job.cfg.bak
# vi local_job.cfg

local_job.cnfでは場合によりますが、今回の様な例では以下の項目の編集が必要となります。サンプルソースの赤字になっている部分を参考にしてください。

移行元(今回の例ではそれぞれAWS S3のコンソールから確認できます)

  • srcType:
  • srcAccessKey:
  • srcSecretKey:
  • srcDomain:
  • srcBucket:
  • srcPrefix:

移行先(それぞれAlibaba Cloud OSSのコンソールから確認できます)

  • destAccessKey:
  • destSecretKey:
  • destDomain:
  • destPrefix:
#インクリメンタルモードがオンかどうか、trueに設定すると、incrementalModeInterval(秒単位)ごとにインクリメンタルデータが再スキャンされ、インクリメンタルデータはossに同期します。incrementalModeIntervalは3600秒未満であることは推奨されません。これは多くのリクエストを無駄にし、 オーバーヘッドになる(現在設定可能な最小間隔は900秒)
isIncremental=false
incrementalModeInterval=86400

##############################################################同期ソース設定##############################################################
#現在サポートされている同期ソースタイプ:
#1.local(ローカルファイル、このオプションはsrcPrefixを記入するだけで、srcAccessKey、srcSecretKey、srcDomain、srcBucketを記入する必要はありません)
#2.oss(ossの1つのバケットから別のバケットに移動)
#3.qiniu(七牛)
#4.bos(Baiduのクラウドストレージ)
#5.ks3(Kingsoftのクラウドストレージ)
#6.s3(Amazon S3)
#7.youpai(upyun、upyunはファイルのリストを得るためのインターフェイスは非常に特別ですが、リストは同期の中でブレークポイントをサポートしていないので、リストが完了していないときに同期プロセスを終了するとリストファイルのリストが次回にリストアップされます)
#8.http (提供されたhttpリンクリストを介して同期されたデータですが、このオプションはsrcAccessKey、srcSecretKey、srcDomain、srcBucket、srcPrefixを記入する必要はありません)
#9.cos(テンセントクラウド)
#10.azure(Microsoft BLOB)
rcType="S3(移行元によって上記を参考に変更 今回はS3を指定)"

#ソースaccess key、ローカルファイルの同期、およびhttpアドレス同期を記入する必要はありません。ほとんどのクラウドプラットフォームは、コンソールで取得したaccess key / accss key IDを入力します。Upyunはオペレーターアカウントを入力してください。
srcAccessKey="S3のアクセスキーを記述(localからの場合は不要)"

#ソースaccess key、ローカルファイルの同期、およびhttpアドレス同期を記入する必要はありません。ほとんどのクラウドプラットフォームは、コンソールで取得したsecret key/access key secret,Upyunはオペレーターパスワードを入力してください。
srcSecretKey="S3のシークレットキーを記述(localからの場合は不要)"

#ソースエンドポイント、ローカルファイルの同期、およびhttpアドレス同期に記入する必要はありません
#1.oss: コンソールからドメイン名(バケット接頭辞なしの第2レベルのドメイン名)を取得します。ドメイン名の一覧については、https://help.aliyun.com/document_detail/31834.html; 例:"srcDomain=http://oss-cn-hangzhou-internal.aliyuncs.com";Alibaba Cloud ECS仮想マシンを使用して内部ドメイン名を移行すると、仮想マシンの帯域幅に制限されません(非仮想マシンは使用できません)。例:http://oss-cn-hangzhou-internal.aliyuncs.com
#2.七牛: 七牛コンソールからバケットのドメイン名を取得する
#3.Baiduのbos: http://bj.bcebos.comまたはhttp://gz.bcebos.com
#4.Kingsoftのks3: http://kss.ksyun.comまたはhttp://ks3-cn-beijing.ksyun.comまたはhttp://ks3-us-west-1.ksyun.com
#5.Amazon S3: 各リージョンのアドレスについては、http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_regionを参照してください。
#6.upyun: http://v0.api.upyun.com(自動的に最適なルートを決定する)またはhttp://v1.api.upyun.com(China Telecom回線)またはhttp://v2.api.upyun.com(China Unicom回線)またはhttp://v3.api.upyun.com(China Mobile TieTong回線)
#7.テンセントクラウド: cos v3バージョンは記入する必要ない;cos v4バージョンはバケットリージョンを記入する必要があります。たとえば、China Southの場合:gz,China Northの場合:tj,China Eastの場合:sh
#8.Microsoft blob: core.chinacloudapi.cnなどの接続文字列内のEndpointSuffix
srcDomain="S3のドメイン例;http://s3.ap-northeast-1.amazonaws.com(local時は不要)"

#ソースバケット名、ローカルファイル同期とhttpアドレス同期を記入する必要ない、を追加する必要はありません;Microsoft BLOBはコンテナ名を記入してください。
srcBucket="S3のバケット名を記述(local時は不要)"

#ソース接頭辞、デフォルトはEmpty。srcType=localの場合、ディレクトリはローカルディレクトリであり、他のタイプの場合は、同期が必要なソースバケット内のオブジェクトの接頭辞です。ローカルディレクトリの場合、完全なディレクトリパス( '/'で区切られ、 '/'で終わります。例: c:/example/)が必要です。
srcPrefix="移行するディレクトリ名(localの場合はここのみ記述)"

##############################################################同期先設定################################################################
#目的 access key
destAccessKey="OSSのアクセスキーを記述"

#目的 secret key
destSecretKey="OSSのシークレットキーを記述"

#目的のエンドポイント、実際のOSSリージョンに応じて記入してください。デフォルトでは、杭州のドメイン名です。Alibaba Cloud ECS仮想マシンを使用して移行する場合は、内部ドメイン名を使用してください。仮想マシンの帯域幅に制限されない(非仮想マシンは使用できません)。例:http://oss-cn-hangzhou-internal.aliyuncs.com
#注:ドメイン名にバケット接頭辞を含めないでください。ossドメインのヘルプページ:https://help.aliyun.com/document_detail/31837.html
destDomain="OSSドメイン日本リージョン例:http://oss-ap-northeast-1.aliyuncs.com"

#目的のバケット、 "/"を追加する必要はない
destBucket="OSSのバケット名を記述"

#ターゲット接頭辞、デフォルトはエンプティー。バケットの直後(OSSの下級ディレクトリにデータを同期させたい場合は、 '/'で終わってください)注:OSSは '/'でファイルの先頭をサポートしていません。したがって、destPrefixの設定について '/'で始まるを記入しないでください。
#ローカルファイルパスが srcPrefix + relativePathのファイル。OSSに移行するパスは、destDomain/destBucket/destPrefix + relativePathです。
#クラウドファイルパスは srcDomain/srcBucket/srcPrefix + relativePathのファイル。OSSに移行するパスは、destDomain/destBucket/destPrefix + relativePathです。
destPrefix="移行先のディレクトリ名を記述"

##############################################################srcType=cosの場合の設定項目###########################################################
#テンセントクラウドのappId
#appId=0

##############################################################srcType=youpaiの場合の設定項目########################################################
#Upyunデータ移行ファイルをCDNからダウンロードするかどうか。Upyunクラウドストレージのダウンロードの動作速度の制限は、データの移行速度に影響を与えます。CDNを設定している場合は、クラウドストレージから移行されたファイルのリストを取得できます。データはCDNからダウンロードされます。 cdnHost + keyはダウンロードアドレスです。
#isDownloadFromCdn=false
#cdnDomain=

##############################################################srcType=httpの場合の設定項目########################################################
#srcType="http"の場合、httpリストファイルの絶対パスを指定する必要があります。このファイルのhttpリンクは、2つの列に分割する必要があり、OSSにアップロードした後の接頭辞と相対パスを表します。
#たとえば、完全なhttpリンクは127.0.0.1/aa/bb.jpgです。異なるスライス方法は、最終的にossにアップロードするための異なるパスにつながります。
#c:/example/http.listファイルの内容:
#127.0.0.1/aa/              bb.jpg
#127.0.0.1/                   aa/bb.jpg
# OSSへのファイルの最初の行のパスは "destDomain/destBucket/destPrefix" + "bb.jpg"です。
# OSSへのファイルの2行目のパスは "destDomain/destBucket/destPrefix" + "aa/bb.jpg"です。
httpListFilePath=c:/example/http.list
httpPrefixColumn=1
relativePathColumn=2

##############################################################タスク構成、特別な要件は変更する必要ない#################################################
#ジョブ名、各ジョブはユニークで、スタンドアロンモードでこの項目を変更しないでください
jobName=local_test

#ジョブ・タイプ(import/audit),importはデータをossに同期させ、auditはソース・データとossデータが同じかどうかを検査します。
jobType=import

#ソースファイルの最後の変更時刻が今回よりも大きいデータのみをインポートします。デフォルト値は0です。この時刻は、UNIXのタイムスタンプ(秒)です。
importSince=0

#検証時にファイルの最終変更時刻が値より大きい場合、ファイルのチェックはスキップされます。デフォルト値0は関数を無効にし、すべてのファイルをチェックする必要があります。この時刻はUNIXのタイムスタンプ(秒)です。 この項目は、jobTypeがauditの場合には無効です。
lastModify=0

#データ移行中に既存のファイルをスキップするかどうか。trueに設定されている場合は、ファイルサイズとLastModifedTimeに従ってスキップするかどうかを判断します。falseの場合、OSS上の既存のファイルは常に上書きされます。 この項目は、jobTypeがauditの場合には無効です。
isSkipExistFile=true

#サブタスクあたりの最大ファイル数は制限されており、タスク実行の並列度に影響します。一般的な構成はファイルの総数/ 120です。
taskObjectCountLimit=10000

#各サブタスクのダウンロードの最大ファイルサイズ制限(bytes)
taskObjectSizeLimit=1000000000

#パラレルでファイルリストをスキャンするスレッドの数は、ファイルをスキャンする効率にのみ影響します。特別な要件が無ければ変更しないでください。
scanThreadCount=10000

#パラレルスキャンディレクトリの最大許容深度、デフォルトは1で、最上位のディレクトリ間でのみスキャンすることができます。特別な要件がなければ修正しないでください。任意に設定されているため、タスクが正しく実行されません。
maxMultiThreadScanDepth=1

#この値より大きいファイルは、シャードを使用してアップロードされます。それ以外の場合は通常のアップロードが使用されます。1MB以上、有効な設定値:50m / 1024m / 5g
multipartUploadThreshold=150m

##アップロード時にフラグメントのサイズを割り当て、100kより大きいデータを設定してください。それ以外の場合は無効です。デフォルト値は50MB、有効な設定値は500k / 50m / 2g
multipartUploadPartSize=50m

#1つの大きなファイルフラグメントの同時アップロード数。大容量ファイルの場合、デフォルトは150MB以上、断片化は50MB、srcType = localは有効です。それ以外の場合、設定項目は無効です。
uploadThreadNumPerLargeFile=3

#OSSに保存されているデータは暗号化されていますか、デフォルトは暗号化されてない
isServerSideEncryption=false

#ローカルモードでは、リンクされたファイルがアップロードされているかどうか。デフォルトではアップロードされない
isAllowSymbolicLink=false

#Qiniuのクラウドストレージは、メタメソッド、ヘッドと統計値の有効値、デフォルトの使用統計値を取得し、HTTP HEADリクエストを介してBucketManager.statを通じてstat
getObjectMetaMode=stat

#データ移行後のデータの正確性を検証するかどうか、デフォルトは検証されます
isAuditAfterImport=true

#データ検証モードでは、有效值はsimple/general/detailed、デフォルト値はgeneral。simpleは、ファイルのサイズのみをチェックし、generalはファイルのsize/lastModify/headerをチエックし,detailedファイルのCRCまたはMD5をチェックし、開発中
auditMode=general

設定としては以上となります。あとはツールを実行するだけです。

 

OssImportを実行

OssImport実行ではjava環境が必要となりますが、立てたばかりのECSにはその環境がありませんのでインストールしておく必要があります。

# yum install -y java
# java -version

今度こそ移行前の準備が終わりましたので、OSSimportを実行していきます。

# bash import.sh stat

「Clean the previous job, Yes or No:」が表示されますので、続けて「Yes」を記述してエンターキーを押してください。

submit job:/root/ossimport/conf/local_job.cfg
submit job:local_test success!
Start import service completed.
-------------- job stats ---------------
---------------- job stat ------------------
JobName:local_test
JobState:Running
PendingTasks:1
DispatchedTasks:0
RunningTasks:0
SucceedTasks:0
FailedTasks:0
ScanFinished:true
RunningTasks Progress:
----------------------------------------

 〜省略〜

-------------- job stats ---------------
---------------- job stat ------------------
JobName:local_test
JobState:Succeed
PendingTasks:0
DispatchedTasks:0
RunningTasks:0
SucceedTasks:1
FailedTasks:0
ScanFinished:true
RunningTasks Progress:
----------------------------------------
Import to oss completed.

上の用にcompletedと出てくれば移行完了です。Alibaba Cloud OSSの指定したディレクトリ内にファイルが作られているはずです。

まとめ

今回はファイルサーバーやバックアップなどとして使っているストレージをAlibaba Cloudへ移行する際のツールとしてOssImportをご紹介してきました。特に難しい作業もなかったかと思います。移行元がlocalとその他クラウドサービスで少し違いが出てくるので、都度注意していただければと思います。

この記事をシェアする