いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.199 / 読者数:1799名

こんばんは、うすだです。

唐突ですが、Ubuntu の最新版 11.04 が、4/28 に公開されましたね。
日本語 Remix CD も、ほぼ直後の 5/1 に公開されています。
(Ubuntu Japanese Team 御中のご尽力には、超感謝感激です。…あ、もちろん、 本家の方々に対しても、です。)

Ubuntu 11.04 Desktop 日本語 Remix CD リリース
http://www.ubuntulinux.jp/News/ubuntu1104-desktop-ja-remix

最大の目玉は Unity っぽいですが、わたしは 10.10 の頃から使っているので、 特に違和感は感じていません。
むしろ、挙動がおかしかった点が直っていて、ありがたい感じです。

ただ、アップデートマネージャ経由で 10.10 からアップグレードしたのですが、 途中でまったく先に進まなくなってしまい、やむを得ず、 手動で dpkg を kill してしまいました。
とはいえ、直後の警告にビビりながらも、その後は滞りなく進んでいき、 最終的にはアップグレードできたよ的なことを言われましたので、 一応は問題なかったようです。
(etckeeper が関与していたような気もしますが、憶測に過ぎません。)

しかし、ホントにアップグレードできているのか、 心の奥底ではまだ疑いを拭いきれていません。ですので、 なにか問題が露見しましたら、アレがまずかったかなという推測とともに、 ご報告させていただきます。

というわけで、特にオチもないまま、今回もはりきってまいります。

今回のお題 - heartbeat でサービスを冗長にしてみる

…ああ、本業に抵触するネタなのですが、見習いな私はまだ職場で使っていませんので、 抵触していないと思い込んでご紹介したいと思います。

インターネットが使われ始めたころは、サーバにアクセスできない現象に遭遇しても、 サーバが落ちているか途中の経路が切れてるみたいだねー、 で済ませられました。

ですが、インターネットが日常生活に欠かせなくなったいま、 サービスが継続して提供されることは、ごく当たり前のようになってきています。
(Google や Yahoo のサービスが止まったら、ニュースになりますよね。)

とはいっても、ハードウェアが故障したり、OS がとち狂ったりすることは、 昔も今も、必ずと言っていいほど起こりうる問題です。

ですので、止められないサービスを提供する際は、サーバや電源、 ネットワークなど、あらゆるところを冗長化して、 どこかが故障などしても回避できる構成にする必要があります。

ただ、物理的に冗長化したらもう安心、というわけにはいきません。

たとえば、ホンモノのサーバがおかしくなったとき、 バックアップサーバに切り替えることで、サービスを引き続き提供できるとしましょう。

どうなったらホンモノのサーバがとち狂ったと判断するのか、 切り替えの手順はどうするのか、サービスの中身はどうやって同期するのか、 それらの作業を手動でやるのかなどなど…考えることは山ほどあります。

ですが、そんなような考えるべきことのうち、いくつかを解決してくれるソフトが、 実は存在します。それが「heartbeat」です。

今回は、この heartbeat のさわりをご紹介したいと思います。

で、heartbeat とは?

…なんで出だしでこんなに行が必要なのか、自分でも理解に苦しみます。

それはさておき、heartbeat とは、ホンモノのサーバがとち狂ったとき、 自動的にバックアップサーバへとサービスを引き継いでくれる、 オープンソースなソフトウェアです。

Heartbeat/ja - Linux-HA
http://www.linux-ha.org/wiki/Heartbeat/ja

Heartbeat は、提供するサービスを柔軟に示せますし、 ホンモノのサーバが復活したときホンモノに戻すこともしてくれる、優れものです。

Linux の主要なディストリビューションには、heartbeat のパッケージが存在します。 また、Linux 以外の OS などにも対応しています。

ちなみに、ホンモノのサーバを「稼働系サーバ」、 バックアップサーバを「待機系サーバ」とも呼ぶようです。
また、待機系サーバがサービスを引き継ぐことを「フェイルオーバー」、 その後、稼働系サーバにサービスを戻すことを「フェイルバック」と言うそうです。

