ここで、いくつか冗長化の可能性を考えてみました。
マルチパス(☓)
その場合、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など二重化をするほうほうなど方法はまだまだありますので、要件にあわせていろいろ探ってみるのも良いと思います。
以上です。