IoTでも安心!Raspberry Piで実現するサービス継続の仕組み

前回記事からの続きです。

 


アーキテクチャ概要

まず、クラスタ構成については、以下の通りです。

  • 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

対象のバージョンが表示されるとOKとなります。
続いてクラスタ設定をしていきます。
 

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
}

quorumセクションはクラスタノードのどちらをアクティブとするかを判定する設定がされています。
今回は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環境での冗長化や障害対応の仕組みを実際に検証していき、普段とは違う試みが出来たと感じました。
今後も色んな活用方法を実践していきたいと思います。

著者について

SCSK株式会社
基盤ソリューション事業本部
テクノロジーサービス部 第一課

痛風になりそうな食べ物が好きです。

Kento Oyaをフォローする

クラウドに強いによるエンジニアブログです。

SCSKでは、自社クラウドと3大メガクラウドの強みを活かし、ハイブリッドクラウド/マルチクラウドのソリューションを展開しています。業界の深い理解をもとに、お客様の業務要件に最適なアーキテクチャをご提案いたします。サービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。

IoTソリューション
シェアする
タイトルとURLをコピーしました