ec2でocfs2+iscsiクラスタを組んでみた

ここ最近、GlusterFSを使う規模でもないけどサービスとストレージの冗長化を実現したいという
要望のもと、ec2上でiscsi+gfs2またはocfs2で稼動できるか調べていました。

色々やってみたけどgfs2はcman(Cluster Manager)がマルチキャストを使うのでec2では難しいし、
ocfs2はドキュメントみる限りマルチキャスト使わないぽいから実現可能かもしれないけど、
使用できるLinux Kernelが限定されるので見送ろうかと思っていました。

まあめんどくさいけどCentOS5.8(x86_64)のAMIを自作してなんとか稼動できたのでメモ。
障害時のテストとか同時書き込みの動作の書き込みのテストとかはこれからやる予定。

Management Consoleから普通に立ち上げます。t.microで十分です。

  • 8GBのEBSボリュームを作成してアタッチする

Management Cosoleから作成します。
/dev/sdfで立ち上げたインスタンスにアタッチします。

# mkfs.ext3 /dev/xvdf
# mkdir /ebs-root
# mount /dev/xvdf /ebs-root
  • CentOS 5.8をインストール
# cat <<EOF > centos.repo
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
exclude=*-debuginfo
gpgcheck=0
obsoletes=1
reposdir=/dev/null

[base]
name=CentOS-5.8 - Base
mirrorlist=http://mirrorlist.centos.org/?release=5.8&arch=x86_64&repo=os
enabled=1

[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=5.8&arch=x86_64&repo=updates
enabled=1
EOF
# yum -c centos5.repo --disablerepo=* --enablerepo=base --enablerepo=updates --installroot=/ebs-root -y groupinstall core
  • fstabを用意
# cat <<EOF > /ebs-root/etc/fstab
/dev/sda1  /         ext3    defaults        1 1
proc       /proc     proc    defaults        0 0
sysfs      /sys      sysfs   defaults        0 0
devpts     /dev/pts  devpts  gid=5,mode=620  0 0
tmpfs      /dev/shm  tmpfs   defaults        0 0
/dev/sda2  /mnt      ext3    defaults        0 0
/dev/sda3  swap      swap    defaults        0 0
EOF
  • modprobe.confを用意
# cat <<EOF > /ebs-root/etc/modprobe.conf
alias eth0 xennet
alias scsi_hostadapter xenblk
EOF
  • kernelをインストール

ここが一番大事でocfs2でサポートしてるカーネルと合わせないといけない。
見たところ最新のCentOS5.8カーネルのocfs2のパッケージがあるのでそのままインストール。

# yum -c centos5.repo --disablerepo=* --enablerepo=base --enablerepo=updates --installroot=/ebs-root -y install kernel-xen
  • system-auth-acを用意
# cat <<EOF > /ebs-root/etc/pam.d/system-auth-ac
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so
 
account     required      pam_unix.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so
 
password    requisite     pam_cracklib.so try_first_pass retry=3
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so
 
session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
EOF
# cd /ebs-root/etc/pam.d
# rm system-auth
# ln -s sytem-auth-ac system-auth
  • PVGRUBの設定
# cat <<EOF > /ebs-root/boot/grub/menu.lst
default=0
timeout=0
hiddenmenu
title CentOS 5.8
    root (hd0)
    kernel /boot/vmlinuz-2.6.18-308.20.1.el5xen ro root=/dev/sda1 4
    initrd /boot/initrd-2.6.18-308.20.1.el5xen.img
EOF
  • 公開鍵の設定

sandbox4me.orgさんのところのgetsshkeyをそのまま拝借しています。

# cd /ebs-root/etc/rc4.d
# ln -s ../init.d/getsshkey S11getsshkey
# yum -c centos5.repo --disablerepo=* --enablerepo=base --enablerepo=updates --installroot=/ebs-root -y install curl
  • ネットワークの設定
# cat <<EOF > /ebs-root/etc/sysconfig/network
NETWORKING=yes
EOF
# cat <<EOF > /ebs-root/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
EOF
  • その他の設定
# sed -i 's/SELINUX\=disabled/SELINUX\=permissive/g' /ebs-root/etc/selinux/config
# sed -i 's/SELINUX\=disabled/SELINUX\=enforcing/g' /ebs-root/etc/selinux/config
# cat <<EOF > /ebs-root/etc/sysconfig/i18n
LANG=ja_JP.UTF-8
EOF
# cp /ebs-root/usr/share/zoneinfo/Asia/Tokyo /ebs-root/etc/localtime

あとはEBSをアンマウントしてスナップショットを取得してAMIを作成するだけです。
UserProvidedなカーネルを使用できるようにKernel IDをaki-d409a2d5にしてAMIを作成します。

# ec2-describe-images -o amazon --filter "image-type=kernel"

で使用可能なアーキテクチャごとのKernel IDが調べられます。

ここまでできたら作成したAMIをベースにocfs2+iscsi構成ができると思います。
クラスタ構成の続きは後ほどメモします。

  • 追記

rpmデータベースが更新できていないので更新する作業が必要でした。
イメージを作成しているAmazon Linuxで実行します。

# yum install db43
# for i in `ls`; do db_dump $i | db43_load $i.db43; mv -f $i.db43 $i; done