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