2013年2月25日月曜日

StorageGatewayってなんじゃ?(Gatewayインスタンスの冗長化:GlusterFS編)

StorageGatewayのiSCSIボリュームをEC2にマウントし、アプリケーションシステムの中で使おうとする場合、冗長化という課題が持ち上がってきます。


ここで、いくつか冗長化の可能性を考えてみました。


マルチパス(


その場合、iSCSIとしての冗長化に合わせると、マルチパスという方法があるようです。
イメージとしては、以下のような感じでiSCSIターゲットであるgatewayインスタンスに複数のIPを付与し、それぞれの接続先の複数のデバイスを1つのデバイスとして認識させ、1つの接続が切れても他のNICで接続ができる方法です。



これはそもそもGatewayインスタンスの冗長化ではなく、ネットワーク・インターフェースの冗長化になりますが、ちょっと試してみます。
2番目のENIIを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という分散ファイルシステムを使用してみます。



前回の記事までは、Gatewayインスタンスが1つでしたがこれを2つにして、冗長化を図ります。
また、これらのGatewayインスタンスにさらに複数のイニシエータが接続し、それぞれが担当するGatewayのiSCSIをマウントし、もう一方をGlusterFSで互いをレプリカとしてミラーリングしあいます。

まず、前回と同じ手順でStorageGatewayをもう一つ登録し、Gatewayインスタンスを2つの状態にしておきます。
2つの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
  • ....

また、lsyncd+rsyncdなど二重化をするほうほうなど方法はまだまだありますので、要件にあわせていろいろ探ってみるのも良いと思います。

以上です。