あっという間に9月なわけですが 来月に予定されていたクラスタ集会@プラハは中止となりました。 あんどりゅーくんも、ふぁびおくんも、ふろーりあんくんも 主要な開発者が雁首そろえて「ごめーん、忙しーい」ということなので中止です。

F2Fのミーティングは無理だけど、webinarとか使ってオンラインでミーティングしようね!と、らーすくんが言っているので、興味のある方はこちらにご参加ください。 開催時間などが確定次第、メーリングリストなどでもご案内します。

というわけで今月も

(1) リリース情報 (2) 知恵袋

です。

(1) リリース情報 大きなリリースはありませんでしたが、あんどりゅーくんが着々とバージョンアップの準備を行っています。 先日、Pacemakerのリポジトリにversion 1.1.6のタグがつきました。

リリースの準備として、valgrindやcoverityを使用したコードチェックが実施されていますが、 valgrindで以下3点のメモリリークが検知されています。

High: PE: Fix memory leak for re-allocated resources reported by valgrind Low: PE: Set the name of a xml node in the better way - Fix memory leak High: PE: Resolve memory leak reported by valgrind

ただし、これらのコードはPacemaker 1.1.5のリリース後に混入しているので Pacemaker 1.1.5もしくは、Pacemaker 1.0.10, 1.0.11を使用している場合は影響ありません。 Pacemaker 1.1.6のリリースに向けて、Pacemaker 1.0.12へのバックポートも開始されています。

あ、そういえば、リリースといえば、こんなのもありました。

Announcing - the Assimilation monitoring system - a sub-project of Linux-HA

