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)監修のもと掲載しています。
元記事は、こちら