본문으로 건너뛰기

이중화 (HA) 설정

엣지 두 대를 같은 PLC 에 붙여 한 대가 죽어도 수집이 끊기지 않게 하는 구성입니다. 화면은 좌측 메뉴의 HA PAIR (/ui/ha) 입니다.

엣지 HA 화면 — 상태 · 전환 이력 · 동작 · 피어 · 설정


무엇을 이중화하나 — 읽기는 둘, 쓰기는 하나​

어떻게
읽기(수집)두 엣지가 각자 독립적으로 같은 PLC 를 읽습니다. 서로를 거치지 않습니다
쓰기(제어)한 대만 합니다. 그것을 정하는 값이 edge.plc.write_authority 입니다
쓰기를 둘이 하면 설비가 두 번 움직입니다

읽기는 겹쳐도 손해가 없지만 쓰기는 다릅니다. 두 엣지가 동시에 쓰기 권한을 가지면 같은 명령이 PLC 에 두 번 갑니다(스플릿브레인). 이 구조 전체가 그것을 막기 위한 것입니다.

edge.plc.write_authority 의 기본값은 true 입니다 — 설정이 없으면 그 박스가 유일한 쓰기 주체라는 뜻이라, 엣지 한 대만 쓰는 현장이 아무것도 안 해도 그대로 동작합니다.


화면 읽는 법​

자리무엇
모드 배지MANUAL / AUTO — ha.failover.mode
권한 띠이 엣지가 지금 쓰기 담당인지. READ-ONLY 면 아닙니다
전환 이력언제 · 무엇이 바뀌었나 · 누가 했나
동작모드에 따라 다릅니다(아래)
피어반대 엣지의 상태. ha.peer.enabled=false 면 비어 있습니다
설정ha.failover.mode · ha.peer.enabled · ha.peer.host · 태그 · 지문

태그 지문 (Fingerprint)​

두 엣지가 같은 태그 정의를 갖고 있는지 한 값으로 비교합니다. 다르면 화면이 TAG DRIFT 로 알려 줍니다 — 한쪽에만 태그를 추가하고 반대편을 잊은 상태이고, 그대로 페일오버하면 넘어간 쪽이 일부 태그를 수집하지 않습니다.


모드 둘​

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 의 하트비트가 살아 있음승격하지 않습니다
둘이 동시에 WRITER 를 주장writer_id 가 낮은 쪽이 이기고 높은 쪽이 물러납니다
WRITER 가 하트비트 쓰기에 연속으로 실패max(3, ceil(timeout ÷ interval)) 번이면 스스로 STANDBY 로 내려옵니다 — 기본값이면 ceil(2000 ÷ 500) = 4번
부팅설정과 상관없이 항상 STANDBY 로 시작합니다. 하트비트를 쓰는 WRITER 가 없으면 takeover_timeout_ms 뒤에 승격합니다 — 혼자 남은 엣지도 스스로 WRITER 가 됩니다
죽었던 쪽이 되살아남권한을 자동으로 되찾지 않습니다(자동 페일백 없음)
  • 동작: Force writer · Force standby · Clear override — 위 자동 판정 위에 거는 수동 강제입니다. Clear override 로 풀면 자동 판정으로 돌아갑니다 (API 는 PUT /api/v1/ha/failover/override).
양쪽을 Force writer 로 강제하면 이중 쓰기입니다

수동 강제는 자동 판정을 건너뜁니다. 두 엣지를 모두 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. 두 엣지에 서로 다르게 둡니다 — 동시 주장 시 낮은 쪽이 이깁니다1
하트비트는 PLC 를 거칩니다

auto 모드는 두 엣지가 서로를 직접 확인하는 대신 PLC 의 한 주소에 쓰기 담당이 하트비트를 쓰는 방식으로 살아 있음을 판정합니다. 엣지 사이의 네트워크가 끊겨도 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. 두 엣지에 같은 태그 정의를 넣고 지문이 같은지 확인합니다.
  3. 한 대에만 edge.plc.write_authority=true 를 둡니다.
  4. ha.peer.enabled=true 와 ha.peer.host 로 서로를 보게 합니다. auto 로 쓰실 거면 두 엣지에 같은 heartbeat_opc · heartbeat_address 와 서로 다른 writer_id 를 둡니다.
  5. 플랫폼 쪽 이중화와 함께 쓰실 거면 → 플랫폼 이중화(HA)
물리적 안전은 PLC 가 책임집니다

이중화는 데이터의 가용성을 위한 것입니다. 설비의 안전 상태는 어떤 소프트웨어 실패에서도 PLC / 안전 PLC(SIS) 가 독립적으로 보장합니다. 엣지나 플랫폼이 안전을 보장하는 주체가 아닙니다.

함께 보기​

플랫폼 이중화(HA) · app.properties 레퍼런스 · 진단 및 점검