日次アーカイブ: 2009年01月04日

またまたお金をかけずに冗長化しようシリーズです(笑)。今回はCentOS 5.2でbonding設定を行ったのでメモ。NICはeth0とeth1があるので、これを組み合わせてbond0にします。今回行う設定は以下の通り。

bond0のIPアドレス・・・192.168.0.100/24
bond0にまとめるインターフェイス・・・eth0とeth1
IPv6は設定しない

1. bondingモジュールの読み込み

[root@ishikari ~]# cd /etc/modprobe.d/
[root@ishikari modprobe.d]# vi bonding
alias bond0 bonding
option bond0 miimon=100 mode=1 primary=eth0

今回はNICの監視をMIIにやらせます。

2. bondingインターフェースの定義

[root@ishikari ~]# cd /etc/sysconfig/network-scripts/
[root@ishikari network-scripts]# vi ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
BROADCAST=192.168.0.255
IPADDR=192.168.0.100
IPV6ADDR=
IPV6PREFIX=
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes

3. bondインターフェースへethXデバイスを参加させる

既存のeth0とeth1にIPアドレスを設定せず、bond0のslaveとして振舞うように設定する。

[root@ishikari network-scripts]# vi ifcfg-eth0
# Realtek Semiconductor Co., Ltd. RTL-8169 Gigabit Ethernet
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes

[root@ishikari network-scripts]# vi ifcfg-eth1
# Intel Corporation 82540EM Gigabit Ethernet Controller
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes

あとはネットワークの再起動をするだけ。
# /etc/init.d/network restart

確認してみる。
$ /sbin/ifconfig
bond0     Link encap:Ethernet  HWaddr 00:90:CC:E9:2D:DD
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::290:ccff:fee9:2ddd/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:226686 errors:0 dropped:0 overruns:0 frame:0
          TX packets:254940 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:53590591 (51.1 MiB)  TX bytes:65817477 (62.7 MiB)

eth0      Link encap:Ethernet  HWaddr 00:90:CC:E9:2D:DD
          inet6 addr: fe80::290:ccff:fee9:2ddd/64 Scope:Link
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:226686 errors:0 dropped:0 overruns:0 frame:0
          TX packets:254942 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:53590591 (51.1 MiB)  TX bytes:65817801 (62.7 MiB)
          Interrupt:193 Base address:0xa000

eth1      Link encap:Ethernet  HWaddr 00:90:CC:E9:2D:DD
          UP BROADCAST SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Base address:0xecc0 Memory:fe100000-fe120000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8019 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8019 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:943061 (920.9 KiB)  TX bytes:943061 (920.9 KiB)

はいできたー。あとはケーブルを片方ずつひっこ抜いて、通信が途切れないのを確認すればOK。
ね、簡単でしょ?

※ 注意点
非bond環境からbonding環境にするときはそのままモジュールを読み込めばよいが、bonding環境から非bond環境に戻すときは、ネットワークの再起動だけじゃなくてOSごと再起動したほうがよい。

前回までのエントリー(コレコレ)で、heartbeatのインストールとVIPの引継ぎができました。しかしそれだけじゃ冗長化には程遠いってのが人情。次は、apacheのサービスを引き継がせてみましょう。

■ httpdの停止

[重要]
heartbeatの設定をする前に、既存のhttpdを停止します。勿論、httpdの自動起動も停止しておきます。これは、今後httpdの起動停止をheartbeatがつかさどるためです。

[root@ishikari ~]# /etc/init.d/httpd stop
[root@ishikari ~]# chkconfig httpd off
[root@ishikari ~]# chkconfig httpd --list
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
    ↑
すべてのランレベルでoffになっていることを確認する。

※ 注意
yumでhttpdをインストールして、/etc/sysconfig/httpd ファイルを使って apache を worker モードで動かしている場合、heartbeat経由ではこの設定が失われてしまいます(preforkで動作してしまうってこと)。よって、 /usr/sbin/httpd を /usr/sbin/httpd.orig としてバックアップし、 /usr/sbin/httpd.worker へのシンボリックリンクとして /usr/sbin/httpd を設定すること。

例)
# mv /usr/sbin/httpd /usr/sbin/httpd.orig ; ln -s /usr/sbin/httpd.worker /usr/sbin/httpd

■ heartbeat停止

一旦両系でheartbeatを停止します。

[root@ishikari ~]# /etc/init.d/heartbeat stop
Stopping High-Availability services:
                                                           [  OK  ]

■ httpd監視設定を行う

[root@ishikari ~]# cd /var/lib/heartbeat/crm/

※ すべてのファイルをバックアップする
[root@ishikari crm]# tar czf cib.tar.gz *

※ cib.xml.last cib.xml.sig cib.xml.sig.last を削除する
[root@ishikari crm]# rm -f cib.xml.last cib.xml.sig cib.xml.sig.last

cib.xml を編集する
[root@ishikari crm]# vi cib.xml

まず、タグの直下にある、の閉じタグ「」を削除します。(そもそも閉じタグだけで、 タグが開始されていないが・・・)

※ ここを
    
      
      
    

    

※ こうする
    
      
      
    

次に、タグの直下に、以下を追記します。
ココで投入する固有の値は「group_apache(どうやらグループの名前は何でもよいっぽい)」「192.168.0.200(httpをlistenするVIPの値)」「eth0(VIPをeth0インターフェイスのエイリアスにする)」「24(サブネットマスクのビット数)」「/etc/httpd/conf/httpd.conf(httpd.confのフルパス)」です。

    
      
                 
          
            
            
            
          

        

      
               
          
            
          

        

        
      

    

以上の設定が終わったら保存します。

■ httpd.confを修正する

[root@ishikari crm]# cd /etc/httpd/conf
[root@ishikari conf]# cp -p httpd.conf httpd.conf.20090104
[root@ishikari conf]# vi httpd.conf

※ ここを
Listen 80

※ こうする
Listen 192.168.0.200:80

※ ここを
#
#    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .example.com
#

※ こうする

    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.0

■ heartbeatを起動する

[root@ishikari ~]# /etc/init.d/heartbeat start
Starting High-Availability services:
                                                           [  OK  ]

[root@sorachi ~]# /etc/init.d/heartbeat start
Starting High-Availability services:
                                                           [  OK  ]

■ 起動後の確認

しばらく時間をおいて、両系にて監視コマンドを実行します。以下のよう

前回のエントリーで、yumを使ったheartbeatインストールができました。今度はheartbeatでVIPを引き継ぐところまでの設定をやってみましょう。

■ 認証ファイル作成

/etc/ha.d/authkeys ファイルを作成します。サンプルは /usr/share/doc/heartbeat-2.1.3/authkeys にあるので、ここからコピーします。

[root@ishikari ~]# cd /etc/ha.d/
[root@ishikari ha.d]# cp -p /usr/share/doc/heartbeat-2.1.3/authkeys ./
[root@ishikari ha.d]# vi authkeys

authkeys ファイルには
sha1 is believed to be the "best", md5 next best.
と書いてあるので、一番安全なsha1での暗号化を採用します。書き方は以下の通り。

auth 1
1 sha1 oresama

上記書き方の例にある、キーワードauth の後に入力するインデックスが何であれ、インデックスは、このファイル内のキーの下に入力しなければなりません。「auth 4」を入力した場合は、下のリストに「4 署名タイプ」行を含めなければならないことに注意。また、「oresama」は別にどんな文字列でもよく、monaでもgikoでも構いません。

■ 認証ファイルのパーミッションを600にする

authkeys ファイルの先頭にも注意書きが書いてあるように、パーミッションは600にすること。

[root@ishikari ha.d]# chmod 600 authkeys

■ ha.cfファイル作成

/etc/ha.d/ha.cf ファイルを作成します。サンプルは /usr/share/doc/heartbeat-2.1.3/ha.cf にあるので、ここからコピーします。

[root@ishikari ha.d]# cp -p /usr/share/doc/heartbeat-2.1.3/ha.cf ./
[root@ishikari ha.d]# vi ha.cf

# Heartbeatでv2スタイルのクラスタマネージャを実行するように設定。
crm on

# Heartbeatがデバッグメッセージを書き込むファイルを指定する。use_logdが有効な場合は無視される。
debugfile /var/log/ha-debug

# Heartbeatのデバッグ以外のメッセージは全て、このファイルに出力される。use_logdが有効な場合は無視される。
logfile /var/log/ha-log

# メッセージのログに使用するsyslogログファシリティを定義する。use_logdが有効な場合は無視される。
logfacility     local0

# キープアライブパケットの間隔を指定する。
keepalive 2

# Heartbeatがクラスタのノードが停止していると判断するまでの時間を指定する。
deadtime 2

# ping応答がない場合ダウンしたと認知する時間
deadping 1

# ハートビートが返ってこない場合警告となる時間
warntime 1

# 起動時間とネットワーク初期化を考慮して、(再起動後などに)全てが最初に起動してから、
# ノードが停止していると判断するまでの待機時間を指定する。
initdead 60

# ノード間の通信にHeartbeatが使用するポートを指定する。デフォルトは694。
udpport 694

# eth0インターフェースで、相手先ホストにパケットを送信する。
# [for ishikari(192.168.0.100)] ucast eth1 192.168.1.101
# [for sorachi(192.168.0.101)] ucast eth1 192.168.1.100
ucast eth0 192.168.0.101

# (デフォルト設定) 自動フェイルバックを有効にする。
auto_failback on

# クラスタ参加のノード名を指定する。ここに入力する値は、
# 各々のノードで「uname -n」を実行した結果と同じでなければならない。
node    ishikari.in.example.com
node    sorachi.in.example.com

# pingの設定を行う。
# From: http://www.ibm.com/developerworks/jp/linux/library/l-linux-ha/index.html
# respawn ディレクティブは、実行してその動作をモニターするプログラムを指定するために使用します。
# 指定したプログラムの終了コードが 100 以外であれば、プログラムは自動的に再起動されます。
# 最初のパラメーターはプログラムを実行するユーザー ID で、2 番目のパラメーターは実行対象のプログラムです。
# -m パラメーターでは pingd 属性を現行のマシンから到達可能な ping ノード数の 100 倍に設定し、
# -d パラメーターでは CIB の pingd 属性を変更するまでの遅延時間を 5 秒に設定しています。
# ping ディレクティブは、Heartbeat に対して PingNode を宣言するためのものです。
# そして最後の crm ディレクティブで、Heartbeat に 1.x 形式のクラスター・マネージャーを実行させるか、
# または 3 ノード以上をサポートする 2.x 形式のクラスター・マネージャーを実行させるかを指定します。
#
# このファイルはすべてのディレクターで同じでなければなりません。そして絶対不可欠なのは、
# hacluster デーモンがこのファイルを読み取れるような許可を適切に設定することです。このようにしないと、
# ログ・ファイルに大量の警告が記録されてデバッグが困難になります。
respawn root    /usr/lib/heartbeat/pingd -m 100 -d 5s -a default_ping_set

ここまで終わったら、sorachi側でもほぼ同じ設定を行います。
ishikariと違うのは
ucast eth0 192.168.0.101 を
ucast eth0 192.168.0.100
と設定するとこだけ。

■ 両系でheartbeatを起動する。

[root@ishikari ~]# /etc/init.d/heartbeat start
Starting High-Availability services:
                                                           [  OK  ]

[root@sorachi ~]# /etc/init.d/heartbeat start
Starting High-Availability services:
                                                           [  OK  ]

■ 自動起動設定をする。

[root@ishikari ~]# chkconfig heartbeat on
[root@sorachi ~]# chkconfig heartbeat on

■ 両系で手動死活監視を行う。

crm_mon コマンドで、ステータスがonlineで帰ってくること。

