前回記事からの続きです。
アーキテクチャ概要
まず、クラスタ構成については、以下の通りです。
- Pacemaker:リソース管理(仮想IPやサービスの制御)
- Corosync:クラスタ通信(ノード間の状態同期)
- Raspberry Pi 5[2台]:クラスタノード
- 仮想IP(VIP):サービス提供用IP
クラスタ全体構成の構成図
今回は、HUBを用いて、1号機と2号機を接続し、同じネットワークアドレスの設定をしていきます。
仮想IPリソースを作成し、1号機と2号機にインストールしたPacemakerでリソース監視を行い、
Corosyncでノード間の状態を同期し、クラスタ通信を行います。
実際の画像です(赤枠で囲っているものがケースで覆われていますが、Raspberry Piです)
実装手順
1. 環境準備
- Raspberry Pi OS
- ネットワーク設定(今回は固定IPにて設定)
- Pacemaker、Corosync、pcsインストール
Raspberry Piのセットアップを2台ともに設定を入れていきます。
環境の用意ができましたら、まずは、Raspberry Pi にPacemakerとCorosyncをインストールしていきます。
1. OSアップデート :まずRaspberry Pi のターミナルを開き、最新パッケージに更新します。
#sudo apt update
#sudo apt upgrade -y
2. 必要パッケージのインストール :PacemakerとCorosyncをインストールします。
#sudo apt install pacemaker corosync pcs -y
3. pcsdサービスの起動・自動起動設定
#sudo systemctl enable pcsd
#sudo systemctl start pcsd
4. 設定完了確認
#pcs –version
#pacemakerd –version
#corosync -v
2. Corosync設定
Corosyncの設定は、 /etc/corosync/corosync.conf にて行っていきます。
以下、今回設定した内容となります。
totem {
version: 2
cluster_name: クラスタ名
transport: knet
crypto_cipher: aes256
crypto_hash: sha256
cluster_uuid:00000000-0000-0000-0000-000000000000 (※実際にはユニークなUUIDが表示されます)
}
nodelist {
node {
ring0_addr: 192.168.179.1
name: ラズパイ1号機
nodeid: 1
}
node {
ring0_addr: 192.168.179.2
name:ラズパイ2号機
nodeid: 2
}
}
quorum {
provider: corosync_votequorum
two_node: 1
}
logging {
to_logfile: yes
logfile: /var/log/corosync/corosync.log
to_syslog: yes
timestamp: on
}
今回は2ノードのみのため、2ノードで動作できる設定を入れております。
loggingセクションは、Corosync動作時のエラーログやイベント履歴を、指定したファイルとシステムログ双方に、日時付きで詳細に残す設定が入っております。
3. クラスタ認証設定
クラスタを起動していきます。
#sudo systemctl start corosync
#sudo systemctl start pacemaker
1号機と2号機のノード認証を行い、クラスタ構成を作成します。
#pcs cluster auth ラズパイ1号機 ラズパイ2号機
#pcs cluster setup –name iot-cluster ラズパイ1号機 ラズパイ2号機
#pcs cluster start –all
4. リソース設定(仮想IPリソース)
続いて、仮想IPリソースの作成をしていきます。
ここで注意点があるのですが、仮想IPリソースを作成するのは1号機のみで実施します。
実は、1号機2号機ともに作成を最初しており、上手く動作しないなーということに陥っておりましたので、
皆様はお気を付けください。
■設定値
– 仮想IPにしたいIPアドレス : 192.168.179.100
– サブネット(netmask) : /24(255.255.255.0の場合)
– リソース名 : my-vip
■実行コマンド
#pcs resource create my-vip ocf:heartbeat:IPaddr2 ip=192.168.179.100 cidr_netmask=24 op monitor interval=30s
■作成後の状態確認
#pcs status
仮想IP(my-vip)が「Started on <ノード名>」のように表示されていれば成功です。
これで、ノード障害が発生したとしても、仮想IPが自動で生きているノードに引き継がれます。
これにてクラスタ設定は完了となります。
動作確認
1. スイッチオーバー(手動)
クラスタの動作確認をしていきたいと思います。
まずはスイッチオーバーと呼ばれる手動にて行うリソース移動を確認していきます。
コマンドを実行して、1号機⇒2号機へ仮想IPリソースが移動するか見ていきましょう。
事前確認でリソースがどちらのノードにあるか確認します。
■事前確認
#pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 16:53:16 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 16:53:17 2025
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ラズパイ1号機 ラズパイ2号機 ]
Full List of Resources:
*my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ1号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
仮想IPリソース(my-vip)の箇所に記載のあるノードが、現在、仮想IPリソースを所持しているノードになります。
そのため、現時点ではラズパイ1号機に仮想IPリソースがあること確認できました。
それでは、1号機から2号機へリソースを移動させたいと思います。
実施方法としては、以下コマンドを実行します。
■リソース移動コマンド実行
#pcs resource move my-vip ラズパイ2号機
■スイッチオーバー後の確認
#sudo pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 16:55:19 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 16:55:20 2025
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ラズパイ2号機 ラズパイ1号機]
Full List of Resources:
*my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ2号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
仮想IPリソース(my-vip)の箇所を確認すると、ラズパイ2号機の表記があり、1号機から2号機へ変更されていましたので、無事スイッチオーバーが出来たことを確認しました。
2. スイッチバック(手動)
続いて、2号機⇒1号機へコマンドを実行して、仮想IPリソースを戻せるか確認します。
■事前確認
# pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 17:07:59 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 17:08:00 2025
* Last change: Wed Oct 29 17:07:28 2025 by root via cibadmin on ラズパイ2号機
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ ラズパイ2号機 ラズパイ1号機 ]
Full List of Resources:
* my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ2号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
■リソース移動コマンド実行
#pcs resource move my-vip ラズパイ1号機
■スイッチバック後の確認
sudo pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 17:13:58 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 17:13:59 2025
* Last change: Wed Oct 29 17:13:44 2025 by root via cibadmin on ラズパイ1号機
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ ラズパイ1号機 ラズパイ2号機 ]
Full List of Resources:
* my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ1号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
3. フェイルオーバー(自動)
最後の動作確認として、フェイルオーバーと呼ばれる、リソースが自動で移動されるかを確認します。
1号機で疑似障害を起こし、2号機へ仮想IPリソースが自動で移動するか確認します。
疑似障害としては、1号機-HUB間のLANケーブルを抜線し、疎通ができない状態にします。
抜線後、2号機にて確認コマンドを実行し、仮想IPリソースが移動していましたら、フェイルオーバーされていると判断します。
■事前確認
#pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 17:23:32 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 17:23:33 2025
* Last change: Wed Oct 29 17:13:44 2025 by root via cibadmin on ラズパイ1号機
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ ラズパイ2号機 ラズパイ1号機 ]
Full List of Resources:
* my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ2号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
■1号機-HUB間のLANケーブルを抜線
■フェイルオーバーされたか、仮想IPリソースの確認
# pcs status
Cluster name:クラスタ名
Status of pacemakerd: ‘Pacemaker is running’ (last updated 2025-10-29 17:37:32 +09:00)
Cluster Summary:
* Stack: corosync
* Last updated: Wed Oct 29 17:37:33 2025
* Last change: Wed Oct 29 17:23:33 2025 by root via cibadmin on ラズパイ1号機
* 2 nodes configured
* 1 resource instance configured
Node List:
* Online: [ラズパイ2号機 ]
* Offline: [ラズパイ1号機 ]
Full List of Resources:
* my-vip (ocf:heartbeat:IPaddr2): Started ラズパイ2号機
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
my-vip の箇所に無事2号機のノード名があり、フェイルオーバーの確認ができました。
また、Node Listの1号機の表示がOflineとなっており、2号機のみOnline(稼働の確認が取れている状態)となりました。
最後に
Pacemaker + Corosyncを使えば、IoT環境でも高可用性を実現できることが確認できました。
LifeKeeper製品を取り扱う、LifeKeeperチームとして、今回IoT環境での冗長化や障害対応の仕組みを実際に検証していき、普段とは違う試みが出来たと感じました。
今後も色んな活用方法を実践していきたいと思います。




