nifi.cluster.flow.election.max.candidates 는 클러스터가 시작할 때 어느 노드의 플로우(flow.json.gz) 를 정본으로 삼을지 투표하는 절차의 조기 종료 조건이다. Primary Node 나 Cluster Coordinator 를 뽑는 것과는 관계가 없다.
이 이름 때문에 리더 선출 후보 수로 오해하기 쉬운데, 그렇지 않다. 노드가 클러스터에 참여하는지 여부에도 영향을 주지 않는다. 값이 1 이어도 나머지 노드는 정상적으로 조인한다.
노드가 처음 클러스터에 붙을 때, 자기가 가진 플로우를 후보로 제출한다. Cluster Coordinator 는 제출된 플로우들을 모아 가장 많은 표를 받은 것을 정본으로 정하고, 다른 플로우를 가진 노드는 자기 것을 버리고 정본을 내려받는다.
선출이 끝나는 조건은 두 가지이고, 먼저 충족되는 쪽이 이긴다.
| 설정 | 뜻 |
|---|---|
nifi.cluster.flow.election.max.wait.time |
이 시간이 지나면 그때까지 모인 표로 결정한다. 기본 5분 |
nifi.cluster.flow.election.max.candidates |
이 수만큼 후보가 모이면 대기 시간을 채우지 않고 즉시 결정한다 |
즉 max.candidates 는 "빨리 끝내기" 를 위한 값이다. 비워 두면 항상 max.wait.time 을 다 기다린다.
| 값 | 동작 | 위험 |
|---|---|---|
| 1 | 가장 먼저 올라온 노드의 플로우가 그대로 정본이 된다 | 그 노드의 플로우가 낡았거나 손상돼 있으면 온전한 플로우를 가진 다른 노드가 그것을 덮어쓴다 |
| 3 (3노드 클러스터) | 세 노드가 모두 참여한 뒤 다수결로 정한다 | 한 노드가 늦게 뜨면 대기 시간만큼 기동이 늦어진다 |
운영 클러스터에서는 노드 수와 같게 두는 것이 안전하다. 기동 속도를 위해 1 로 두는 구성은 "어떤 노드가 먼저 뜰지" 라는 통제 불가능한 요소에 플로우 정본을 맡기는 셈이다.
conf/nifi.properties 에 둔다.
nifi.cluster.flow.election.max.wait.time=5 mins
nifi.cluster.flow.election.max.candidates=3
값을 바꾸려면 노드를 재시작해야 한다. 클러스터 구성 값이므로 모든 노드에 같은 값을 넣는다. 서로 다르면 노드마다 다른 시점에 선출을 끝내려 해 기동이 불안정해진다.
클러스터 기동 로그에 어느 플로우가 선택됐는지와 표 수가 남는다.
grep -i "flow election\|Election.*completed\|Voted" logs/nifi-app.log
노드의 플로우가 정본과 달라 거부되면 다음과 같은 메시지로 조인에 실패한다.
Failed to connect node to cluster because local flow is different than cluster flow
이 경우 해당 노드의 flow.json.gz 와 flow.xml.gz 를 치우고 다시 시작하면 정본을 내려받는다. 옮기기 전에 백업해 둔다.