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の両方で実行
↑

システム構成

↑

構成概要

drbh_pacemaker_corosync.JPG
↑

アクティブ側

  • ホスト名(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
↑

メタファイルの作成

  • メタファイルを作成します。
    # 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

↑

DRBD

このエントリーをはてなブックマークに追加
Last-modified: 2012-06-14 (木) 02:26:25   最終更新のRSS