メールサーバーはいったん動き出してしまえばおとなしく仕事を続けてくれますが、
滅多に止まらないと思っていても一台のみで運用していると実際に止まると
復旧までに何時間ものダウンタイムが生じる恐れがあります。
今回は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 レポート