前提条件と概要

出だしのわりに大雑把な説明が済んだところで、今回試す構成と、 概要の説明をさせていただきます。

まず、お試し環境は、以下の通りです。(等幅フォントでご覧ください)

                          外の世界
                              |
                     +--------+---------+
                     |ゲートウェイマシン|
                     +--------+---------+
                              | 192.168.1.254
                              |
                              | 192.168.1.0/24
  +-----------+---------------+---------------+-----------+
              |                               |
              |192.168.1.1(eth1:0)            |
              |192.168.1.186(eth1)            |192.168.1.187(eth0)
  +-----------+----------+        +-----------+----------+
  |稼働系サーバ(fedora14)|        |待機系サーバ(centos56)|
  +-----------+----------+        +-----------+----------+
              |192.168.2.14(eth2)             |192.168.2.6(eth1)
              |                               |
              +-------------------------------+
              監視用ネットワーク 192.168.2.0/24

サービスを提供するサーバのIPアドレスは、192.168.1.1 です。
通常は、192.168.1.1 の実体が稼働系サーバですが、 稼働系サーバがとち狂ったときは待機系サーバに切り替わります。

上記の図によると、必要なマシンは3台ですが、実質は以下の2台です。

[稼働系サーバ]
  ホスト名:         fedora14
                  (uname -n の出力結果)
  eth1のIPアドレス: 192.168.1.186, 192.168.1.1
                  (後者がサービスを提供する際に使用するIPアドレス)
  eth2のIPアドレス: 192.168.2.14

[待機系サーバ]
  ホスト名:         centos56
                  (uname -n の出力結果)
  eth0のIPアドレス: 192.168.1.187
  eth1のIPアドレス: 192.168.2.6

上記の図に「ゲートウェイマシン」とあるのは、 サービス提供側のネットワークの確認に利用するだけです。 ゲートウェイである必要はなく、常に動作しているマシンであれば何でもよいです。

肝心の heartbeat は、稼働系サーバと待機系サーバの双方で動かしますが、 双方とも以下の確認を行ってくれます。

  • サービス提供側のネットワークの動作確認
    他のマシン(上記の図の場合はゲートウェイマシン)と通信を行うことで、 ネットワークが正常かどうか判断します。
  • 相手(稼働系なら待機系、待機系なら稼働系)のサーバの動作確認
    監視用ネットワークを介して通信を行うことで、 相手が正常に動作しているかどうか監視します。

これらの確認で稼働系サーバに問題があれば、 待機系サーバへの切り替えを行ってくれます。
その他の細かい動作については、以降で実際に試す際にご説明します。

ちなみに、上記お試し環境は、VirtualBox で構築しました。
稼働系サーバも待機系サーバも、VirtualBox のゲストOSです。
いずれも、サービス提供側のネットワークは「ブリッジ」、 監視用ネットワークは「内部ネットワーク」に設定しました。
でもって、ゲートウェイマシンは、ホストOS そのものです。

heartbeat のパッケージを入れて設定していきます

環境が揃ったところで、heartbeat のパッケージをインストールし、 設定をしていきたいと思います。

パッケージは同名のものを入れるだけです。手順はいつもの通りです。

  # apt-get install heartbeat  (Debian 系の場合)
  # yum install heartbeat  (RedHat 系の場合)

 

必要な設定ファイルは、以下の3つです。

  • /etc/ha.d/ha.cf
    大元となる設定ファイルです。
    一部を除いて、双方でまったく同じ設定内容にします。
  • /etc/ha.d/haresources
    提供するサービスを示すための設定ファイルです。
    双方でまったく同じ設定内容にします。
  • /etc/ha.d/authkeys
    監視用ネットワークを介して相手と通信する際の方法と、 パスワードを設定するためのファイルです。
    双方でまったく同じ設定内容にします。

 

まずは、ha.cf からまいります。
以下のような最小限的な設定にしてみました。
(あ、以下は、稼働系サーバ用です。)

logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth2 192.168.2.6
auto_failback on
node fedora14 centos56
ping 192.168.1.254
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

順番にサラッと説明していきます。

  • logfacility ファシリティ名
    syslog の出力先を指定します。
    これの代わりに「logfile ファイル名」を指定すると、 syslog でなく直接ファイルにログを出力します。
  • keepalive 秒数
    相手を監視する間隔を秒で指定します。
  • deadtime 秒数
    相手がとち狂ったと判断するまでの時間を秒で指定します。
  • warntime 秒数
    相手がとち狂ったと警告するまでの時間を秒で指定します。
  • initdead 秒数
    起動してから監視するまでの時間を秒で指定します。
  • udpport ポート番号
    監視する際に使用するUDPのポート番号を指定します。
  • ucast ネットワークインターフェース名 相手のIPアドレス
    ユニキャストを使用して監視を行います。
    その際に使用するネットワークインターフェースと、相手のIPアドレスを指定します。
    他に、ブロードキャスト「bcast」やマルチキャスト「mcast」で監視を行う方法もあります。
  • auto_failback on|off
    フェイルバックを自動で行うかどうか指定します。
  • node ノード名...
    稼働系サーバと待機系サーバのホスト名を指定します。
    いずれも、uname -n の出力結果を用いる必要があります。
  • ping IPアドレス
    サービスを提供するネットワークインターフェースの動作確認で、 pingを送信する相手を指定します。
  • respawn ユーザ名 コマンド
    監視する際に使用するコマンドと、コマンドを実行するユーザを指定します。 前述で ping を指定した場合、コマンドは ipfail になります。
  • apiauth コマンド名 gid=グループ名 uid=ユーザ名
    heartbeat が respawn で指定したコマンドとやりとりする際に用いるユーザとグループを指定します。

ですので、待機系サーバの場合は、以下のようになります。

logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth1 192.168.2.14  ←ここが違う以外は(たいてい)同じ
auto_failback on
node fedora14 centos56
ping 192.168.1.254
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

 

お次は、haresources です。
以下のように設定しました。

fedora14 192.168.1.1/24

稼働系サーバのノード名(uname -n の出力結果)と、 サービスを提供するサーバのIPアドレス(とマスク)を指定しています。
IPアドレスの他にサービスなども指定できますが、 今回はその説明を割愛させていただきます。

 

そして最後に、authkeys です。
以下のように設定しました。

auth 1
1 sha1 秘密のパスワード

最初の「auth 番号」で、使用する設定を番号で指定します。
後は、「番号 方法 パスワード」の羅列です。
上記では sha1 を使用しています。他に、「md5」と「crc」があります。
crc を指定した場合は、パスワードを用いず、チェックサムの確認だけを行います。

authkeys にはパスワードなどが記されていますので、 root だけが読めるようにしておきます。
(でないと、heartbeat 起動時にエラーとなってしまいます。)

  # chmod 600 /etc/ha.d/authkeys

いよいよ動かします

準備が整いましたので、双方で動かしてみましょう。

  # service heartbeat start

/var/log/messages や /var/log/syslog に、WARN: や ERROR: の文字があると、 設定や環境に問題があると思います。メッセージの内容を見て、 問題を解決してください。(さらっと無責任なことを書いております)

現時点での稼働系サーバのIPアドレスを、以下の手順で眺めてみました。

  fedora14# ip addr show
  ...
  2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc \
  pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:34:56:a1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.14/24 brd 192.168.2.255 scope global eth2
    inet6 fe80::a00:27ff:fe34:56a1/64 scope link 
       valid_lft forever preferred_lft forever
  3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc \
  pfifo_fast state UP qlen 1000
    link/ether 08:00:27:a0:90:b6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.186/24 brd 192.168.1.255 scope global eth1
    inet 192.168.1.1/24 brd 192.168.1.255 scope global secondary \
  eth1:0
    inet6 fe80::a00:27ff:fea0:90b6/64 scope link 
       valid_lft forever preferred_lft forever

