2014年6月29日日曜日

SoftLayer iSCSI Storage のスナップショット機能を利用してみる

SoftLayer iSCSI Storage のスナップショット機能を利用してみました。
スナップショットを利用してバックアップを取得するための基礎的な操作方法を調べるためです。


まず、iSCSI Storage を注文します。予算の関係で、最安の 20GB を注文します。
1GB も 20GB も同じ値段なので、1GB は無視することとします。
ちなみに、料金体系としては $15/20GB という単価で、最大 3TB のサイズまでいろいろなサイズが揃っています。
必要な LUN の数と同じ回数、以下のコマンドを実行します。
LUN のサイズは変更不能のようなので、より大きい LUN が必要となった場合は買い換えとなります。
香港DCの iSCSI Storage を発注してみました。
CLI のインストール方法は割愛します。


$ sl iscsi create --size=20 --datacenter=hkg02


発注した iSCSI Storage の一覧を表示してみます。
左から、ID、データセンタ、サイズ、CHAP認証アカウント、CHAP認証パスワード、iSCSIポータルとなります。


$ sl iscsi list --format=raw
3206218  hkg02  20  SLI******-1  ****************  10.2.165.21
3206244  hkg02  20  SLI******-2  ****************  10.2.165.21
3208386  hkg02  20  SLI******-3  ****************  10.2.165.21


それぞれの LUN に対し、スナップショットを取得するためのスペースを発注します。単価は同じです。
このスペースのサイズ変更・削除も不能のようなので、より大きいスペースが必要となった場合は、LUN ごと買い換えになってしまいます。
Copy On Write の実装になっていること、スナップショット取得のタイミングと更新量を勘案し、必要なサイズを決めます。


$ sl snapshot create-space 3206218 --capacity=20
$ sl snapshot create-space 3206244 --capacity=20
$ sl snapshot create-space 3208386 --capacity=20


ここまでが前準備となります。
ここから先の操作は、バックアップスクリプトに組み込みたい操作となります。
以降の操作で必要な権限は、Manage Storage 権限のみで十分です。
この権限のみを有するユーザを作成し、API Key を発行します。
以下のように、ホームディレクトリにファイルを作成し、API Key を保存しておきます。
プライベート VLAN 経由で API を発行する場合の例となります。


$ touch ~/.softlayer
$ chmod 600 ~/.softlayer
$ cat << 'EOF' | tee ~/.softlayer
[softlayer]
username = sl-storage
api_key = ****************************************************************
endpoint_url = https://api.service.softlayer.com/xmlrpc/v3.1
timeout = 10
EOF

$ touch ~/.user
$ chmod 600 ~/.user
$ echo 'user = sl-storage:****************************************************************' | tee ~/.user


プライベート VLAN を経由せずに API を発行する場合は URL から「service.」を削除します。


バックアップスクリプトの流れに沿って、操作例を示していきます。

1. 上位のアプリケーションにて、LUN に対する更新を一時停止します。

データベースであれば、バックアップモードに移行します。
ファイルシステムであれば、一時的に書き込みを停止します。
xfs_freeze コマンドを使用すれば、xfs、ext2、ext3、ext4、btrfs 等のファイルシステムに対する書き込みを一時停止できます(rhel6 以降)。
lvm2 でスナップショットを取得する場合は、内部で同等の処理をしているみたいです。
このあたりの制御をバックアップスクリプトに組み込む必要があります。
複数の LUN で一貫性のあるバックアップを取得したい場合には必須の操作となります。

2. スナップショットを取得します。

以下のコマンドで、瞬時に取得可能です。


$ sl snapshot create 3206218 --note='BackupScript'
$ sl snapshot create 3206244 --note='BackupScript'
$ sl snapshot create 3208386 --note='BackupScript'


3. 上位のアプリケーションにて、LUN に対する更新一時停止を解除します。

4. 取得したスナップショットの ID を調べます。


$ LUN1_SID=$(sl snapshot list 3206218 | grep Snapshot | awk '{print $2}' | sort -n | tail -1)
$ LUN2_SID=$(sl snapshot list 3206244 | grep Snapshot | awk '{print $2}' | sort -n | tail -1)
$ LUN3_SID=$(sl snapshot list 3208386 | grep Snapshot | awk '{print $2}' | sort -n | tail -1)


「sl snapshot list 3206218」の実行例は以下の通りです。


:.........:...........................:.................:.............................:
:    id   :         createDate        :       name      :         description         :
:.........:...........................:.................:.............................:
: 3206310 : 2014-06-27T23:29:50+09:00 :  ISCSI Snapshot :  ISCSI snapshot partnership :
: 3206384 : 2014-06-27T23:48:19+09:00 : ISCSI Replicant : ISCSI Replicant partnership :
: 3206460 : 2014-06-28T00:09:01+09:00 :  ISCSI Snapshot :  ISCSI snapshot partnership :
: 3208362 : 2014-06-28T09:27:19+09:00 :  ISCSI Snapshot :  ISCSI snapshot partnership :
:.........:...........................:.................:.............................:


