DRBD+Pacemaker+corosyncで作るHAサーバー

Pocket

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

今回は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関連

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください