StorageGatewayのiSCSIボリュームをEC2にマウントし、アプリケーションシステムの中で利用しようとする場合、
冗長化という課題が持ち上がります。
そこで、いくつか冗長化の可能性を考えてみました。
○マルチパス(☓)
iSCSIとしての冗長化に合わせると、マルチパスという方法があるようです。
イメージとしては、以下のようにiSCSIターゲットであるgatewayインスタンスに複数のIPを付与し、それぞれの
接続先の複数のデバイスを1つのデバイスとして認識させ、1つの接続が切れても他のNICで接続ができる方法です。
これは元よりGatewayインスタンスの冗長化ではなく、ネットワーク・インターフェースの冗長化になりますが、
試してみます。
2番目のENIを10.0.1.6として追加し、gatewayインスタンスにアタッチします。
そして、マウント用のEC2から10.0.1.6のiSCSIを調べてみますが、接続できませんでした。
(既存のENIのセカンダリIPに付与しても同様でした。)
# iscsiadm --mode discovery --type sendtargets --portal 10.0.1.6:3260
iscsiadm: cannot make connection to 10.0.1.6: Connection refused
iscsiadm: cannot make connection to 10.0.1.6: Connection refused
iscsiadm: cannot make connection to 10.0.1.6: Connection refused
その後調べてみたところ、下記のことがわかりました。
また、EC2インスタンスのゲートウェイには通常のログインができないようです。
代わりにAWSのサポートにトラブルシュートをしてもらうために以下のsshコマンドだけ受け付けているそうです。
ssh -i IDENTITY_FILE sguser@INSTANCE_IP_ADDRESS grant-aws-support-access
ssh -i IDENTITY_FILE sguser@INSTANCE_IP_ADDRESS revoke-aws-support-access
(試したところ、上記のコマンドもPermission denied (publickey).となりアクセスできませんでした。)
○ソフトウェアRAID(×)
2つのGatewayインスタンスを複数のイニシエータにマウントし、それぞれでソフトウェアRAID1を試してみましたが、
一方の変更が他方のイニシエータ上に反映されませんでした。
クラスタファイルシステムなどを利用する必要があるようです。
○DRBD
DRBD + iSCSIはiSCSIターゲット側でDRBDを行うことが通常のようですが、Gateway on EC2では
Gatewayインスタンスにはログインできないようなので、マウント側のEC2でDRBDを行うことになります。
このケースも試してみたいのですが、今回は見送ります。
○GlusterFS
前述の内容を考慮し、今回はGlusterFSという分散ファイルシステムを使用してみます。
StorageGatewayってなんじゃ?(スナップショットからの復元)までは、Gatewayインスタンスが1つでしたが
これを2つにして、冗長化を図ります。
また、これらのGatewayインスタンスにさらに複数のイニシエータが接続し、それぞれが担当するGatewayの
iSCSIをマウントし、もう一方をGlusterFSで互いをレプリカとしてミラーリングしています。
まず、前回と同じ手順でStorageGatewayをもう1つ登録し、Gatewayインスタンスを2つの状態にしておきます。
3つのGatewayインスタンスの内部IPは 10.0.1.5, 10.0.1.6とします。
また、マウント用のインスタンスを2つ用意し、10.0.1.8, 10.0.1.9とします。
そして、10.0.1.8は10.0.1.5の、10.0.1.9は10.0.1.6のGatewayインスタンスのiSCSIボリュームを
それぞれマウントします。
・10.0.1.8
# mkdir /mnt/sgw
# iscsiadm --mode node --targetname iqn.1997-05.com.amazon:memorycraft-sgw --portal 10.0.1.5:3260,1 --login
# ls -l /dev/disk/by-path/
合計 0
lrwxrwxrwx 1 root root 9 2月 25 00:08 2013 ip-10.0.1.5:3260-iscsi-iqn.1997-05.com.amazon:memorycraft-sgw-lun-0 -> ../../sda
lrwxrwxrwx 1 root root 9 2月 25 00:48 2013 ip-10.0.1.6:3260-iscsi-iqn.1997-05.com.amazon:memorycraft-sgw2-lun-0 -> ../../sdb
lrwxrwxrwx 1 root root 11 2月 23 17:54 2013 xen-vbd-2049 -> ../../xvde1
# mkfs.ext4 /dev/sda
# mount /dev/sda /mnt/sgw
・10.0.1.9
# mkdir /mnt/sgw2
# iscsiadm --mode node --targetname iqn.1997-05.com.amazon:memorycraft-sgw2 --portal 10.0.1.6:3260,1 --login
# ls -l /dev/disk/by-path/
合計 0
lrwxrwxrwx 1 root root 9 2月 25 00:08 2013 ip-10.0.1.5:3260-iscsi-iqn.1997-05.com.amazon:memorycraft-sgw-lun-0 -> ../../sda
lrwxrwxrwx 1 root root 9 2月 25 00:48 2013 ip-10.0.1.6:3260-iscsi-iqn.1997-05.com.amazon:memorycraft-sgw2-lun-0 -> ../../sdb
lrwxrwxrwx 1 root root 11 2月 23 17:54 2013 xen-vbd-2049 -> ../../xvde1
# mkfs.ext4 /dev/sdb
# mount /dev/sdb /mnt/sgw2
次に、10.0.1.8で10.0.1.9をGlusterのピアとして登録し、互いをレプリカとしてGlusterボリュームを作成します。
・10.0.1.8
# gluster peer probe 10.0.1.9
# gluster volume create gv0 replica 2 10.0.1.8:/mnt/sgw 10.0.1.9:/mnt/sgw2
そうすると、双方にgv0というデバイスが接続されるので、これをglusterfsとしてマウントします。
・10.0.1.8, 10.0.1.9
# mount -t glusterfs 10.0.1.8:/gv0 /mnt/gv
# ls -l /mnt/gv
drwx------ 2 root root 16384 2月 25 00:47 2013 lost+found
一方でファイルを作成してみます。
・10.0.1.8
# echo "hoge" > /mnt/gv/hoge.txt
・10.0.1.9
# ls -l /mnt/gv
-rw-r--r-- 1 root root 5 2月 25 01:26 2013 hoge.txt
drwx------ 2 root root 16384 2月 25 00:47 2013 lost+found
もう一方にも更新が反映されています。
また、一方のゲートウェイインスタンス(10.0.1.6)を落としてみます。
それぞれのイニシエータでは問題なくファイル操作できるようです。
・10.0.1.8
# echo 111 > /mnt/gv/111.txt
# ls -l /mnt/gv/
-rw-r--r-- 1 root root 5 2月 25 03:42 2013 111.txt
-rw-r--r-- 1 root root 5 2月 25 01:26 2013 hoge.txt
drwx------ 2 root root 16384 2月 25 00:47 2013 lost+found
・10.0.1.9
# echo 222 > /mnt/gv/222.txt
# ls -l /mnt/gv/
-rw-r--r-- 1 root root 5 2月 25 03:42 2013 111.txt
-rw-r--r-- 1 root root 4 2月 25 03:42 2013 222.txt
-rw-r--r-- 1 root root 5 2月 25 01:26 2013 hoge.txt
drwx------ 2 root root 16384 2月 25 00:47 2013 lost+found
以上で冗長化はできました。
GlusterFSはFUSEを使うこともあり少しパフォーマンスが落ちますが、GlusterFSに関わらず、
以下のような対策でパフォーマンスは上がるかもしれません。
- fuseのバージョンを変えてみる
- ファイルシステムをxfsにしてみる、
- EBS-Optimizedインスタンスにしてみる
- PIOPS-EBSにしてみる
- GlusterFSを4台構成でstriped + replicaにしてみる
また、他のクラスタソリューションを試してみても良いかもしれません。
- GFS
- OCFS
- Lustre
- (etc..)
他にもlsyncd+rsyncdなど二重化をする等、方法はまだまだ考えられますので、要件に合わせて
調査してみるのも良いと思います。
こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら