hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

ラベル heartbeat の投稿を表示しています。 すべての投稿を表示
ラベル heartbeat の投稿を表示しています。 すべての投稿を表示

2010-12-13

CentOSでheartbeatでVIP引き継ぎ(その2)

hnakamur’s blog: CentOSでheartbeatでVIP引き継ぎをまたやってみて少し知識が増えたので追記。

heartbeatのインストール時エラーの回避方法


heartbeatのインストール時にエラーになる件は、一旦heartbeat-pilsとheartbeat-stonithを入れてからheartbeatを入れれば回避できるとのこと。
sudo yum install heartbeat-pils heartbeat-stonith
sudo yum install heartbeat

参考:ベリラボ - wiki - CentOS52_heardbeatインストール、初期設定


/etc/ha.d/haresources

以下のようにネットワークアドレスのビット数やデバイスも指定可能。詳しくはサンプルファイル(/usr/share/doc/heartbeat-2.1.3/haresources)参照。
vm1 IPaddr::192.168.101.20/24/eth0

なお、このIPaddrは/etc/ha.d/resource.d/に置かれているスクリプト名で、手動でも実行可能です。

手動VIP追加
sudo /etc/ha.d/resource.d/IPaddr 192.168.101.20/24/eth0 start
手動VIP削除
sudo /etc/ha.d/resource.d/IPaddr 192.168.101.20/24/eth0 stop

ERROR: Setup problem: Couldn't find utility /bin/gawkの対処法

CentOSをインストール時にBaseのチェックもはずして最小構成にした場合の話です。

heartbeatの実行中に/var/log/ha-logに以下のエラーが発生しました。
ResourceManager[2873][2943]: 2010/12/13_16:08:00 info: Running /etc/ha.d/resource.d/IPaddr 192.168.101.20 start
IPaddr[2962][2976]: 2010/12/13_16:08:00 ERROR: Setup problem: Couldn't find utility /bin/gawk
IPaddr[2945][2977]: 2010/12/13_16:08:00 ERROR:  Program is not installed
R

gawkが無いとインストールしようとしましたが、すでに入っていました。

ググるとこちらに対処法が載ってました。
VIP not appearing when heartbeat starts | Linux-HA | Users

whichをインストールすれば解決します。
sudo yum install which

実験用監視スクリプト


#!/bin/sh

url=http://192.168.101.20/
timeout=2

while :
do
  response=`curl -s -S --connect-timeout $timeout $url`
  if [ $? -ne 0 ]
  then
    break
  fi

  echo "`date +%Y-%m-%dT%k:%M:%S` $response"

  sleep 1
done

2009-11-12

CentOSでheartbeatでVIP引き継ぎ

はじめに

Amazon.co.jp: Linux-DB システム構築/運用入門 (DB Magazine SELECTION): 松信 嘉範: 本とググってみつけたHot Linux - heartbeat(1.2.x)のインストール/設定(Redhat9,WhiteBoxEL4)などのページを参考に試しました。heartbeatの設定ファイルはv1形式にしました。

cent1 (192.168.122.21)とcent2 (192.168.122.22)の2台で相互監視する例を試しました。

インストール

$ sudo install heartbeat heartbeat-pils heartbeat-stonith
0002821: "yum install heartbeat" fails - CentOS Bug Trackerのバグのため、heartbeatのインストールはもう一度実行する必要がありました。
$ sudo install heartbeat

設定

ファイアウォールでUDPのポート694を開ける

言わずもがなということで巷の説明では省略されていますが、忘れててはまったので私の場合は注意が必要です。

$ sudo vi /etc/sysconfig/iptables

以下の行を適当なところに挿入します。

-A RH-Firewall-1-INPUT -p udp -m udp --dport 694 -j ACCEPT
$ sudo /etc/init.d/iptables restart
$ sudo /sbin/iptables -L

以下の行が含まれることを確認。

ACCEPT     udp  --  anywhere             anywhere            udp dpt:ha-cluster 

/etc/ha.d/ha.cf

cent1では以下のようにします。

use_logd yes

keepalive 500ms
deadtime 10
warntime 5
initdead 60

ucast eth0 192.168.122.22

auto_failback off
#auto_failback on

node cent1
node cent2

uuidfrom nodename

cent2ではucastの行を以下のようにします。

ucast eth0 192.168.122.21

当初uuidfrom nodenameの行を忘れてはまったので注意。この指定が無いと、/var/lib/heartbeat/hb_uuidをマシンのUUIDとして使うので、仮想イメージファイルをクローンして作ったためか同じ内容になってしまい、以下のようなエラーが延々とログに出ることになります。

heartbeat[14054]: 2009/11/12_18:17:32 WARN: nodename cent1 uuid changed to cent2
heartbeat[14054]: 2009/11/12_18:17:32 WARN: nodename cent2 uuid changed to cent1
heartbeat[14054]: 2009/11/12_18:17:32 WARN: nodename cent1 uuid changed to cent2

/etc/ha.d/haresources

プライマリのノードと仮想IPアドレスを設定します。ですのでcent1でもcent2でも同じ内容にします。

cent1 192.168.122.90

/etc/ha.d/authkeys

2台ともLAN内なので認証はcrcにしました。

auth 1
1 crc
$ sudo chmod 600 /etc/ha.d/authkeys

実験

cent1、cent2ともコマンドを実行する端末とは別に端末を起動しておいてtail -f /var/log/ha-logを実行しておくと動きを見られてよいです。

まず、cent1でheartbeatを起動します。

cent1$ sudo /etc/init.d/heartbeat start

起動してしばらくすると、仮想IPアドレスが設定されます。ipコマンドで確認するなら以下のようにします。

cent1$ /sbin/ip addr show eth0
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.21/24 brd 192.168.122.255 scope global eth0
    inet 192.168.122.90/24 brd 192.168.122.255 scope global secondary eth0:0
    inet6 fe80::5054:ff:fe12:3456/64 scope link 
       valid_lft forever preferred_lft forever

ifconfigで確認する場合は以下のようにします。

cent1$ /sbin/ifconfig -a eth0:0
eth0:0    Link encap:Ethernet  HWaddr 52:54:00:12:34:56  
          inet addr:192.168.122.90  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:10 Base address:0xc000

cent1だけ起動してcent2を起動しない場合はha.cfのinitdeadの設定値、この場合は60秒後に仮想IPアドレスが設定されました。

cent1を起動してすぐにcent2も起動した場合はcent1のログにLink cent2:eth0 upと出力されてから13秒後に仮想IPアドレスが設定されました。ha.cfのdeadtimeが10秒という設定なので、これ+αということのようです。

次に、cent2でheartbeatを起動します。

cent2$ sudo /etc/init.d/heartbeat start

ログを見て起動が完了したことを確認したら、cent1でheartbeatを停止してみます。

cent1$ sudo /etc/init.d/heartbeat stop

ログを見て仮想IPが引き継がれた旨が表示されたらipまたはifconfigで確認してみると無事引き継がれていることを確認できました。

2009-08-22

試行錯誤でheartbeatを設定して動作確認するがうまくいかず

HAクラスタシステム構築(Heartbeat+DRBD) - CentOSで自宅サーバー構築を参考に/etc/ha.d/haresourcesという設定ファイルを作り、それを変換して/var/lib/heartbeat/crm/cib.xmlを作ってみた。Linux HAのharesources2cib.pyについての説明ページのConversion ExamplesのActive/Active Two IP address configurationの設定をまねて/etc/ha.d/haresourcesを作成。

# vi /etc/ha.d/haresources

作成内容

vm10 192.168.11.241
vm11 192.168.11.242

これを変換して/var/lib/heartbeat/crm/cib.xmlを作成。

# cd /var/lib/heartbeat/crm
# mv cib.xml cib.xml.orig
# /usr/lib/heartbeat/haresources2cib.py --stdout -c /etc/ha.d/ha.cf /etc/ha.d/haresources > cib.xml

vm10とvm11でheartbeat起動

# /etc/init.d/heartbeat start

crm_monでモニター

# /usr/sbin/crm_mon -i 3

しかし、vm10ではvm10しか一覧にしか出ないし、vm11ではvm11しか一覧に出ない。OFFLINEからonlineになるまでも数分ぐらいかかるし。なんだかよくわからないが、うまくいってないようだ。

とりあえず起動時に上げないようにしておく。

# chkconfig heartbeat off

EPELからheartbeatをインストール

インストール試すが依存関係で失敗

# yum install heartbeat

すると依存するlibnet.so.1が無いというエラー発生

Resolving Dependencies
--> Running transaction check
---> Package heartbeat.i386 0:2.1.4-9.el5 set to be updated
--> Processing Dependency: libstonith.so.1 for package: heartbeat
--> Processing Dependency: libpils.so.1 for package: heartbeat
--> Processing Dependency: libltdl.so.3 for package: heartbeat
--> Processing Dependency: libnet.so.1 for package: heartbeat
--> Running transaction check
---> Package libtool-ltdl.i386 0:1.5.22-6.1 set to be updated
---> Package heartbeat-stonith.i386 0:2.1.4-9.el5 set to be updated
--> Processing Dependency: net-snmp-libs for package: heartbeat-stonith
--> Processing Dependency: libnetsnmp.so.10 for package: heartbeat-stonith
---> Package heartbeat-pils.i386 0:2.1.4-9.el5 set to be updated
---> Package heartbeat.i386 0:2.1.4-9.el5 set to be updated
--> Processing Dependency: libnet.so.1 for package: heartbeat
--> Running transaction check
---> Package net-snmp-libs.i386 1:5.3.2.2-5.el5_3.2 set to be updated
---> Package heartbeat.i386 0:2.1.4-9.el5 set to be updated
--> Processing Dependency: libnet.so.1 for package: heartbeat
--> Finished Dependency Resolution
heartbeat-2.1.4-9.el5.i386 from epel has depsolving problems
  --> Missing Dependency: libnet.so.1 is needed by package heartbeat-2.1.4-9.el5.i386 (epel)
Error: Missing Dependency: libnet.so.1 is needed by package heartbeat-2.1.4-9.el5.i386 (epel)

libnet.soを求めて(失敗の巻)

libnet.soを含むパッケージを調べる。

# yum provides libnet.so
...(略)...
1463 packages excluded due to repository priority protections
1:java-1.6.0-openjdk-1.6.0.0-0.25.b09.el5.i386 : OpenJDK Runtime Environment
Matched from:
Other       : libnet.so



1:java-1.6.0-openjdk-1.6.0.0-0.30.b09.el5.i386 : OpenJDK Runtime Environment
Matched from:
Other       : libnet.so



1:java-1.6.0-openjdk-1.6.0.0-1.2.b09.el5.i386 : OpenJDK Runtime Environment
Matched from:
Other       : libnet.so

heartbeatがOpenJDKに依存しているってほんとかと思いつつ一応入れてみる。まずどこのレポジトリか確認。

# yum info java-1.6.0-openjdk

によるとupdatesレポジトリにあるらしい。

# yum install java-1.6.0-openjdk

libnet.soがインストールされたか確認

# rpm -ql java-1.6.0-openjdk | grep libnet
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/i386/libnet.so

ここに入るってことはOpenJDKしかみないよな。こんなとこにLD_LIBRARY_PATH通すとも思えないし。

yum install heartbeatを再度試すがやはり同じエラーが出ました。ということでOpenJDKを依存パッケージごとアンインストールします。

# yum remove java-1.6.0-openjdk giflib jpackage-utils libXtst

libnet.soを求めて(成功の巻)

libnetで検索してみる

# yum search libnet
...(略)...
=============================== Matched: libnet ================================
echoart.i386 : Responds to or drops ICMP echo requests packets
libnet.i386 : Routines to help with network packet contruction and handling
libnet-devel.i386 : Development files for the libnet library
libnet10.i386 : High-level API (toolkit) to construct and inject network packets
libnet10-devel.i386 : Development files for the libnet library
libnetfilter_conntrack.i386 : Netfilter conntrack userspace library
libnetfilter_conntrack-devel.i386 : Header files, libraries and development
                                  : documentation for libnetfilter_conntrack.
perl-Net-ARP.i386 : Create and send ARP packets
perl-Net-TFTP.noarch : TFTP Client class

libnetとかlibnet10がそれっぽい。

libnetを入れてみる

# yum install libnet

内容を確認

# rpm -ql libnet | lv

/usr/lib/libnet.aはあるが、libnet.soは確かに無い。