192.168.1.1 が eth1:0 に設定されていることがわかります。

ここで、ゲートウェイマシンから 192.168.1.1 を見ると、 稼働系サーバであることがわかります。

  $ /usr/sbin/arp -an
  ? (192.168.1.186) at 08:00:27:a0:90:b6 [ether] on eth0
  ? (192.168.1.187) at 08:00:27:74:35:de [ether] on eth0
  ? (192.168.1.1) at 08:00:27:a0:90:b6 [ether] on eth0

 

試しに、稼働系サーバの heartbeat を停止してみましょう。

  fedora14# service heartbeat stop

すると、待機系サーバにIPアドレスが設定されます。

  centos56# ip addr show
  ...
  2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc \
  pfifo_fast qlen 1000
    link/ether 08:00:27:74:35:de brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.187/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.1/24 brd 192.168.1.255 scope global secondary \
  eth0:1
  3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc \
  pfifo_fast qlen 1000
    link/ether 08:00:27:53:63:18 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.6/24 brd 192.168.2.255 scope global eth1

ゲートウェイマシンから見ても、切り替わっていることがわかります。

  $ /usr/sbin/arp -an
  ? (192.168.1.186) at 08:00:27:a0:90:b6 [ether] on eth0
  ? (192.168.1.187) at 08:00:27:74:35:de [ether] on eth0
  ? (192.168.1.1) at 08:00:27:74:35:de [ether] on eth0

 

問題なく切り替わったことを確認したら、稼働系サーバで再度 heartbeatを起動します。

  # service heartbeat start

すると、再び稼働系サーバに切り替わったことがわかります。
(ip addr show や arp -a などで各自ご確認ください。)

おわりに

以上、駆け足でしたが、heartbeat の概要とお試し起動の手順を、ご紹介しました。

Heartbeat はもっといろんな設定ができるようですが、 まずは最小な構成で動作させて、 どういったことをしてくれるのか理解することが大事なのではないかと思います。

というわけで、いろいろ試してみてください。

宿題の答え

前回の宿題は、

  とち狂ったときウォッチドッグタイマでリセットする WWWサービス監視
  プログラムを作ってみましょう。

でした。

以下のようなものを考えてみました。

  1. softdog で、180秒放置するとシステムがリセットするようにする。
  2. WWWサービスを監視するスクリプトを、cron で毎分起動する。
    スクリプトの内訳は、wget コマンドを起動して、 正常終了した場合は /dev/watchdog にアクセスするが、 異常終了した場合は /dev/watchdog にアクセスせずサービスを再起動する。

つまり、wget によるチェックを3回ミスると、softdog が強制リセットを行ってくれる、 ということになります。

さて、以降では、強制リセットなどの危険が伴いますので、 どうでもよい環境下でお試しください。

まず、肝心のスクリプトは、以下のようにしてみました。

#!/bin/sh
wget -O /dev/null --quiet --timeout=5 http://127.0.0.1/
if [ $? -eq 0 ]; then
    [ -c /dev/watchdog ] && echo > /dev/watchdog
else
    /sbin/service httpd restart
fi

wget コマンドが問題なく終了すると、「$?」の値が 0 になりますので、 /dev/watchdog にアクセスします。
そうでなければ、httpd サービスを再起動します。
(Ubuntu など Debian 系だと、httpd じゃなく apache2 です。)

このスクリプトを、 たとえば /usr/local/sbin/wwwcheck.sh という名前で保存した場合は、 crontab -e を実行して、以下のような1行を追加してください。

* * * * * /usr/local/sbin/wwwcheck.sh > /dev/null 2>&1

あ、もちろん、下記のように、実行可能にもしておきます。

  # chmod +x /usr/local/sbin/wwwcheck.sh

そして、softdog ドライバをロードします。

  # modprobe softdog

