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

何を冗長化するか — 読み取りは2つ、書き込みは1つ
| 方法 | |
|---|---|
| 読み取り(収集) | 2つのエッジがそれぞれ独立して同じPLCを読み取ります。互いを経由しません |
| 書き込み(制御) | 1台だけが行います。それを決定する値がedge.plc.write_authorityです |
読み取りは重なっても損はありませんが、書き込みは異なります。 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に強制すると、それを防ぐものは ありません — 強制はオペレーターの責任です。
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.mode | manual / auto | manual |
ha.peer.enabled | ピアモニターを有効にする | false |
ha.peer.host | 反対側のエッジのアドレス | — |
ha.failover.heartbeat_opc | ハートビートを書き込み・読み取る接続(OPC)id — auto で必須 | — |
ha.failover.heartbeat_address | PLCのハートビートアドレス — 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 |
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)» の節にあります。
現場に設置する際
- エッジ2台を異なるスイッチに接続します。同じスイッチに接続すると、そのスイッチが単一 障害点となり、冗長化の意味が失われます。
- 2つのエッジに同じタグ定義を入れ、フィンガープリントが一致するか確認します。
- 1台にのみ
edge.plc.write_authority=trueを設定します。 ha.peer.enabled=trueとha.peer.hostで互いを監視させます。autoで使う場合は、2つのエッジに同じheartbeat_opc·heartbeat_addressと互いに異なるwriter_idを設定します。- プラットフォーム側の冗長化と併用する場合は → プラットフォーム冗長化(HA)
冗長化はデータの可用性のためのものです。設備の安全状態は、いかなるソフトウェア 障害からも PLC / 安全PLC(SIS) が独立して保証します。エッジやプラットフォームが安全を 保証する主体ではありません。