DRBD+Pacemaker+Corosyncを利用したWEBサーバの冗長化
| Table of Contents |
はじめに
内容について
Pacemaker+corosync+DRBDを利用してWEBサーバを冗長化(HAクラスタ)します。
これからPacemakerやDRBDを利用する人向けに、各種設定の役割や構築でハマりそうなポイントを書いたつもりです。
構築中心の内容なので、ソフトウェアの役割などは、別サイト(一度は目を通しておきたいサイト)も参考にして下さい。
ソフトウェア概要
corosyncとは
corosyncの役割はクラスタ制御です。corosyncはノードの死活監視を行い、ノードがダウンした場合はPacemakerでリソースの制御が実施されます。
ちなみに、corosyncの代わりにHeartbeatを利用する事も可能ですが、HeartBeatは海外サイトによると開発が活発でないらしいので、このサイトではcorosyncを利用します。
pacemakerとは
Pacemakerの役割はリソース制御です。Pacemakerはノードがダウンした場合にノードの切り離しや、待機系ノードへリソースを引継ぎます。クラスタリソースマネージャとも呼ばれ、リソース(仮想IP、WEB、データベースなどのサービス)の動作状態を監視します。
DRBDとは
DRBDは、2台以上のサーバでネットワーク越しのデータ同期を実現します。
pacemakerやcorosyncなど連携させて、web,データベース,nfs,sambaなどのHAクラスタを共有ストレージ無しで実現可能です。
前提条件
- SELinuxは無効にしておきます。
-
手順のプロンプトについては下記の通りです。
[root@serv111 ~]# ←serv111(アクティブ)側で実行[root@serv112 ~]# ←serv112(スタンバイ)側で実行# ←serv111とserv112の両方で実行
システム構成
構成概要
|
|
アクティブ側
-
ホスト名(IP)
- serv111(192.168.11.111)
-
OS
- CentOS 6.2 (kernel 2.6.32-220.7.1.el6.x86_64)
-
パッケージ
- drbd84-utils-8.4.1-2.el6.elrepo.x86_64
- kmod-drbd84-8.4.1-2.el6.elrepo.x86_64
- pacemaker-1.1.6-3.el6.x86_64
- corosync-1.4.1-4.el6_2.2.x86_64
-
HDD構成
- /dev/sda :OS領域
- /dev/sdb :DRBD領域(未フォーマット状態)
スタンバイ側
-
ホスト名(IP)
- serv112(192.168.11.112)
-
OS
- CentOS 6.2 (kernel 2.6.32-220.7.1.el6.x86_64)
-
パッケージ
- drbd84-utils-8.4.1-2.el6.elrepo.x86_64
- kmod-drbd84-8.4.1-2.el6.elrepo.x86_64
- pacemaker-1.1.6-3.el6.x86_64
- corosync-1.4.1-4.el6_2.2.x86_64
-
HDD構成
- /dev/sda :OS領域
- /dev/sdb :DRBD領域(未フォーマット状態)
仮想IP
-
ホスト名(IP)
- serv113(192.168.11.113)
DRBDのインストール・設定
DRBDインストール
-
DRBDは標準リポジトリに含まれないため、elrepoリポジトリを追加してインストールします。
elrepoはRHELやCentosのScientific Linuxの開発メンバが中心で運用されているリポジトリです。# rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm
-
通常時はelrepoリポジトリを無効にしておきます。
# vi /etc/yum.repos.d/elrepo.repo[elrepo]name=ELRepo.org Community Enterprise Linux Repository - el6baseurl=http://elrepo.org/linux/elrepo/el6/$basearch/mirrorlist=http://elrepo.org/mirrors-elrepo.el6enabled=0 #■0に変更するgpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.orgprotect=0:(省略):
-
DRBDをelrepoからインストールします。
# yum --enablerepo=elrepo install drbd84# yum --enablerepo=elrepo install kmod-drbd84
DRBDパーティンションの作成
DRBD用のパーティンション作成
-
fdiskコマンドで「/dev/sdb」にパーティションを作成します。
# fdisk /dev/sdbコマンド (m でヘルプ): nコマンドアクション e 拡張 p 基本パーティション (1-4)p ■Pを入力パーティション番号 (1-4): 1 ■1を入力最初 シリンダ (1-1305, 初期値 1): 1 ■1を入力Last シリンダ, +シリンダ数 or +size{K,M,G} (1-1305, 初期値 1305): 1305 ■1305を入力-パーティション情報をセーブして終了します。コマンド (m でヘルプ): w ■wで保存パーティションテーブルは変更されました!ioctl() を呼び出してパーティションテーブルを再読込みします。ディスクを同期しています。
-
パーティション「/dev/sdb1」が作成された事を確認します。
# ls /dev/sdb*/dev/sdb /dev/sdb1
DRBDの設定
drbd.conf
-
drbd.confはデフォルトのまま利用します。
# cat /etc/drbd.confinclude "drbd.d/global_common.conf";include "drbd.d/*.res";
global_common.conf
-
global_common.confはデフォルトのまま利用します。
# cat /etc/drbd.d/global_common.confglobal { #usage-count yes; usage-count no;}common { :(省略) :}
リソース設定
-
リソースの設定を行います。ファイル名は任意ですが拡張子を.resにします。
# vi /etc/drbd.d/disk.res
-
設定項目については以下を参照して下さい。
drbd.conf
-
その他の設定項目は公式サイトを参考にして下さい。
http://www.drbd.jp/users-guide/re-drbdconf.html
メタファイルの作成
-
メタファイルを作成します。
# drbdadm create-md r0
自動起動の設定
-
自動起動をonに設定します。
# chkconfig drbd on# chkconfig --list drbddrbd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
DRBDの起動
-
もう1台のDRBDが起動していないため、最初に起動したサーバでは以下のような警告が出ますが、
yesとタイプして先に進みます。起動に成功したら、もう1台も起動します。# /etc/init.d/drbd start
Starting DRBD resources: [ create res: r0 prepare disk: r0 adjust disk: r0 adjust net: r0]degr-wfc-timeout has to be shorter than wfc-timeoutdegr-wfc-timeout implicitly set to wfc-timeout (120s)outdated-wfc-timeout has to be shorter than degr-wfc-timeoutoutdated-wfc-timeout implicitly set to degr-wfc-timeout (120s)..........*************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 0 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 120 seconds. [wfc-timeout] (These values are for resource 'r0'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 44]: To abort waiting enter 'yes' [ -- ]:yes
-
2台ともDRBDを起動したら状態を確認します。Inconsistentはデータ同期ができていない状態です。
# /etc/init.d/drbd statusm:res cs ro ds p mounted fstype0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C
プライマリへの昇格
-
serv111をプライマリへ昇格させます。同時にデータ同期が実施されます。
[root@serv111 ~]# drbdadm -- --overwrite-data-of-peer primary r0
-
データ同期が完了したらステータスが「UpToDate」になります。
[root@serv111 ~]# /etc/init.d/drbd statusm:res cs ro ds p mounted fstype0:r0 Connected Primary/Secondary UpToDate/UpToDate C
DRBDボリュームのマウント(アクティブ側のみ)
-
DRBDボリュームにファイルシステムを作成してマウントします。
[root@serv111 ~]# mkfs.ext4 /dev/drbd0[root@serv111 ~]# mount -t ext4 /dev/drbd0 /data
-
ファイルシステムのマウントを確認します。
[root@serv111 ~]# /etc/init.d/drbd statusm:res cs ro ds p mounted fstype0:r0 Connected Primary/Secondary UpToDate/UpToDate C /data ext4
-
これでDRBDボリュームが利用可能になります。
[root@serv111 ~]# df -h/dev/drbd0 9.9G 151M 9.2G 2% /data
DRBDの動作確認
動作確認として、アクティブ側のテストファイルがスタンバイ側へミラーリングされる事を確認します。
-
アクティブ側でテストファイルを作成後、スタンバイに降格させる。
尚、 スタンバイに降格させるためには、DRBDボリュームをアンマウントさせる 必要があります。[root@serv111 ~]# echo test > /data/index.html[root@serv111 ~]# umount /data[root@serv111 ~]# drbdadm secondary r0
-
スタンバイ側をアクティブに昇格させて、テストファイルの同期を確認します。
アクティブ側で作成したファイルが見れれば、DRBDの動作に問題はありません。[root@serv112 ~]# drbdadm primary r0[root@serv112 ~]# mount -t ext4 /dev/drbd0 /data[root@serv112 ~]# cat /data/index.htmltest
-
Pacemakerと連携させるため、DRBDボリュームをアンマウントしておきます。
[root@serv112 ~]# umount /data
apacheのインストール・設定
apacheインストール
-
apacheをインストールします
# yum install httpd
apacheの設定
-
手順を簡略化するため、最小限の設定を記載します。
# vi /etc/httpd/conf/httpd.conf#サーバ名を設定します。ServerName serv113#DocumentRootをDRBDボリュームに変更しますDocumentRoot "/data"#Pacemakerはserver-statusを利用してWEBサーバを監視するため有効にします。、
SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1
-
apacheはPacemaker経由で起動させるため、
自動起動をオフ
にします。
# chkconfig httpd off
Pacemaker,Corosyncのインストール・設定
Pacemaker,Corosyncのインストール
-
Pacemakerとcorosyncをインストールします。
# yum install corosync pacemaker
corosyncの設定
-
設定ファイルを作成して編集します。
# cp -rp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf# vi /etc/corosync/corosync.conf
compatibility: whitetankservice { name: pacemaker ver: 0 use_mgmtd: yes}totem { version: 2 secauth: off threads: 0 rrp_mode: active clear_node_high_bit: yes token: 4000 consensus: 10000 rrp_problem_count_timeout: 3000#インターコネクト1本目 interface { ringnumber: 0 bindnetaddr: 192.168.20.0 #IPではなくネットワークアドレス mcastaddr: 226.94.1.1 mcastport: 5405 ttl: 1 }#インターコネクト2本目 interface { ringnumber: 1 bindnetaddr: 192.168.30.0 #IPではなくネットワークアドレス mcastaddr: 226.94.1.1 mcastport: 5405 ttl: 1 }}logging { fileline: on to_syslog: yes syslog_facility: local1 syslog_priority: info debug: off timestamp: on logger_subsys { subsys: AMF debug: off }}amf { mode: disabled}
- compatibility
-
パラメーター互換性を指定する。 whitetankはopenais-0.80.zとの互換性を保ちます。
デフォルトでは、後方互換のwhitetankです。
- version
-
設定ファイルのバージョンを指定する。現在有効なバージョンは2のみ。
- secauth
-
メッセージをすべて確証するためにHMAC/SHA1認証が使用されるべきであることを明示します。
onにした場合は、CPUにそれなりの負荷が掛かるとの記載あり。
- threads
-
マルチキャストの暗号化通信に利用するスレッド数。
secauthがオフなので0を指定します。
- rrp_mode
-
冗長リングのモードを指定します。
複数のインタフェースの場合、active or passiveを設定します。
- clear_node_high_bit
- 生成されたnodeid を31bit以内に制限する。
- token
- プロセッサの故障を検出するまでの時間をミリ秒で指定します。デフォルトは1000ミリ秒です。
- consensus
-
クラスタ構成に新しいメンバが追加された際の待ち時間をミリ秒で指定します。
トークンの1.2倍以上を指定する必要があります。デフォルトは1200ミリ秒です。
- rrp_problem_count_timeout
-
これはリンクが一時的なネットワーク障害のために不良とマークされていないことを確認するために、
特定のリングに1つずつ問題カウントをデクリメントする前に待機する時間をミリ秒単位で指定します。
デフォルトは2000ミリ秒です。
- ringnumber
-
このインターフェイスのリング番号を指定します。リダンダントリングプロトコルを使用する場合、
各インタフェースが一意になるリダンダントリングのために使用するインターフェイスのメンバーシッププロトコルを
識別するための独立したリング番号を指定する必要があります。ringnumberは0から開始する必要があります。
- ttl
-
TTLを指定します。ルーティングされたネットワーク上を実行する場合はデフォルト「1」は小さ過ぎます。
これはマルチキャストトランスポートタイプでのみ有効であることに注意してください。
- fileline
- ファイル名と行をログ出力します。
- to_stderr
- ログを標準出力するか。
- to_syslog
- ログをsyslogへ出力する。
- to_logfile
- ログをファイルへ出力する設定。logfileで出力先を指定する必要がある。
- logfile
- ログファイルの出力先を指定する。
- debug
- デバックの設定。特定のloggerへ出力されている事を確認できる。
- timestamp
- ログにタイムスタンプを記載する
- logger_subsys
- 特定の設定を上書きするために使用する
- subsys
- サブシステムのID(名前)を指定する。
- mode
-
Availability Management Framework (AMF)を有効、無効を設定する。
OpenAISを利用する場合は有効にする。
ログ設定
-
corosyncのログは、messagesではなくcorosync.logtとして管理します。
# vi /etc/rsyslog.conf*.info;mail.none;authpriv.none;cron.none,local1.none /var/log/messages :(省略) :local1.* /var/log/cluster/corosync.log #■追加
-
corosyncのログがローテートされるよう設定を変更します。
# vi /etc/logrotate.d/syslog/var/log/cron/var/log/maillog/var/log/messages/var/log/secure/var/log/spooler/var/log/cluster/corosync.log #■追加{ sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript}
-
rsyslogを再起動して変更を反映させます。
# /etc/init.d/rsyslog restart
起動設定
-
corosyncを起動します。
# /etc/init.d/corosync startservice corosync startStarting Corosync Cluster Engine (corosync): [ OK ]
-
起動の確認
# crm_mon============Last updated: Sat May 12 22:40:06 2012Last change: Sat May 12 22:36:12 2012 via crmd on serv111Stack: openaisCurrent DC: serv111 - partition with quorumVersion: 1.1.6-3.el6-a02c0f19a00c1eb2527ad38f146ebc08348145582 Nodes configured, 2 expected votes0 Resources configured.============Online: [ serv111 serv112 ]
自動起動
-
corosyncを自動起動するよう設定します。
# chkconfig corosync on
-
PacemakerはConrosyncから呼び出されるため、
自動起動をoffにします。
# chkconfig pacemaker off
Pacemakerの設定
準備
-
DRBDを起動します。DRBDボリュームはPacemaker経由でマウントするためアンマウントします。
# /etc/init.d/drbd start# umount /data
-
corosyncを起動させておきます。
# /etc/init.d/corosync startStarting Corosync Cluster Engine (corosync): [ OK ]
crmでの設定
Pacemakerの設定はcrmコマンドで行います。
-
crmを起動してリソース設定モードに切り替えます。
# crm crm(live)# configurecrm(live)configure#
以降は、「 crm(live)configure# 」のプロンプトで実行します。
-
クラスタの全体設定を行います。
# property stonith-enabled="false" \no-quorum-policy="ignore" \default-action-timeout="240" \default-resource-stickiness="200"
- stonith-enabled
-
stonithはスプリットブレイン対策として、制御不能なサーバを強制的に電源OFFする機能です。
今回は設定を省きます。
- no-quorum-policy
-
quorumと呼ばれるスプリットブレイン対策の1つです。2台構成の場合はignoreを指定します。
quorumは下記資料がとても分かりやすいです。
http://linux-ha.sourceforge.jp/wp/?attachment_id=605
- resource-stickiness
- INFINITYを指定すると稼働中の自動フェイルバックしないようにする
-
リソースの全体設定を行います。
Pacemakerはデフォルト設定だと故障してもスタンバイ側にフェイルオーバーしません。
そのため、1回でも故障したらスタンバイ側にフェイルオーバーするようmigration-thresholdを設定します。
# rsc_defaults resource-stickiness="INFINITY" \migration-threshold="1"
-
DRBDリソースを定義します。
# primitive res_drbd ocf:linbit:drbd \params drbd_resource="r0" \op monitor interval="20s"
-
DRBDリソースに対して親子関係(master/slave)を定義します。
# ms ms_drbd res_drbd \meta master-max="1" master-node-max="1" \clone-max="2" clone-node-max="1" notify="true"
-
WEBサーバのリソースを定義します
# primitive res_httpd ocf:heartbeat:apache \params configfile="/etc/httpd/conf/httpd.conf" port="80" \op monitor interval="20s"
-
仮想IPアドレスの設定を行います。
# primitive res_vip ocf:heartbeat:IPaddr2 \params ip="192.168.11.113" cidr_netmask="24" nic="eth0" \op monitor interval="20s"
-
DRBDボリュームのマウント設定を行います。
# primitive res_filesystem ocf:heartbeat:Filesystem \params device="/dev/drbd0" directory="/data" fstype="ext4" \op monitor interval="20s"
-
リソースグループの設定を行います。
これによりグループのサービスが1つでもダウンしたら、全体(vip,filesystem,httpd)をフェールオーバーさせる事ができます。# group rg_web res_vip res_filesystem res_httpd
-
同居制約(rg_webとms_drbd:Masterを同一ノードで起動する)を設定します.
# colocation c_rg_web inf: rg_web ms_drbd:Master
-
起動順序を設定します。ここではDRBD起動後にWEBサービスが起動するように設定します。
# order o_rg_web inf: ms_drbd:promote rg_web:start
-
verifyコマンドで設定にエラーがない事を確認して、問題なければcommitで設定を反映します。
# verify# commit# exit
動作確認
故障時のフェイルオーバー
擬似的に故障を発生させてフェイルオーバーの動作確認を行います。
-
crm_monコマンドで各ノードがonlineになっている事を確認します。
[root@serv111 ~]# crm_mon -AfOnline: [ serv111 serv112 ] Master/Slave Set: ms_drbd [res_drbd] Masters: [ serv111 ] Slaves: [ serv112 ] Resource Group: rg_web res_vip (ocf::heartbeat:IPaddr2): Started serv111 res_filesystem (ocf::heartbeat:Filesystem): Started serv111 res_httpd (ocf::heartbeat:apache): Started serv111Node Attributes:* Node serv111: + master-res_drbd:0 : 5* Node serv112: + master-res_drbd:1 : 5Migration summary:* Node serv111:* Node serv112:
-
serv111(アクティブ側)のhttpdを強制停止させてフェイルオーバーの動作確認を行います。
[root@serv111 ~]# cat /etc/httpd/run/httpd.pid24792[root@serv111 ~]# kill -9 24792
-
スタンバイ側に切り替わった事を確認します。
[root@serv112 ~]# crm_mon -AfOnline: [ serv111 serv112 ] Master/Slave Set: ms_drbd [res_drbd] Masters: [ serv112 ] ■スタンバイ側で起動 Slaves: [ serv111 ] Resource Group: rg_web res_vip (ocf::heartbeat:IPaddr2): Started serv112 ■スタンバイ側で起動 res_filesystem (ocf::heartbeat:Filesystem): Started serv112 ■スタンバイ側で起動 res_httpd (ocf::heartbeat:apache): Started serv112 ■スタンバイ側で起動Node Attributes:* Node serv111: + master-res_drbd:0 : 5* Node serv112: + master-res_drbd:1 : 5Migration summary:* Node serv111: res_httpd: migration-threshold=1 fail-count=1 ■fail-countが1になる* Node serv112:Failed actions: res_httpd_monitor_20000 (node=serv111, call=50, rc=7, status=complete): not running
故障からの復旧
-
先ほど故障させたserv111は
「fail-count=1」のため、スタンバイとして機能しません。
[root@serv112 ~]# crm_mon -Af Migration summary: * Node serv111: res_httpd: migration-threshold=1 fail-count=1 ■fail-countが1の状態
-
スタンバイとして機能させるためには、下記の通り
「fail-count」をリセットする必要があります。
# crm resource cleanup rg_web serv111 Cleaning up res_ip on serv111 Cleaning up res_filesystem on serv111 Cleaning up res_httpd on serv111 Waiting for 4 replies from the CRMd.... OK
-
fail-countがリセットされた事を確認します。
[root@serv112 ~]# crm_mon -AfOnline: [ serv111 serv112 ] Master/Slave Set: ms_drbd [res_drbd] Masters: [ serv112 ] Slaves: [ serv111 ] Resource Group: rg_web res_vip (ocf::heartbeat:IPaddr2): Started serv112 res_filesystem (ocf::heartbeat:Filesystem): Started serv112 res_httpd (ocf::heartbeat:apache): Started serv112Node Attributes:* Node serv111: + master-res_drbd:0 : 5* Node serv112: + master-res_drbd:1 : 5Migration summary:* Node serv111:* Node serv112:
-
以上で終了です。WEBを別サービスに置き換えれば様々なサービスのクラスタが可能です。
その他
FAQ
Corosync起動時にエラーが発生する
-
Corosync起動時に下記エラーが発生する
parse error in config: 2 is too many configured interfaces for the rrp_mode setting none.
-
インターコネクトが複数ある場合、「corosync.conf」でrrp_modeを設定する必要があります。
rrp_modeはactive or passiveを設定して下さい。
Pacemaker起動時にエラーが発生する
-
Pacemaker起動時に下記エラーが発生する
[12468]: ERROR: read_config: We can only start Pacemaker from init if using version 1 of the Pacemaker plugin for Corosync. Terminating.
- Pacemaker 1.x はCorosyncから呼び出されるため、Pacemakerを起動する必要はありません。
コマンド
-
設定を全て削除する
# crm(live)configure# erase
-
構築後にpacemakerの設定を変更する
# crm configure edit
一度は目を通しておきたいサイト
Pacemaker
- Pacemakerインストール方法 CentOS 5編
- Pacemakerって何?~あなたもできる、簡単高信頼システムの構築~
- 第2回 Linux-HA Japan 勉強会 crm の歩き方
- 第4回 Pacemakerを運用してみよう![保守運用編(1)]
DRBD
- 体験! 新しくなったLinux-HA
- Pacemakerクラスタでスタック DRBD リソースを使用する