================================================================================
[root@ishikari ~]# crm_mon -i 3
Defaulting to one-shot mode
You need to have curses available at compile time to enable console mode

============
Last updated: Sun Jan  4 03:56:53 2009
Current DC: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba)
2 Nodes configured.
0 Resources configured.
============

Node: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba): online
Node: ishikari.in.example.com (82d27f7b-4e9a-478e-bcc1-80da0140a4a7): online
================================================================================
[root@sorachi ~]# crm_mon -i 3
Defaulting to one-shot mode
You need to have curses available at compile time to enable cons
ole mode

============
Last updated: Sun Jan  4 03:56:57 2009
Current DC: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba)
2 Nodes configured.
0 Resources configured.
============

Node: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba): online
Node: ishikari.in.example.com (82d27f7b-4e9a-478e-bcc1-80da0140a4a7): online
================================================================================

もし、自系でも他系でも
================================================================================
Node: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba): OFFLINE
Node: ishikari.in.example.com (82d27f7b-4e9a-478e-bcc1-80da0140a4a7): OFFLINE
================================================================================
と帰ってくるようなら、DNSかhostsで名前解決がなされていないか、VIPではない、リアルなIPアドレスの設定が間違っているかのどちらかが考えられます。

これで、単純なVIPの引継ぎができました。次のエントリーでは、apacheのサービスを引き継ぐ設定を行います。

webサーバの冗長化をするのに、ロードバランサ買うお金がない (っ´∀`)っ ゃー は、以前リバースプロキシを作ったことはありますが、今度はheartbeatでの冗長化にチャレンジです。

■■ 環境

■ サーバ共通スペック

Dell PowerEdge 600SC
Pentium    4 2.4GHz
Memory 2GB

■ ホスト情報

[ishikari.in.example.com]
eth0 192.168.0.100

[sorachi.in.example.com]
eth0 192.168.0.101

■ ネットワーク

ishikariとsorachiにそれぞれ、仮想IPアドレス(以下VIP)として192.168.0.200を割り当ててこれをhttp受信用に使います。ただし、VIPの設定はheartbeatの設定ファイルで行うため、先んじてエイリアスを切る必要はありません。192.168.0.200 は、ezo.in.example.com でもアクセスできるよう、あらかじめPCのhostsに書いておきます。

■■ 参考

http://www.server-world.info/note?os=ce5&p=heartbeat&f=1
http://www.server-world.info/note?os=ce5&p=heartbeat&f=2
http://www.linux-ha.org/ja/GettingStartedRevisedV2_ja
http://enterprisezine.jp/article/detail/162

■■ 注意点

これらの作業は、ishikari、sorachiともに基本的な設定を同じにします。ただし、それぞれのホストに固有の設定をしなけらばならない箇所については、文中に但し書きをしています。

■ heartbeatインストール

[root@ishikari ~]# yum install heartbeat

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 heartbeat               i386       2.1.3-3.el5.centos  extras            1.7 M
Installing for dependencies:
 PyXML                   i386       0.8.4-4          base              1.1 M
 heartbeat-pils          i386       2.1.3-3.el5.centos  extras            213 k
 heartbeat-stonith       i386       2.1.3-3.el5.centos  extras            311 k

Transaction Summary
=============================================================================
Install      4 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 3.3 M
Is this ok [y/N]: y

しかし、heartbeatは1回ではインストールされず、もう一度yumでインストールしてあげる必要があります。

[root@ishikari ~]# yum install heartbeat

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 heartbeat               i386       2.1.3-3.el5.centos  extras            1.7 M

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 1.7 M
Is this ok [y/N]: y

今度はOK。

Transaction Test Succeeded
Running Transaction
  Installing: heartbeat                    ######################### [1/1]

Installed: heartbeat.i386 0:2.1.3-3.el5.centos
Complete!
※ sorachiでは、先に PyXML heartbeat-stonith heartbeat-pils をインストールしてみたのですが、やはりheartbeatは2度インストールする必要がありました。

さて、インストールが終わったところで、今度は設定作業です。