NiFi 에서 로드밸런스라는 말은 성격이 다른 두 가지를 가리킨다. 섞어 놓으면 설정이 어긋난다.
하나는 연결(Connection) 로드밸런싱 이다. 큐에 쌓인 FlowFile 을 노드끼리 주고받아 고르게 나누는 기능으로, 노드 사이의 통신이다. nifi.cluster.load.balance.* 속성이 여기에 해당한다.
다른 하나는 UI · REST API 앞단의 로드밸런서 다. 사용자가 nifi.example.com 하나로 들어오면 앞단 장비가 세 노드 중 하나로 넘기는 구성이며, NiFi 입장에서는 그냥 프록시다.
이 값은 다른 노드가 이 노드에 접속할 때 쓰는 주소 다. 따라서 각 노드마다 자기 자신의 호스트 이름을 넣는다. 앞단 로드밸런서의 VIP 를 넣으면 노드가 서로가 아니라 로드밸런서로 데이터를 보내게 되어 큐가 엉키거나 타임아웃이 난다.
nifi.cluster.is.node=true
nifi.cluster.node.address=nifi01.example.com
nifi.cluster.node.protocol.port=11443
nifi.cluster.load.balance.host=nifi01.example.com
nifi.cluster.load.balance.port=6342
nifi.cluster.load.balance.connections.per.node=1
nifi.cluster.load.balance.max.thread.count=8
nifi.cluster.load.balance.comms.timeout=30 sec
nifi.cluster.load.balance.host 를 비워 두면 nifi.cluster.node.address 값을 쓴다. 노드 주소가 이미 올바르다면 비워 두는 편이 실수가 적다.
앞단 로드밸런서 도메인은 nifi.web.proxy.host 에 적는다. 여기에 없는 호스트 헤더로 들어오면 NiFi 가 요청을 거부한다.
nifi.web.proxy.host=nifi.example.com:443,nifi.example.com
앞단 로드밸런서에는 세션 고정(sticky session) 을 건다. NiFi UI 는 요청마다 다른 노드로 흩어져도 동작하도록 만들어져 있지만, 인증을 쓰는 구성에서는 토큰 처리와 업로드가 한 노드로 모여야 안정적이다.
FlowFile 은 기본적으로 자신이 만들어진 노드에 머문다. ListFile · ConsumeKafka 처럼 Primary node only 로 도는 프로세서나 파티션이 한쪽으로 쏠린 소스가 있으면 한 노드에만 큐가 쌓인다.
연결 단위로 분배 전략을 지정해 해결한다. 연결을 선택하고 Configure → Settings 의 Load Balance Strategy 를 바꾼다.
| 전략 | 동작 |
|---|---|
| Do not load balance | 기본값. 만든 노드에 그대로 둔다 |
| Round robin | 노드에 번갈아 나눈다. 가장 흔한 선택 |
| Partition by attribute | 지정한 속성 값의 해시로 노드를 정한다. 같은 키는 항상 같은 노드로 간다 |
| Single node | 모두 한 노드로 모은다. 순서나 단일 실행이 필요할 때 |
압축 여부는 같은 화면의 Load Balance Compression 에서 정한다. 노드 간 회선이 느리면 내용까지 압축하고, 같은 랙 안이면 압축하지 않는 편이 빠르다.
Round robin 을 걸었는데도 한쪽에 남는다면 back pressure 를 확인한다. 받는 노드가 back pressure 에 걸려 있으면 재분배가 멈춘다.
큐 관련 로그에 나오는 임계 도달 메시지는 연결의 Back Pressure Data Size Threshold(기본 1 GB)에 걸렸다는 뜻이다. 건수 임계값은 Object Threshold(기본 10000)다. 임계에 걸리면 상류 프로세서가 스케줄되지 않으므로, 처리 속도를 올리거나 임계값을 올려야 한다. 정확한 로그 문구는 버전마다 다르다 (확인 필요).
logback.xml 안의 ${org.apache.nifi.bootstrap.config.log.dir} 는 부트스트랩이 넘겨 주는 시스템 속성이다. 값을 바꾸려면 bootstrap.conf 에서 지정한다.
org.apache.nifi.bootstrap.config.log.dir=/var/log/nifi
또는 logback.xml 의 해당 참조를 실제 경로로 바꿔 적어도 된다. 어느 쪽이든 디렉터리 소유자가 NiFi 실행 계정이어야 한다.