Heartbeatでクラスターを組む

プライマリノードの設定

Heartbeatを使ってクラスターを組んでみました。
クラスターと言っても単に仮想IPアドレスをフェールオーバーさせるだけの簡単なものです。
仮想IPアドレスをフェールオーバーすることで、プライマリサーバーがダウンしても、
セカンダリサーバーが同じIPアドレスを引き継ぐので、このサーバーに接続している他のマシンは、
何も影響を受けることが有りません。



使用したのは2台のOragepi Zeroで、OSはArmbianのDebian9(stretch)です。
Raspberry Piを使うとModelAでも2台で$60ぐらいかかりますが、Oragepi Zeroなら2台で$32で済むので、懐にやさしいです。

最初にプライマリノードを構築します。

ホスト名を設定する

ホスト名は以下の様にしました。
プライマリノード:orange-node1
セカンダリノード:orange-node2

以下のコマンドでプライマリノードのホスト名を設定します。
$ sudo hostnamectl set-hostname orange-node1


IPアドレスを固定にする

IPアドレスは以下の様にしました。
プライマリノード:192.168.10.51
セカンダリノード:192.168.10.52

こちらの手順でStaticな IPアドレスに変更します。


/etc/hsostを設定する

/etc/hostsにプライマリとセカンダリの両方のホスト名を登録します。
$ cat /etc/hosts
127.0.0.1   localhost orangepizero
::1         localhost orangepizero ip6-localhost ip6-loopback
fe00::0     ip6-localnet
ff00::0     ip6-mcastprefix
ff02::1     ip6-allnodes
ff02::2     ip6-allrouters
orange-node1 192.168.10.51
orange-node2 192.168.10.52


パッケージをインストールする

$ sudo aptitude install heartbeat cluster-glue
$ sudo aptitude install pacemaker

heartbeatはV1系とV2系が有り、設定の仕方が少し違います。
今回インストールしたバージョンはV1系です。
$ dpkg -l | grep heartbeat
ii  heartbeat                            1:3.0.6-5                         armhf        Subsystem for High-Availability Linux
ii  libheartbeat2                        1:3.0.6-5                         armhf        Subsystem for High-Availability Linux (libraries)

$ dpkg -l | grep pacemaker
ii  pacemaker                            1.1.24-0+deb9u1                   armhf        cluster resource manager
ii  pacemaker-common                     1.1.24-0+deb9u1                   all          cluster resource manager common files
ii  pacemaker-resource-agents            1.1.24-0+deb9u1                   all          cluster resource manager general resource agents

$ dpkg -l | grep cluster-glue
ii  cluster-glue                         1.0.12-5                          armhf        Reusable cluster components for Linux HA


設定ファイルを作成する

設定ファイルについては、以下のページを参考にさせていただきました。
https://thinkit.co.jp/cert/compare/17/9/4.htm
http://unixservermemo.web.fc2.com/sv/pacemaker-hacf.htm

以下の3つのファイルを作成します。

/etc/ha.d/ha.cf
[uuidfrom nodename]を指定しないと、/var/lib/heartbeat/hb_uuid をマシンのUUIDとして使います。
プライマリーマシンのイメージをコピーして、セカンダリーマシンに使用する場合に、uuidの重複エラーが延々と出るのを防ぎます。
$ cat /etc/ha.d/ha.cf
logfile /var/log/ha-log
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
bcast eth0
auto_failback on
node orange-node1 orange-node2
uuidfrom nodename

/etc/ha.d/haresources
今回のリソースは仮想IPアドレスだけです。
$ cat /etc/ha.d/haresources
orange-node1 192.168.10.50/24

/etc/ha.d/authkeys
このファイルだけはパーミッションを600に変更しておく必要が有ります。
$ sudo cat /etc/ha.d/authkeys
auth 1
1 crc

$ sudo chmod 600 /etc/ha.d/authkeys


サービス定義ファイルを一部変更する

heartbeatはサービスとして起動しますが、orangepiの場合、Ethernetの初期化に時間がかかるので、少し変更が必要でし た。
$ sudo vi /lib/systemd/system/heartbeat.service
[Unit]
Description=Heartbeat High Availability Cluster Communication and Membership
# partially copied and adapted from the pacemaker.service file

#After=basic.target → コメントアウト
#After=network.target → コメントアウト

#Requires=basic.target → コメントアウト
#Requires=network.target → コメントアウト

Wants=network-online.target → 追加
After=network-online.target → 追加

(後略)


サービスの起動

$ sudo systemctl disable heartbeat
Synchronizing state of heartbeat.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable heartbeat

$ sudo systemctl list-unit-files --type=service | grep heartbeat
heartbeat.service                          disabled

$ sudo systemctl enable heartbeat
Synchronizing state of heartbeat.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable heartbeat

$ sudo systemctl start heartbeat

$ sudo systemctl status heartbeat
● heartbeat.service - Heartbeat High Availability Cluster Communication and Membership
   Loaded: loaded (/lib/systemd/system/heartbeat.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-02-19 22:44:46 JST; 12min ago
 Main PID: 1168 (heartbeat)
    Tasks: 4 (limit: 4915)
   CGroup: /system.slice/heartbeat.service
           tq1168 heartbeat: master control process
           tq1181 heartbeat: FIFO reader
           tq1184 heartbeat: write: bcast eth0
           mq1185 heartbeat: read: bcast eth0

Feb 19 22:44:46 orange-node1 systemd[1]: Started Heartbeat High Availability Cluster Communication and Membership.
Feb 19 22:44:47 orange-node1 heartbeat[1168]: heartbeat: udpport setting must precede media statementsFeb 19 22:44:47 orange-node1 heartbeat: [1168]: WARN: Cor
Feb 19 22:44:47 orange-node1 heartbeat[1168]: Feb 19 22:44:47 orange-node1 heartbeat: [1168]: WARN: Consider setting non-default value in /proc/sys/kernel/core
Feb 19 22:44:47 orange-node1 heartbeat[1168]: Feb 19 22:44:47 orange-node1 heartbeat: [1168]: WARN: Consider setting /proc/sys/kernel/core_uses_pid (or equival
Feb 19 22:44:47 orange-node1 heartbeat[1168]: Feb 19 22:44:47 orange-node1 heartbeat: [1168]: info: Pacemaker support: false
Feb 19 22:44:47 orange-node1 heartbeat[1168]: Feb 19 22:44:47 orange-node1 heartbeat: [1168]: WARN: Logging daemon is disabled --enabling logging daemon is rec
Feb 19 22:44:47 orange-node1 heartbeat[1168]: Feb 19 22:44:47 orange-node1 heartbeat: [1168]: info: **************************
Feb 19 22:44:47 orange-node1 heartbeat[1168]: Feb 19 22:44:47 orange-node1 heartbeat: [1168]: info: Configuration validated. Starting heartbeat 3.0.6

起動が失敗するときは、ログファイル(/var/log/ha-log)を見れば原因が分かります。


仮想IPアドレスの確認

セカンダリノードと同期をとるために、60秒の待ち時間を設定しています。
セカンダリノードが60秒以内に起動しないときは、非クラスター環境で起動します。
60秒後に確認すると192.168.10.50の仮想IPアドレスが現れます。


他のマシンから192.168.10.50の仮想IPでログインできることを確認します。
正常にログイン出来たら、セカンダリノードを設定します。

続く....