Memo/Linux/HeartbeatのRA(リソースエージェント)部分が分離したもの。
面倒なxml設定をcrmを使って割と容易に行える。
cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=ha01.localdomain
cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=ha02.localdomain
cat /etc/hosts 127.0.0.1 localhost server.localdomain 10.0.1.101 ha01.localdomain 10.0.1.102 ha02.localdomain
rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm yum search drbd --enablerepo=elrepo drbd83-utils.x86_64 : Management utilities for DRBD drbd84-utils.x86_64 : Management utilities for DRBD kmod-drbd83.x86_64 : drbd83 kernel module(s) kmod-drbd84.x86_64 : drbd84 kernel module(s) yum install drbd84-utils kmod-drbd84 --enablerepo=elrepo -y
cat > /etc/drbd.d/mysql.res << 'EOS' resource mysql { protocol C; device /dev/drbd0; meta-disk internal; on ha01.localdomain { address 10.0.1.101:7789; disk /dev/sdb; } on ha02.localdomain { address 10.0.1.102:7789; disk /dev/sdb; } } EOS
# ファイルシステムを初期化してから実行しないとエラーになる dd if=/dev/zero bs=1M count=1 of=/dev/sdb; sync drbdadm create-md mysql mkdir -p /mnt/drbd/mysql cat >> /etc/fstab << 'EOS' /dev/drbd0 /mnt/drbd/mysql ext4 defaults 0 0 EOS
service drbd start
# PacemakerのDRBD OCF RA(リソースエージェント)を利用する場合はRAに任せるためOFFにしておく
chkconfig drbd off
drbdsetup /dev/drbd0 primary --o mkfs.ext4 /dev/drbd0
mount /mnt/drbd/mysql
# ha01上で適当なファイルを作り、アンマウント、セカンダリに切り替え touch /mnt/drbd/mysql/test1.txt umount /mnt/drbd/mysql drbdsetup /dev/drbd0 secondary # ha02上でプライマリに切り替え、マウント、確認 drbdsetup /dev/drbd0 primary mkdir -p /mnt/drbd/mysql cat >> /etc/fstab << 'EOS' /dev/drbd0 /mnt/drbd/mysql ext4 defaults 0 0 EOS mount /mnt/drbd/mysql ls -la /mnt/drbd/mysql/ 合計 24 drwxr-xr-x 3 root root 4096 9月 13 18:45 2012 . drwxr-xr-x 3 root root 4096 9月 13 18:47 2012 .. drwx------ 2 root root 16384 9月 13 18:39 2012 lost+found -rw-r--r-- 1 root root 0 9月 13 18:45 2012 test1.txt # ha01上でプライマリに戻す drbdsetup /dev/drbd0 primary
cat /proc/drbd # または service drbd status
yum -y install mysql-server --enablerepo=remi mkdir -p /mnt/drbd/mysql/mysql chown mysql:mysql /mnt/drbd/mysql/mysql rm -rf /var/lib/mysql ln -s /mnt/drbd/mysql/mysql /var/lib/mysql
service mysqld restart
# Pacemakerのmysqld OCF RA(リソースエージェント)を利用する場合はRAに任せるためOFFにしておく
chkconfig mysqld off
cd /tmp wget -O pacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz "http://sourceforge.jp/frs/redir.php?m=iij&f=%2Flinux-ha%2F55568%2Fpacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz" tar xvfz pacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz cd pacemaker-1.0.12-1.1.el6.x86_64.repo yum -c pacemaker.repo install heartbeat-3.0.5 pacemaker-1.0.12 pm_extras-1.2 pm_logconv-hb-1.1 -y
vi /etc/yum.repos.d/CentOS-Base.repo ---- [base] ... exclude=pacemaker pacemaker-libs corosync cluster-glue heartbeat resource-agents ----
cat >> /etc/ha.d/ha.cf << 'EOS' pacemaker on #crm on debug 0 debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 initdead 120 udpport 694 ucast eth1 10.0.1.101 ucast eth1 10.0.1.102 node ha01.localdomain node ha02.localdomain uuidfrom nodename respawn root /usr/lib64/heartbeat/ifcheckd EOS
cat >> /etc/ha.d/authkeys << 'EOS' auth 1 1 crc #2 sha1 HI! #3 md5 Hello! EOS chmod 600 /etc/ha.d/authkeys
vi /etc/rsyslog.conf ---- *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages local0.info /var/log/ha-log ---- service rsyslog restart
service heartbeat restart chkconfig heartbeat on
# 別コンソールで crm_mon -i1 -f -A でモニタリングしながら実行してみると良い # ステップbyステップモードで入力 crm configure crm(live)configure# # 全体オプションの設定 # no-quorum-policy: 2台構成の場合ignore。Heartbeatの場合は問題がありignoreのみ動作する。3台以上でCorosyncを使っている場合はfreeze + STONITHが推奨 # stonith-enabled: 監視対象ノードの異常を検出したときに、強制的にそのノードをダウンさせる # startup-fencing: Pacemaker起動時に相手のサーバの状態が把握できない場合に念のために相手をフェンシング(Pacemakerからサーバを強制停止)する crm(live)configure# property no-quorum-policy="ignore" stonith-enabled="false" startup-fencing="false" # リソース動作のデフォルト値を設定 # resource-stickiness: リソース移動を固定する優先度。INFINITYは不具合がなければリソース移動はしない。 # migration-threshold: 故障を検知した場合に同一サーバでリソースの再起動を試みる回数 crm(live)configure# rsc_defaults resource-stickiness="INFINITY" migration-threshold="1" # 仮想IPの設定 10.0.0.100 を割り当て。このIPにアプリがアクセスする。仮想IPを割り当てられないAmazon VPC等ではEIP等を用いる crm(live)configure# primitive ip_mysql ocf:heartbeat:IPaddr2 params ip="10.0.0.100" nic="eth0" # DRBDリソースの追加 crm(live)configure# primitive drbd_mysql ocf:linbit:drbd params drbd_resource="mysql" # MySQLマスタースレーブ構成リソースの追加 crm(live)configure# ms ms_drbd_mysql drbd_mysql meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" # ファイルシステムリソースの追加(マウント定義) crm(live)configure# primitive fs_mysql ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mnt/drbd/mysql" fstype="ext4" # MySQLリソースの追加 crm(live)configure# primitive mysqld lsb:mysqld # リソースグループ: mysql グループにfs_mysql ip_mysql mysqld を追加 crm(live)configure# group mysql fs_mysql ip_mysql mysqld # リソース間の制約:mysqlグループとDRBDマスターは同時に存在 crm(live)configure# colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master # リソース順序の設定:DRBDマスター起動後に、mysqlグループが起動 crm(live)configure# order mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start # 設定変更後 commit が必要 crm(live)configure# commit # 終了 crm(live)configure# exit bye
crm configure edit
crm configure show
cat >> mysql.crm << 'EOS' # Cluster Option property \ no-quorum-policy="ignore" \ stonith-enabled="false" \ startup-fencing="false" # Resource Defaults rsc_defaults \ resource-stickiness="INFINITY" \ migration-threshold="1" # MySQL primitive ip_mysql \ ocf:heartbeat:IPaddr2 params ip="10.0.0.100" nic="eth0" primitive drbd_mysql \ ocf:linbit:drbd params drbd_resource="mysql" ms ms_drbd_mysql \ drbd_mysql meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" primitive fs_mysql \ ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mnt/drbd/mysql" fstype="ext4" primitive mysqld lsb:mysqld # Group group mysql fs_mysql ip_mysql mysqld colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master order mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start EOS crm configure load update mysql.crm
crm configure save mysql-`date +%Y%m%d`.crm
crm configure delete ip_mysql
crm_mon -i1 -f -A Online: [ ha02.localdomain ha01.localdomain ] Master/Slave Set: ms_drbd_mysql Masters: [ ha01.localdomain ] Slaves: [ ha02.localdomain ] Resource Group: mysql fs_mysql (ocf::heartbeat:Filesystem): Started ha01.localdomain mysqld (lsb:mysqld): Started ha01.localdomain Node Attributes: * Node ha02.localdomain: + ha01.localdomain-eth0 : up + master-drbd_mysql:0 : 5 * Node ha01.localdomain: + ha02.localdomain-eth0 : up + master-drbd_mysql:1 : 5 # Ctrl-Cで中断 # ha01に /mnt/drbd/mysql がマウントされている [root@ha01 ~]# [root@ha01 ~]# df -h Filesystem Size Used Avail Use% マウント位置 /dev/mapper/vg_centos6-lv_root 28G 2.7G 24G 11% / tmpfs 497M 0 497M 0% /dev/shm /dev/sda1 485M 52M 408M 12% /boot /dev/drbd0 1008M 18M 940M 2% /mnt/drbd/mysql # ha01のheartbeatを止めて、故障状態にしてみる service heartbeat stop # ha02での表示(ha01がOFFLINEになっている) crm_mon -i1 -f -A Online: [ ha02.localdomain ] OFFLINE: [ ha01.localdomain ] Master/Slave Set: ms_drbd_mysql Masters: [ ha02.localdomain ] Stopped: [ drbd_mysql:1 ] Resource Group: mysql fs_mysql (ocf::heartbeat:Filesystem): Started ha02.localdomain mysqld (lsb:mysqld): Started ha02.localdomain Node Attributes: * Node ha02.localdomain: + ha01.localdomain-eth0 : up + master-drbd_mysql:0 : 5 # ha02に /mnt/drbd/mysql がマウントされている df -h Filesystem Size Used Avail Use% マウント位置 /dev/mapper/vg_centos6-lv_root 28G 2.7G 24G 11% / tmpfs 497M 0 497M 0% /dev/shm /dev/sda1 485M 52M 408M 12% /boot /dev/drbd0 1008M 47M 911M 5% /mnt/drbd/mysql # ha02でmysqlも稼働している mysql -e "show databases;" +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ # failcountの表示。 # ha01のheartbeat再開させてみる service heartbeat start # ha01がオンラインにはなったが、ha02がマスターのまま crm_mon -i1 -f -A Online: [ ha02.localdomain ha01.localdomain ] Master/Slave Set: ms_drbd_mysql Masters: [ ha02.localdomain ] Slaves: [ ha01.localdomain ] Resource Group: mysql fs_mysql (ocf::heartbeat:Filesystem): Started ha02.localdomain mysqld (lsb:mysqld): Started ha02.localdomain Node Attributes: * Node ha02.localdomain: + ha01.localdomain-eth0 : up + master-drbd_mysql:0 : 5 * Node ha01.localdomain: + ha02.localdomain-eth0 : up + master-drbd_mysql:1 : 5 # MySQLグループをha01に変える。 # move と unmove はセット crm resource move mysql ha01.localdomain force # ha01:"inf", ha02:"-inf" オプションが付いた crm configure show | grep -i inf: rule $id="cli-prefer-rule-mysql" inf: #uname eq ha01.localdomain rule $id="cli-standby-rule-mysql" -inf: #uname eq ha02.localdomain # リソース移動制約の解除。この状態でha01が故障すると、"-inf"が付いたha02へリソースの移動ができないため "-inf"を削除する crm resource unmove mysql
# すべてのサーバをスタンバイに crm node standby ha01 crm node standby ha02 # リソース設定を削除、リソースをオンライン状態へ戻す crm configure erase crm node online ha01 crm node online ha02
service heartbeat stop rm -f /var/lib/heartbeat/crm/*
crm_mon -fA -1
故障履歴の表示
crm resource failcount mysql show ha01.localdomain
# 故障履歴のクリア
crm resource cleanup mysql
crm resource stop [リソース名/グループ名] crm resource start [リソース名/グループ名]
crm configure property maintenance-mode=true crm configure property maintenance-mode=false