レプリケーションに関する行が2行目に混ざっています。レプリケーションについては後述します。
IDは永久に増え続ける、最後に取得したスナップショットが先ほど取得したスナップショットであるはず、という前提で ID を取得しています。
「--format=raw」オプションが使えず、パイプ渡しでもこのフォーマットで表示されるので、将来 CLI の仕様が変更された場合、「print $2」は「print $1」に変更する必要があるかもしれません。


5. 取得したスナップショットをマウント可能(Enable)にします。

残念ながら、CLI で実行できなかったので、REST API を直接呼び出します。


$ curl -K ~/.user -X POST -d '{"parameters":[1]}' https://api.service.softlayer.com/rest/v3/SoftLayer_Network_Storage_Iscsi/$LUN1_SID/setMountable.json
$ curl -K ~/.user -X POST -d '{"parameters":[1]}' https://api.service.softlayer.com/rest/v3/SoftLayer_Network_Storage_Iscsi/$LUN2_SID/setMountable.json
$ curl -K ~/.user -X POST -d '{"parameters":[1]}' https://api.service.softlayer.com/rest/v3/SoftLayer_Network_Storage_Iscsi/$LUN3_SID/setMountable.json


6. バックアップサーバにて、スナップショットをマウントします。

マウントの仕方は、http://dba-ha.blogspot.jp/2014/05/softlayer-iscsi-storage.html を参照してみてください。
「grep -i $PCS_USER\$」を「grep -v -i $PCS_USER\$」に変更すればよいです。
ただし、マウント可能となっているスナップショットが他にないことが前提となります。
iSCSI Target の一覧は以下のようになっています。


iqn.2001-05.com.equallogic:0-af1ff6-90b1d42dd-0c8001bbfa153ad8-sli******-1-2014-06-27-10:08:59.281.1
iqn.2001-05.com.equallogic:0-af1ff6-9541d42dd-1ee001bbf7953ad7-sli******-1


上の行がスナップショット、下の行がオリジナルの LUN になります。
スナップショットが複数ある場合、単純にソートして末尾の行を取得すればよい、という風にはなっていません。
「sli******-1-」より後ろの文字列を抽出してソートし、末尾の行を取得する、といったロジックになります。

7. バックアップサーバにて、データをコピーします。

8. バックアップサーバにて、スナップショットをアンマウントします。

9. スナップショットをマウント不能(Disable)にします。


$ curl -K ~/.user https://api.service.softlayer.com/rest/v3/SoftLayer_Network_Storage_Iscsi/$LUN1_SID/setMountable.json
$ curl -K ~/.user https://api.service.softlayer.com/rest/v3/SoftLayer_Network_Storage_Iscsi/$LUN2_SID/setMountable.json
$ curl -K ~/.user https://api.service.softlayer.com/rest/v3/SoftLayer_Network_Storage_Iscsi/$LUN3_SID/setMountable.json


10. スナップショットを削除します。


$ sl snapshot cancel $LUN1_SID
$ sl snapshot cancel $LUN2_SID
$ sl snapshot cancel $LUN3_SID


スナップショットを削除し忘れた場合、スナップショット用のスペースが足りなくなれば自動的に削除されるのかどうかは検証していません。スナップショットが1つしかない場合にスペースが足りなくなった時の挙動も検証していません。標準機能として用意されているスケジューリングによるスナップショット取得機能では、このあたりを設定可能となっています。設定の想定を上回った場合の挙動も未検証です。
スナップショット用スペース不足によるエラーを絶対確実に回避したければ、LUN のサイズと同じスペースを確保し、スナップショットは1つしか取得しないという運用をすることになります。



リストアについてですが、バックアップサーバにて、スナップショットではなくオリジナルの LUN をマウントし、書き戻せばよいです。
スナップショットが残っていれば、以下のコマンドでリストアできます。
バックアップ手順を修正し、最初に全てのスナップショットを削除し、最後にスナップショットを削除せずに放置しておく、というのもありだと思います。この場合、スナップショット用のスペースを大きめに確保しておく必要性が大きくなります。


$ sl snapshot restore-volume <volume_identifier> <snapshot_identifier>



続いて、レプリケーション機能について考えてみます。
結論からすると、私的には利用価値なし、となります。

レプリケーション機能を有効化(発注)すると、毎時0分と毎時30分に、自動的に別データセンタへレプリケートするようになります。
一貫性がどのように保証されるのかよくわかりません。レプリケート中の状態もよくわかりません。
日本IBMの担当者に直接口頭で尋ねたときにも、検証してみないと分からない、との回答でした。
検証して問題なくても、保証してもらえないのでは、バックアップ用途としては問題です。

フェイルオーバすると、スナップショットが取得できなくなります。
スナップショットが Enable になっているとフェイルバックできません。

これらの理由により、私的には利用価値なしです。
複数 LUN ではなく、単一の LUN を使用し、運よくクラッシュしていなければデータをフェイルオーバ先で救出できるかもしれない、というレベルで Disaster Recovery を組むのであれば、超簡単に設定できるという利点があります。

0 件のコメント:

コメントを投稿