メインコンテンツまでスキップ

冗長化 (HA) 設定

エッジ2台を同じPLCに接続し、1台が停止しても収集が途切れないようにする構成です。 画面は左側メニューの HA PAIR (/ui/ha) です。

エッジHA画面 — 状態 · 切り替え履歴 · 動作 · ピア · 設定


何を冗長化するか — 読み取りは2つ、書き込みは1つ​

方法
読み取り(収集)2つのエッジがそれぞれ独立して同じPLCを読み取ります。互いを経由しません
書き込み(制御)1台だけが行います。それを決定する値がedge.plc.write_authorityです
書き込みを2台で行うと設備が2回動きます

読み取りは重なっても損はありませんが、書き込みは異なります。 2つのエッジが同時に書き込み権限を持つと、 同じコマンドがPLCに2回送られます(スプリットブレイン)。この構造全体は、それを防ぐためのものです。

edge.plc.write_authority のデフォルト値は true です — 設定がない場合、そのボックスが唯一の 書き込み主体であることを意味し、エッジ1台だけを使用する現場では何もしなくてもそのまま動作します。


画面の見方​

箇所内容
モードバッジMANUAL / AUTO — ha.failover.mode
権限バーこのエッジが現在書き込み担当かどうか。READ-ONLY であれば違います
切り替え履歴いつ · 何が変わったか · 誰が行ったか
動作モードによって異なります(下記)
ピア反対側のエッジの状態。ha.peer.enabled=false の場合は空です
設定ha.failover.mode · ha.peer.enabled · ha.peer.host · タグ · フィンガープリント

タグフィンガープリント​

2つのエッジが同じタグ定義を持っているかを1つの値で比較します。異なる場合、画面が TAG DRIFT で知らせます — 片方にのみタグを追加し、反対側を忘れた状態であり、 そのままフェイルオーバーすると切り替わった側が一部のタグを収集しません。


モード2つ​

manual — オペレーターが切り替えます(デフォルト)​

  • 動作: Take authority(取得) · Release authority(解放)
  • ピアモニターは反対側のエッジを見守りますが、自らは切り替えません。
ピアモニターは設定を変更しません — 設計上の仕様です

ピアモニター(HaPeerMonitor)は反対側のエッジの GET /api/v1/ha/status を10秒ごとに ポーリングし(初回ポーリングは起動15秒後)、状態を表示して警告ログを残します。 いかなる場合でも設定は変更しません。

ネットワークが一時的に切断されたことを«ピアが死亡した»と誤判定して昇格すると、両方が同時に書き込む 状態になります。そのため manual では表示と警告までであり、昇格は人が行います。 自動昇格は、エッジ間のネットワークではなくPLCハートビートで判定する auto モードが行います(下記)。

auto — PLCハートビートで自動昇格します​

有効になる条件: ha.failover.mode=auto で、ha.failover.heartbeat_opc · ha.failover.heartbeat_address が両方とも設定されているときです。どちらか一方でも空なら、ログに 次の警告を残し、自動変更を行いません(manual と同じように動作)。

HA auto-failover degraded to manual — ha.failover.heartbeat_opc/address not set.

判定ルール

状況何をするか
書き込み担当(WRITER)heartbeat_interval_ms ごとにPLCのハートビートアドレスへ自分の writer_id を含む値を書き込みます
待機(STANDBY)が見たハートビート値が takeover_timeout_ms の間変わらない自らWRITERに昇格します
ハートビートの読み取り自体が失敗«停止» とはみなしません — 観測できないことは死亡ではないため、昇格しません
他のWRITERのハートビートが生きている昇格しません
2台が同時にWRITERを主張writer_id が低い方が勝ち、高い方が退きます
WRITERがハートビートの書き込みに連続して失敗max(3, ceil(timeout ÷ interval)) 回で自らSTANDBYに降ります — デフォルト値なら ceil(2000 ÷ 500) = 4回
起動設定に関係なく常にSTANDBYで開始します。ハートビートを書くWRITERがいなければ takeover_timeout_ms 後に昇格します — 1台だけ残ったエッジも自らWRITERになります
停止していた側が復帰権限を自動では取り戻しません(自動フェイルバックなし)
  • 動作: Force writer · Force standby · Clear override — 上記の自動判定の上にかける 手動強制です。Clear override で解除すると自動判定に戻ります (APIは PUT /api/v1/ha/failover/override)。
両方を Force writer で強制すると二重書き込みになります

手動強制は自動判定を飛ばします。2台のエッジを両方WRITERに強制すると、それを防ぐものは ありません — 強制はオペレーターの責任です。

2000msは設計値です — 引き継ぎ時間の実測値ではありません

takeover_timeout_ms のデフォルト値2000は «PLC直結のため読み取りはたいてい100ms以内 → 正常な 観測間隔は約600ms» という前提から出た値です。

  • ゲートウェイを経由するなど読み取りが遅い現場では takeover_timeout_ms を上げてください。
  • より速く検知する必要があれば timeoutではなく**heartbeat_interval_ms から減らします。** timeoutは2000より下げられません(低く書いても2000に引き上げられます)。
  • 短くしすぎると一時的な二重writerの窓が生じることがあります。次の観測で writer_id が低い方に収束します。

ピア判定状態​

状態意味すべきこと
OK正常 — 片方のみ書き込み権限—
DOWNピアに到達できないピアが本当に停止しているか確認し、停止していればこちらでTake authority
DUAL_AUTHORITY両方が書き込み権限すぐに片方でRelease authority
NO_AUTHORITY誰も書き込み権限がない片方でTake authority — その時まで制御は出力されません
+TAG_DRIFTタグ定義が互いに異なるタグを合わせ、フィンガープリントが一致するか確認

設定​

/etc/kopens/app.properties(= app.properties シムリンク)に配置して再起動します → app.propertiesリファレンス

キー意味デフォルト値
edge.plc.write_authorityこのエッジが書き込み担当かtrue
ha.failover.modemanual / automanual
ha.peer.enabledピアモニターを有効にするfalse
ha.peer.host反対側のエッジのアドレス—
ha.failover.heartbeat_opcハートビートを書き込み・読み取る接続(OPC)id — auto で必須—
ha.failover.heartbeat_addressPLCのハートビートアドレス — auto で必須—
ha.failover.heartbeat_address2任意のミラーレジスタ。空なら使用しません(空)
ha.failover.heartbeat_data_typeハートビートアドレスのデータ型DWord
ha.failover.heartbeat_interval_msハートビートの書き込み・観測周期(下限250)500
ha.failover.takeover_timeout_msハートビートがこの間変わらなければ昇格(下限2000 — それより低い値は2000に引き上げられます)2000
ha.failover.writer_idこのエッジのハートビートid。2台のエッジで別々に設定します — 同時主張時は低い方が勝ちます1
ハートビートはPLCを経由します

auto モードは2つのエッジが互いを直接確認する代わりに、PLCの1つのアドレスに書き込み担当がハートビートを 書き込む方式で生存を判定します。エッジ間のネットワークが切断されてもPLCは両方を認識できるため、 互いを見られない状況と本当に停止している状況を区別できます。


API​

プログラムから扱う場合に使用します。

パス内容
GET /api/v1/ha/status現在の状態 — ピアモニターがポーリングしているものと同じ
PUT /api/v1/ha/write-authority書き込み権限の取得 · 解放
PUT /api/v1/ha/failover/override強制指定 · 解除 — auto モードでのみ(それ以外は409 NOT_AUTO_MODE)
POST /api/v1/ha/definitionsタグ定義を相手に複製

リクエスト・レスポンスの形式は REST API の «冗長化(HA)» の節にあります。


現場に設置する際​

  1. エッジ2台を異なるスイッチに接続します。同じスイッチに接続すると、そのスイッチが単一 障害点となり、冗長化の意味が失われます。
  2. 2つのエッジに同じタグ定義を入れ、フィンガープリントが一致するか確認します。
  3. 1台にのみ edge.plc.write_authority=true を設定します。
  4. ha.peer.enabled=true と ha.peer.host で互いを監視させます。 auto で使う場合は、2つのエッジに同じ heartbeat_opc · heartbeat_address と互いに異なる writer_id を設定します。
  5. プラットフォーム側の冗長化と併用する場合は → プラットフォーム冗長化(HA)
物理的な安全はPLCが責任を持ちます

冗長化はデータの可用性のためのものです。設備の安全状態は、いかなるソフトウェア 障害からも PLC / 安全PLC(SIS) が独立して保証します。エッジやプラットフォームが安全を 保証する主体ではありません。

関連項目​

プラットフォーム冗長化(HA) · app.propertiesリファレンス · 診断および点検