メールサーバーはいったん動き出してしまえばおとなしく仕事を続けてくれますが、
滅多に止まらないと思っていても一台のみで運用していると実際に止まると
復旧までに何時間ものダウンタイムが生じる恐れがあります。
今回はDRBDでリアルタイムミラーリングを行なって片方に障害が発生しても
数分以内でフェイルオーバーするようにPacemaker+corosyncを使用しました。
PacemakerはHeartbeatの後継にあたるもので、
特に理由のない限りはPacemakerを使用することが推奨されています。
今回は簡単そうなApacheのフェイルオーバーをするようにしてみました。
基本的にすべてrootユーザーで作業を行います。
構成
- CentOS6.3
- DRBD 8.4.2
- Pacemaker
- corosync
ネットワーク構成は、
- 仮想IP(VIP): 192.168.0.20/24
- primarycentos: 192.168.0.21
- secondarycentos: 192.168.0.21
DRBD用のディスク領域を確保します
50GBくらいの容量を準備しました。
# fdisk /dev/sdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0xb1e15b63 で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります
警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
強く推奨します。 and change display units to
sectors (command 'u').
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-6527, 初期値 1):
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-6527, 初期値 6527):
初期値 6527 を使います
コマンド (m でヘルプ): w
パーティションテーブルは変更されました!
ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
DRBDのインストール
Master/Slave両方に同じ作業を行います。
DRBDはすごくナイーブで動かすのに苦労しました。
DRBDはバージョンごとにインストールのさせ方が異なってくるので注意します。
wget http://oss.linbit.com/drbd/8.4/drbd-8.4.2.tar.gz
(展開してcd)
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-km --with-utils --with-heartbeat --with-bashcompletion
make
make install
以下のコマンドでDRBDのカーネルモジュールのビルドを行うのですが、
上でmake installした時点でカーネルモジュールがインストールされている気がするので、
いらない気がします。
cd drbd
make clean all
make install
/lib/modules/2.6.32-279.19.1.el6.x86_64/build
Calling toplevel makefile of kernel source tree, which I believe is in
KDIR=/lib/modules/2.6.32-279.19.1.el6.x86_64/build
# modinfo drbd.ko
filename: drbd.ko
alias: block-major-147-*
license: GPL
version: 8.4.2
description: drbd - Distributed Replicated Block Device v8.4.2
author: Philipp Reisner <phil@linbit.com>, Lars Ellenberg <lars@linbit.com>
srcversion: 880EE343DAD0F8F79C9F683
depends: libcrc32c
vermagic: 2.6.32-279.19.1.el6.x86_64 SMP mod_unload modversions
parm: minor_count:Approximate number of drbd devices (1-255) (uint)
parm: disable_sendpage:bool
parm: allow_oos:DONT USE! (bool)
parm: proc_details:int
parm: enable_faults:int
parm: fault_rate:int
parm: fault_count:int
parm: fault_devs:int
parm: usermode_helper:string
起動時にDRBDモジュール読み込み
echo modprobe drbd minor_count=1>> /etc/rc.modules
chmod +x /etc/rc.modules
DRBD足回りの設定
vi /etc/hosts
192.168.0.11 primarycentos
192.168.0.12 secondarycentos
次が一番大事です。
vi /etc/drbd.d/global_common.conf
common {
protocol C;
}
vi /etc/drbd.d/r0.res
resource r0 {
on primarycentos {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.0.21:7789;
meta-disk internal;
}
on secondarycentos {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.0.22:7789;
meta-disk internal;
}
}
メタデータの構築
drbdadm create-md r0
--== Thank you for participating in the global usage survey ==--
The server's response is:
you are the 5765th user to install this version
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
リブートしたら自動的にモジュールを読み込んでくれますが、とりあえず手動でカーネルモジュールを読み込みます。
modprobe drbd minor_count=1
ロードされていることの確認。
lsmod | grep drbd
drbd 314184 0
libcrc32c 1246 1 drbd
よくあるエラー
マニュアル通りに進めていくと以下のエラーに悩まされるのですが、
ここでは無視して次に進みます。
drbdadm attach r0
1: Failure: (127) Device minor not allocated
additional info from kernel:
unknown minor
Command 'drbdsetup attach 1 /dev/sdb1 /dev/sdb1 internal' terminated with exit code 10
サービス起動
Master/Slave両方ほぼ同時に立ち上げます。
両方同時にサービスを立ちあげないと固まります。
service drbd start
Starting DRBD resources: [
create res: r0
prepare disk: r0
adjust disk: r0
adjust net: r0
]
動いているかどうか確認します。
cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by root@centos, 2013-02-03 23:38:49
1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:52426460
マイナー番号1がアタッチされています。
ds:Inconsistent/Inconsistentなので現在同期がとれていません。
マスタ側のサーバーで以下のコマンドでフル同期を行います。
drbdadm -- --overwrite-data-of-peer primary r0
同期している最中。
cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by root@centos, 2013-02-03 23:38:49
1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:46533632 dw:46533632 dr:0 al:0 bm:2840 lo:1 pe:4 ua:0 ap:0 ep:1 wo:f oos:5892828
[================>...] sync'ed: 88.8% (5752/51196)M
finish: 0:01:00 speed: 97,024 (93,252) want: 69,120 K/sec
UpToDateになったら同期完了。
cat /proc/drbd
version: 8.4.2 (api:1/proto:86-101)
GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by root@centos, 2013-02-03 23:38:49
1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:53381408 dw:53381408 dr:0 al:0 bm:3200 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
DRBDディスク上にファイルシステムを構築する
DRBDでリアルタイムミラーリングしているディスクは /dev/drbd1 というブロックデバイスに割り当てられています。
mkfs.ext4 /dev/drbd1
マウントできます。
ファイルも書き込めます。
mkdir /mnt/data
mount /dev/drbd1 /mnt/data
他方にミラーリングされているのを確認するときはいったんumountします。
primarycentos# drbdadm primary r0
secondarycentos# drbdadm secondary r0
cat /proc/drbd でPrimary/Secondaryが入れ替わっているのを確認します。
ミラーリングされたブロックデバイスはPrimaryでしかmountできないようです。
Pacemaker+corosync
本当はインターコネクト回線が必要らしいです。
とりあえず、Master/Slave構成にするにあたって、
サービスの起動はすべてPacemakerに任せることになるので、
冗長化する部分はchkconfig … off、
service … stopしておきます。
インストール
依存関係解決の過程でcorosyncも一緒に入ります。
yum -y install pacemaker
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
vi /etc/corosync/corosync.conf
service {
name: pacemaker
ver: 0
use_mgmtd: yes
}
totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
# ネットワークアドレス(インターコネクト)
bindnetaddr: 192.168.0.0
mcastaddr: 226.94.1.1
mcastport: 5405
ttl: 1
}
}
Pacemakerの設定
Vyattaみたいな使い方をします。
# crm
crm(live)# configure
crm(live)configure#
以下の記述は Pacemaker+Corosync+DRBDを利用したWEBサーバの冗長化 – OSSでLinuxサーバ構築 を参考にさせていただきました。
crm(live)configure# property stonith-enabled="false" \
> no-quorum-policy="ignore" \
> default-action-timeout="240" \
> default-resource-stickiness="200"
crm(live)configure# rsc_defaults resource-stickiness="INFINITY" \
> migration-threshold="1"
crm(live)configure# primitive res_drbd ocf:linbit:drbd \
> params drbd_resource="r0" \
> op monitor interval="20s"
WARNING: res_drbd: action monitor not advertised in meta-data, it may not be supported by the RA
crm(live)configure# ms ms_drbd res_drbd \
> meta master-max="1" master-node-max="1" \
> clone-max="2" clone-node-max="1" notify="true"
crm(live)configure# primitive res_httpd ocf:heartbeat:apache \
> params configfile="/etc/httpd/conf/httpd.conf" port="80" \
> op monitor interval="20s"
crm(live)configure# primitive res_vip ocf:heartbeat:IPaddr2 \
> params ip="192.168.0.20" cidr_netmask="24" nic="eth0" \
> op monitor interval="20s"
crm(live)configure# primitive res_filesystem ocf:heartbeat:Filesystem \
> params device="/dev/drbd1" directory="/mnt/data" fstype="ext4" \
> op monitor interval="20s"
crm(live)configure# group rg_web res_vip res_filesystem res_httpd
crm(live)configure# colocation c_rg_web inf: rg_web ms_drbd:Master
crm(live)configure# order o_rg_web inf: ms_drbd:promote rg_web:start
crm(live)configure# verify
WARNING: res_drbd: action monitor not advertised in meta-data, it may not be supported by the RA
crm(live)configure# commit
WARNING: res_drbd: action monitor not advertised in meta-data, it may not be supported by the RA
crm(live)configure# exit
bye
corosyncサービスのスタート。
これもMaster/Slaveどちらも同時に立ち上げます。
service corosync restart
Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ]
Waiting for corosync services to unload:....... [ OK ]
Starting Corosync Cluster Engine (corosync): [ OK ]
ステータスの確認。
crm_mon -Af
む、DRBDはアクティブになったみたいだけど、起動しない。
man crmしたらstartで起動してやる必要があるみたいです。
crm resource start rg_web
ping 192.168.0.20に対して応答を返すようになりました。
仮想IPがうまくあたっているようです。
どうもMaster/Slave構成は効いているようですが、Apacheが立ち上がらないようです。
server-statusのチェックで.example.comでdenyされてしまっているからでした。
その他にもpidチェックも必要でした。
ExtendedStatus On
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
# Allow from .example.com
Allow from all
</Location>
fail_countのリセット
テストで繰り返し再起動をしていたりしてfail_countが規定の数に達していると
スレーブにできないので、リセットします。
# crm resource cleanup rg_web
Cleaning up res_vip on primarycentos
Cleaning up res_vip on secondarycentos
Cleaning up res_filesystem on primarycentos
Cleaning up res_filesystem on secondarycentos
Cleaning up res_httpd on primarycentos
Cleaning up res_httpd on secondarycentos
Waiting for 7 replies from the CRMd....... OK
フェイルオーバーのテスト
現在の設定だとリソースグループ内の一つのサービスが落ちると
全体的にフェイルオーバーされる設定になっています。
Apacheのサービスを意図的に落としてみます。
cat /var/run/httpd.pid
24571
kill -9 24571
============
Last updated: Mon Feb 4 06:39:18 2013
Last change: Mon Feb 4 03:46:57 2013 via crm_resource on primarycentos
Stack: openais
Current DC: secondarycentos - partition with quorum
Version: 1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14
2 Nodes configured, 2 expected votes
5 Resources configured.
============
Online: [ primarycentos secondarycentos ]
Master/Slave Set: ms_drbd [res_drbd]
Masters: [ primarycentos ]
Slaves: [ secondarycentos ]
Resource Group: rg_web
res_vip (ocf::heartbeat:IPaddr2): Started primarycentos
res_filesystem (ocf::heartbeat:Filesystem): Started primarycentos
res_httpd (ocf::heartbeat:apache): Started primarycentos
Node Attributes:
* Node primarycentos:
+ master-res_drbd:0 : 5
* Node secondarycentos:
+ master-res_drbd:1 : 5
Migration summary:
* Node primarycentos:
* Node secondarycentos:
ものの1分しないうちにsecondarycentosにフェイルオーバーされました。
http://192.168.0.20/ も普通に見れるようです。
仮にマスターが復旧したとして、再度マスターに昇格させるには
マスタ側で以下のコマンドを入力します。
crm_resource -r rg_web -M
WARNING: Creating rsc_location constraint 'cli-standby-rg_web' with a score of -INFINITY for resource rg_web on secondarycentos.
This will prevent rg_web from running on secondarycentos until the constraint is removed using the 'crm_resource -U' command or manually with cibadmin
This will be the case even if secondarycentos is the last node in the cluster
This message can be disabled with -Q
secondarycentosにフェイルオーバーしたいときは除去しないといけないよと怒られています。
crm(live)configure# delete location cli-standby-rg_web
ERROR: object location does not exist
crm_resource -r rg_web -M
よりも手動フェイルオーバーしたほうがいいのかもしれないです。
crm resource move rg_web secondarycentos
参考にしたサイト
DRBD関連
- 負荷分散システム上でのハードディスクデータの同期をDRBDで実現する(2/5):企業のIT・経営・ビジネスをつなぐ情報サイト EnterpriseZine (EZ)
- DRBD.jp by Thirdware inc.
- DRBD:DRBDの紹介
- DRBD:コンパイル、インストール、設定
- 40.2. Persistent Module Loading
- [DRBD-user] There are multiple host sections for the peer.
- [RHEL][DRBD] Linux+DRBDで作るサーバ冗長構成 | 半袖野郎 blog.hansode.org
- Pacemaker+Corosync+DRBDを利用したWEBサーバの冗長化 – OSSでLinuxサーバ構築
- @IT:体験! 新しくなったLinux-HA(3/3)
- Apache on Pacemaker でハマる – とあるサーバ管理者 & PG & SEのメモ帳
- Install CoroSync + Pacemaker on CentOS 5.6 – Bits & Bytes of Life
- Pacemakerでマスター/スレーブの切り替えを行う – ngの日記
- 第5回 Pacemakerを運用してみよう![保守運用編(2)]:Pacemakerでかんたんクラスタリング体験してみよう!|gihyo.jp … 技術評論社
-
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。 レポート2019.10.28ユニキャストレストランを開催しました
レポート2019.08.29社内研修ワークショップ~マシュマロ・チャレンジ~
レポート2019.08.06Computex/InnoVEX 出展者・通訳として参加してきました。
レポート2018.06.12Computex 2018 レポート