libnet10を入れてみる

# yum install libnet10

内容を確認

# rpm -ql libnet10 | lv

/usr/lib/libnet10.so.0というファイルならあったがlibnet.soはない。

libnetとlibnet10をアンインストール後、どのレポジトリか確認。

# yum remove libnet libnet10
# yum info libnet

extrasと判明。extrasからlibnet*を除外。

# vi /etc/yum.repos.d/Cent-Base.repo

変更内容

--- /etc/yum.repos.d/CentOS-Base.repo   2009/08/21 15:08:54     1.4
+++ /etc/yum.repos.d/CentOS-Base.repo   2009/08/21 15:22:08
@@ -48,7 +48,7 @@
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
 priority=1
-exclude=heartbeat-*
+exclude=heartbeat-*,libnet*
 
 #additional packages that extend functionality of existing packages
 [centosplus]

再度確認

# yum info libnet

今度はrpmforgeでヒットしたので、ここからも除外

# vi /etc/yum.repos.d/rpmforge.repo

変更内容

--- /etc/yum.repos.d/rpmforge.repo      2009/08/21 09:09:14     1.2
+++ /etc/yum.repos.d/rpmforge.repo      2009/08/21 15:22:29
@@ -10,3 +10,4 @@
 gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
 gpgcheck = 1
 priority = 11
+exclude=libnet*
# yum info libnet

これでRepo: epelになったので、インストール。

# yum install libnet
# rpm -ql libnet | lv

/usr/lib/libnet.so.1が含まれている事を確認。

heartbeatのインストール再実行して成功

# yum install heartbeat
...(略)...
Dependencies Resolved

================================================================================
 Package                Arch      Version                    Repository    Size
================================================================================
Installing:
 heartbeat              i386      2.1.4-9.el5                epel         1.6 M
Installing for dependencies:
 heartbeat-pils         i386      2.1.4-9.el5                epel          90 k
 heartbeat-stonith      i386      2.1.4-9.el5                epel         169 k
 libtool-ltdl           i386      1.5.22-6.1                 base          37 k
 net-snmp-libs          i386      1:5.3.2.2-5.el5_3.2        updates      1.2 M
...(略)...

今度は無事インストールできました。今回の教訓は先にexcludeを調整して希望のパッケージが希望のレポジトリから取得できるようにすることが大切ということです。

2009-08-21

CentOSでheartbeatを使おうとしたがうまくいかず

2009-08-27追記: その後keepalivedに乗り換えました

CentOS-Testingからkeepalivedを入れてVRRPの実験に書きました。

選定理由

手元の本ではkeepalivedを使っていたので当初そちらにしようかと思いましたが、yum searchでは見つかりませんでした。調べてみると同等の機能としてheartbeatというパッケージがあるらしい。23. High Availability LVS: Failover protectionには以下のような説明がありました。

This is handled by having a redundant director available. Director failover is handled in the Ultra Monkey Project by heartbeat. Other code used for failover is vrrpd in keepalived.

Ultra Monkey Projectもyum searchでは見つからず、また調べてみるとheartbeat-ldirectordというパッケージで同等の機能が使えるっぽい。ということでこちらを試すことにしました。

セットアップ

以下のサイトを参考にしました。

$ sudo yum install ipvsadm heartbeat heartbeat-ldirectord

haclusterユーザが既に存在するという旨のエラーが出てheartbeatがインストールされないので、再度行う。

$ sudo yum install heartbeat

設定ファイル作成

/etc/ha.d/ha.cf

$ cd /etc/ha.d
$ sudo cp /usr/share/doc/heartbeat-2.1.3/ha.cf .
$ sudo vi ha.cf

変更内容

--- ha.cf       2009/08/21 10:57:54     1.1
+++ ha.cf       2009/08/21 11:42:22
@@ -49,7 +49,7 @@
 #
 #      keepalive: how long between heartbeats?
 #
-#keepalive 2
+keepalive 2
 #
 #      deadtime: how long-to-declare-host-dead?
 #
@@ -57,12 +57,12 @@
 #              split-brain (or cluster partition) problem.
 #              See the FAQ for how to use warntime to tune deadtime.
 #