こんなのとかって言っちゃ悪いか…。 これ作ってる、あらんって、Heartbeat本体をつくったエライ人なんですけどね…。 どーも、あんどりゅーくんと相性が悪いというかなんというか(棒

ちなみに、この「the Assimilation monitoring system」ですが、中身的には matahariとかpacemaker-cloudとだいぶかぶってるよね?という指摘もされており うーむ、あらんはこれからどこへ行こうとしているのか…。 (2) 知恵袋

今月はcrmを使った設定のTipsをご紹介します。

 

さて、こちらは、もういい加減見飽きた感のある仮想IPの設定ファイルですね。 仮想IPが同じノードで2個(ip01,ip02)起動する設定です。

# cat sample01.crm   property \ no-quorum-policy="ignore" \ stonith-enabled="false" \ startup-fencing="false" rsc_defaults \ resource-stickiness="INFINITY" \ migration-threshold="1" primitive ip01 ocf:heartbeat:IPaddr2 \ params \ ip="192.168.200.1" \ nic="bond0" \ cidr_netmask="24" \ op start interval="0s" timeout="60s" on-fail="restart" \ op monitor interval="10s" timeout="60s" on-fail="restart" \ op stop interval="0s" timeout="60s" on-fail="block" \ primitive ip02 ocf:heartbeat:IPaddr2 \ params \ ip="192.168.200.2" \ nic="bond0" \ cidr_netmask="24" \ op start interval="0s" timeout="60s" on-fail="restart" \ op monitor interval="10s" timeout="60s" on-fail="restart" \ op stop interval="0s" timeout="60s" on-fail="block" \ group ip ip01 ip02

慣れてくると、timeoutって全部60sなんだから、まとめて設定したいなあ、とか ip01もip02も、opのところって結局はコピペじゃん、とか って思いますよね。

実は、ある程度は設定をまるめちゃう(?)っていうのもできるんですな。

第一段階として、オペレーションのtimeoutとon-failを共通化してみましょう。 op_defaultsというパラメータを使用します。

# cat sample02.crm   property \ no-quorum-policy="ignore" \ stonith-enabled="false" \ startup-fencing="false" rsc_defaults \ resource-stickiness="INFINITY" \ migration-threshold="1" op_defaults \ timeout="60s" \ on-fail="restart" primitive ip01 ocf:heartbeat:IPaddr2 \ params \ ip="192.168.200.1" \ nic="bond0" \ cidr_netmask="24" \ op start \ op monitor interval="10s" \ op stop  on-fail="block" \ primitive ip02 ocf:heartbeat:IPaddr2 \ params \ ip="192.168.200.2" \ nic="bond0" \ cidr_netmask="24" \ op start \ op monitor interval="10s" \ op stop  on-fail="block" \ group ip ip01 ip02

opの行がちょっとすっきりしました。 ここで、注意していただきたいのは、intervalの値です。 start/stopにはinterval=”0s”を設定する必要があるのですが intervalのデフォルトは「0」なので、上記の例では start/stopにはintervalを設定しなくても、デフォルト値が使用されます。 op_defaultsでinterval=”10s”を設定すると、その値はstart/stopにも引き継がれるので この場合は、start/stopで明示的にinterval=”0s”を設定する必要があります。

sample02.crmのように、op_defaultsを使用すると、関連するリソースのtimeoutを 一斉に長く(もしくは短く)したいときとかに便利ですよね。

第二段階として、$id, $id-refを使ってみましょう。

# cat sample03.crm   property \ no-quorum-policy="ignore" \ stonith-enabled="false" \ startup-fencing="false" rsc_defaults \ resource-stickiness="INFINITY" \ migration-threshold="1" op_defaults \ timeout="60s" \ on-fail="restart" primitive ip01 ocf:heartbeat:IPaddr2 \ params \ ip="192.168.200.1" \ nic="bond0" \ cidr_netmask="24" \ operations $id="ip01-setting" \ op start \ op monitor interval="10s" \ op stop on-fail="block" \ primitive ip02 ocf:heartbeat:IPaddr2 \ params \ ip="192.168.200.2" \ nic="bond0" \ cidr_netmask="24" \ operations $id-ref="ip01-setting" group ip ip01 ip02

$idを使用すると、ip01のop設定(start/monitor/stop)を”ip01-setting”というIDで参照できるようになります。 この例では、ip02に$id-ref=”ip01-setting”を指定して、ip01のop設定を参照しています。 ip01,ip02のオペレーションが同じ場合は、だいぶ設定がすっきりしますね。

今回の設定では、groupに含まれる2つのリソース間で設定を参照していますが group関係にないリソース同士や、異なるRA間でも設定を参照することができます。

では、すっきりしたリソースを起動させてみます。

# crm configure load update sample03.crm   # crm_mon -1 ============ Last updated: Fri Sep  2 18:19:37 2011 Stack: Heartbeat Current DC: node02 (22222222-2222-2222-2222-222222222222) - partition with quorum Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 2 Nodes configured, unknown expected votes 1 Resources configured. ============ Online: [ node01 node02 ] Resource Group: ip ip01       (ocf::heartbeat:IPaddr2):       Started node01 ip02       (ocf::heartbeat:IPaddr2):       Started node01

crm_monコマンドに-nオプションをつけると、ノードごとにリソースの状態を確認できますよ。

# crm_mon -1 -n   ============ Last updated: Fri Sep  2 18:19:47 2011 Stack: Heartbeat Current DC: node02 (22222222-2222-2222-2222-222222222222) - partition with quorum Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87 2 Nodes configured, unknown expected votes 1 Resources configured. ============ Node node01 (11111111-1111-1111-1111-111111111111): online ip02    (ocf::heartbeat:IPaddr2) Started ip01    (ocf::heartbeat:IPaddr2) Started Node node02 (22222222-2222-2222-2222-222222222222): online

node01で仮想IPが起動していることを確認します。ちゃんと起動していますね。

# ip addr show bond0   8: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue link/ether 00:17:08:7e:11:e2 brd ff:ff:ff:ff:ff:ff inet 192.168.200.43/24 brd 192.168.200.255 scope global bond0 inet 192.168.200.1/24 brd 192.168.200.255 scope global secondary bond0 inet 192.168.200.2/24 brd 192.168.200.255 scope global secondary bond0

ちなみに、crm onfigure loadの反対は、crm configure saveです。 現在、クラスタが保持している設定情報をcrm形式でファイルに保存することができます。

# crm configure save /tmp/running.crm   # cat /tmp/running.crm node $id="11111111-1111-1111-1111-111111111111" node01 node $id="22222222-2222-2222-2222-222222222222" node02 primitive ip01 ocf:heartbeat:IPaddr2 \ params ip="192.168.200.1" nic="bond0" cidr_netmask="24" \ operations $id="ip01-setting" \ op start interval="0" \ op monitor interval="10s" \ op stop on-fail="block" interval="0" primitive ip02 ocf:heartbeat:IPaddr2 \ params ip="192.168.200.2" nic="bond0" cidr_netmask="24" \ operations  $id-ref="ip01-setting" group ip ip01 ip02 property $id="cib-bootstrap-options" \ dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \ cluster-infrastructure="Heartbeat" \ no-quorum-policy="ignore" \ stonith-enabled="false" \ startup-fencing="false" rsc_defaults $id="rsc-options" \ resource-stickiness="INFINITY" \ migration-threshold="1" op_defaults $id="op-options" \ timeout="60s" \ on-fail="restart"

XMLが大好きな方は、xmlオプションをつけると楽しいですよ。

# crm configure save xml /tmp/running.xml

さて、ipコマンドで仮想IPの起動は確認できたわけですが モニター処理ってちゃんと実行されてるのかな?というのを確認したい場合もあるかも?? そうそう、モニターの間隔を変更した後などには気になるかもしれません。 ha-debugを目grepしていると、モニターの実行が「開始された」タイミングっていうのはわかるんですが モニターがintervalに設定した値でちゃんと「実行されている」かどうかはわかりません。

# tail -f /var/log/ha-debug   ★ ip01が起動 Sep  2 18:19:03 node01 lrmd: [11014]: info: rsc:ip01:4: start Sep  2 18:19:03 node01 IPaddr2[11132]: INFO: ip -f inet addr add 192.168.200.1/24 brd 192.168.200.255 dev bond0 Sep  2 18:19:03 node01 IPaddr2[11132]: INFO: ip link set bond0 up Sep  2 18:19:03 node01 IPaddr2[11132]: INFO: /usr/lib64/heartbeat/send_arp -i 200 -r 5 -p /var/run/resource-agents/send_arp-192.168.200.1 bond0 192.168.200.1 auto not_used not_used Sep  2 18:19:03 node01 crmd: [11017]: info: process_lrm_event: LRM operation ip01_start_0 (call=4, rc=0, cib-update=16, confirmed=true) ok Sep  2 18:19:05 node01 crmd: [11017]: info: do_lrm_rsc_op: Performing key=10:3:0:579c6480-4f16-4bae-9373-a5d53631427d op=ip01_monitor_10000 ) ★ ip01のモニター処理が開始 Sep  2 18:19:05 node01 lrmd: [11014]: info: rsc:ip01:5: monitor Sep  2 18:19:05 node01 crmd: [11017]: info: do_lrm_rsc_op: Performing key=11:3:0:579c6480-4f16-4bae-9373-a5d53631427d op=ip02_start_0 ) ★ ip02が起動 Sep  2 18:19:05 node01 lrmd: [11014]: info: rsc:ip02:6: start Sep  2 18:19:05 node01 crmd: [11017]: info: process_lrm_event: LRM operation ip01_monitor_10000 (call=5, rc=0, cib-update=17, confirmed=false) ok Sep  2 18:19:05 node01 IPaddr2[11191]: INFO: ip -f inet addr add 192.168.200.2/24 brd 192.168.200.255 dev bond0 Sep  2 18:19:05 node01 IPaddr2[11191]: INFO: ip link set bond0 up Sep  2 18:19:05 node01 IPaddr2[11191]: INFO: /usr/lib64/heartbeat/send_arp -i 200 -r 5 -p /var/run/resource-agents/send_arp-192.168.200.2 bond0 192.168.200.2 auto not_used not_used Sep  2 18:19:05 node01 crmd: [11017]: info: process_lrm_event: LRM operation ip02_start_0 (call=6, rc=0, cib-update=18, confirmed=true) ok Sep  2 18:19:06 node01 crmd: [11017]: info: do_lrm_rsc_op: Performing key=12:3:0:579c6480-4f16-4bae-9373-a5d53631427d op=ip02_monitor_10000 ) ★ ip02のモニター処理が開始 Sep  2 18:19:06 node01 lrmd: [11014]: info: rsc:ip02:7: monitor Sep  2 18:19:06 node01 crmd: [11017]: info: process_lrm_event: LRM operation ip02_monitor_10000 (call=7, rc=0, cib-update=19, confirmed=false) ok Sep  2 18:19:07 node01 lrmd: [11014]: info: RA output: (ip01:start:stderr) ARPING 192.168.200.1 from 192.168.200.1 bond0 Sent 5 probes (5 broadcast(s)) Received 0 response(s) Sep  2 18:19:09 node01 lrmd: [11014]: info: RA output: (ip02:start:stderr) ARPING 192.168.200.2 from 192.168.200.2 bond0 Sent 5 probes (5 broadcast(s)) Received 0 response(s) この後、沈黙

ha-debugからもわかるかと思いますが、リソースの制御を実行しているのはlrmdというプロセスです。

Heartbeat関連のプロセスはごりっとこんな感じで起動するわけですが (DCノードではpengineプロセスも起動します) 「master control process」っていうプロセスが親分さんでそれにつらなって、 ccm,cib,lrmdなどが起動しています。

# pgrep -lf heartbeat   11004 heartbeat: master control process 11007 heartbeat: FIFO reader 11008 heartbeat: write: bcast eth1 11009 heartbeat: read: bcast eth1 11012 /usr/lib64/heartbeat/ccm 11013 /usr/lib64/heartbeat/cib 11014 /usr/lib64/heartbeat/lrmd -r 11015 /usr/lib64/heartbeat/stonithd 11016 /usr/lib64/heartbeat/attrd 11017 /usr/lib64/heartbeat/crmd 11018 /usr/lib64/heartbeat/ifcheckd # pstree 11004 heartbeat─ ┬─attrd ├─ccm ├─cib ├─crmd ├─3*[heartbeat] ├─ifcheckd ├─lrmd └─stonithd

今回は、lrmdのデバッグログの出力レベルをあげるためにプロセス名に対してSIGUSR1を投げます。 この操作は実際にリソースが起動しているノードで実行してください。 今回の例では、node01で実行しています。

# pkill -SIGUSR1 lrmd

ha-debugに「begin to dump internal data for debugging.」というログが出力されます。 (その以外にも、おえっていうくらいログがでます)

# tail -f /var/log/ha-debug   Sep  2 18:25:32 node01 lrmd: [11014]: debug: begin to dump internal data for debugging.

しばらく待っていると、お!ip01とip02のモニター処置がちゃんと10秒ごとに実行されてますね!

# tail -f /var/log/ha-debug   Sep  2 18:25:36 node01 lrmd: [11014]: debug: rsc:ip01:5: monitor Sep  2 18:25:38 node01 lrmd: [11014]: debug: rsc:ip02:7: monitor Sep  2 18:25:46 node01 lrmd: [11014]: debug: rsc:ip01:5: monitor Sep  2 18:25:48 node01 lrmd: [11014]: debug: rsc:ip02:7: monitor

デバッグログの出力レベルを元に戻す場合は、SIGUSR2を使います。

# pkill -SIGUSR2 lrmd

ha-debugに「end to dump internal data for debugging.」というログが出力されます。

# tail -f /var/log/ha-debug   Sep  2 18:26:37 node01 lrmd: [11014]: debug: end to dump internal data for debugging.

デバッグログのレベルはSIGUSR1を投げた回数分深くなりますが、その分、出力量も増えるので せいぜい2回くらいでいいんじゃないかと。

crmd,pengineなどもデバッグログを深くすることができます。 ログの多さ、わかりにくさでは定評のあるぺーちゃんですが、 障害解析時に「もうちょっとログがでるとわかるかもよ~」という気がするときはSIGUSR1してみてください。

では、今月はこれにてどろん!εεεεεヾ(*´ー`)ノ 気づいたら9月とかどういうことー。