httpd が動作しているなら、 問題なく /dev/watchdog にアクセスされていると思います。
ここで試しに、httpd を止めてみましょう。

  # service apache2 stop  (Debian 系の場合)
  # service httpd stop    (RedHat 系の場合)

スクリプトは、問題があると httpd サービスを再起動しますので、 最長で1分後には、httpd が再起動されます。

softdog による強制リセットを試すには、もうひとひねり必要です。
下記のような C のプログラムを考えてみました。

/* 危険なので取扱いにはご注意ください */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    while(1) {
        if(fork()) {
            execl("/usr/bin/wget", "/usr/bin/wget",
                  "-O", "/dev/null", "--quiet", "http://127.0.0.1/");
        }
    }
}

forkシステムコールで子プロセスを作り、wget を起動する、ということを、 無限に行います。
これを実行しますと、スクリプトの起動すらままならなくなりますので、 だいたい3分後くらいには、有無を言わさずリセットされます。

というわけで、下記は心して行ってください。
(上記のプログラムは foo.c というファイル名だと仮定しています。)

  $ gcc foo.c
  $ ./a.out

実行して数秒後には、端末の制御すらできなくなると思います。
あとは、softdog が3分後にリセットしてくれることを確認するか、 自分でリセットボタンを押下して終わらせてください。

今回の宿題

今回の宿題は、

  監視用ネットワークを使わない構成で heartbeat を動かしましょう。

です。

本来なら、監視専用のネットワークを用意して、 確実に監視できるようにするべきです。
ただ、ちょいと heartbeat を試してみたいときに、 別途ネットワークを用意しづらいというケースもあるのではないかと推測します。

というわけで、 ネットワークインターフェースが1個だけでも heartbeat が試せるかどうか、 設定して動かしてみてくださいませ。

あとがき

中学高校と、8ビットなパソコン全盛期のころは、 雑誌に掲載されているBASICのプログラムを打ち込んでは動かすということを、 修行のように延々と行っていました。

そんな地味な青春を過ごした人たちをターゲットにした、としか思えないゲームが、 ニンテンドーDSiなどにあります。

プチコン
http://smileboom.com/special/petitcom/

ふとしたことでその存在を知り、可及的速やかに、 子どものDSiを借りてダウンロードしてみました。

サンプルや説明書を見る限りでは、 往年の8ビットBASICマシンそのものの顔をしておられます。当時をご存じな方は、 見ているだけでウズウズしてくると思います。
(ちなみに、説明書のPDFは、上記から無料でダウンロードできます。)

まだわたしはプログラムを作るまでに至っていませんが、子どもが興味を示し、 公開されているプログラムを打ち込んだりしているようです。

ただ、ヤツは今年中3です。生粋の受験生であることを忘れていました。

親としては、ようやくプログラミングに興味を示してくれるかもしれないという期待と、 受験の妨げとなる原因を提供してしまったのではないかという不安が、 頭の中でぐるぐると渦を巻いております。

というわけで、受験生であることを自覚し、受験勉強と両立させることを…もとい、 受験勉強を優先してくれることを、切に願っている次第です。

 

さて、私事で恐縮ですが、「Software Design」6月号に、 IPv6 の記事を書かせていただきました。
以前ご紹介した下記をたたき台として、 細部を調べて盛り込んだ的な内容となっております。

Vol.193 - IPv6 をいまさら始めてみる
http://www.usupi.org/sysad/193.html
Vol.194 - IPv6 でアドレスを自動的に設定する
http://www.usupi.org/sysad/194.html
Vol.195 - IPv6 でいろいろ通信してみる
http://www.usupi.org/sysad/195.html

さらに、編集の方々の粋な計らいで、 非常にクリクリしたデザインにしていただきました。 感謝感激という言葉では表せないくらい感激です。

5/18 発売ですので、よろしければ立ち読んで、さらにあわよくば購入をしていただき、 アンケートによかったと書いていただけますと幸いです。
(…い、いえ、アンケートには、正直に書いてくださいませ…。)

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、5月22日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- というわけで、いろいろ接点があってありがたいです。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本