-#deadtime 30
+deadtime 30
 #
 #      warntime: how long before issuing "late heartbeat" warning?
 #      See the FAQ for how to use warntime to tune deadtime.
 #
-#warntime 10
+warntime 10
 #
 #
 #      Very first dead time (initdead)
@@ -72,12 +72,12 @@
 #      we have a separate dead time for when things first come up.
 #      It should be at least twice the normal dead time.
 #
-#initdead 120
+initdead 120
 #
 #
 #      What UDP port to use for bcast/ucast communication?
 #
-#udpport       694
+udpport        694
 #
 #      Baud rate for serial ports...
 #
@@ -92,7 +92,7 @@
 #
 #      What interfaces to broadcast heartbeats over?
 #
-#bcast eth0            # Linux
+bcast  eth0            # Linux
 #bcast eth1 eth2       # Linux
 #bcast le0             # Solaris
 #bcast le1 le2         # Solaris
@@ -212,8 +212,8 @@
 #
 #      Tell what machines are in the cluster
 #      node    nodename ...    -- must match uname -n
-#node  ken3
-#node  kathy
+node   vm10
+#node  vm11
 #
 #      Less common options...
 #
@@ -255,6 +255,7 @@
 #
 #respawn userid /path/name/to/run
 #respawn hacluster /usr/lib/heartbeat/ipfail
+respawn root /usr/lib/heartbeat/pingd -m 100 -d 5s -a default_ping_set
 #
 #      Access control for client api
 #              default is no access
@@ -324,7 +325,7 @@
 #      more infomartion can be fould in http://www.linux-ha.org/ha_2ecf_2fUseLogdDirective
 #      Setting use_logd to "yes" is recommended
 #
-# use_logd yes/no
+use_logd yes
 #
 #      the interval we  reconnect to logging daemon if the previous connection failed
 #      default: 60 seconds
@@ -342,3 +343,5 @@
 #      will be compressed, the default is 2 (KB)
 #compression_threshold 2

+#      Enable cluster resource manager
+crm yes

なお、ja/pingd_ja: Linux HAによるとpingdはipfailにとって代わるコマンドらしい。

/etc/ha.d/logd.cf

$ sudo cp /usr/share/doc/heartbeat-2.1.3/logd.cf .
$ sudo vi logd.cf

変更内容

--- logd.cf     2009/08/21 11:45:09     1.1
+++ logd.cf     2009/08/21 11:45:46
@@ -1,18 +1,18 @@
 #      File to write debug messages to
 #      Default: /var/log/ha-debug
-#debugfile /var/log/ha-debug
+debugfile /var/log/ha-debug
 
 #
 #
 #      File to write other messages to
 #      Default: /var/log/ha-log
-#logfile       /var/log/ha-log
+logfile        /var/log/ha-log
 
 #
 #
 #      Facility to use for syslog()/logger 
 #      Default: daemon
-#logfacility   daemon
+logfacility    none
 
 
 #      Entity to be shown at beginning of a message

/etc/ha.d/authkeys

$ sudo cp /usr/share/doc/heartbeat-2.1.3/authkeys .
$ sudo chmod 600 /etc/ha.d/authkeys
$ sudo vi authkeys

変更内容

--- authkeys    2009/08/21 11:46:47     1.1
+++ authkeys    2009/08/21 11:47:40
@@ -20,7 +20,7 @@
 #      crc adds no security, except from packet corruption.
 #              Use only on physically secure networks.
 #
-#auth 1
-#1 crc
+auth 1
+1 crc
 #2 sha1 HI!
 #3 md5 Hello!

VMクローン

インストールや設定ファイルの変更をvm10と同様にvm11でも行うのは手間なので、vm10の1台でセットアップして、KVMのゲストOSイメージをコピーの手順でvm11を作り直しました。こっちのほうが楽です。

動作実験するも問題発生

サービス開始。2台で実行。

$ sudo /etc/init.d/heartbeat start

モニターしてみる。1台で実行。しかしエラー発生。

$ /usr/sbin/crm_mon -i 3
Defaulting to one-shot mode
You need to have curses available at compile time to enable console mode
Critical: Unable to connect to the CIB

調べてみると既知バグで0003226: heartbeat crm_mon not compiled with ncurses - CentOS Bug Trackerに登録されていました。

ブログ アーカイブ