Nifi 를 Docker Cluster 로 구축하는 방법을 연구함.

 

아래 방법 외에 좋은 방법이 있다면 부족한 저에게 제시해주시길 부탁드립니다.

 

 

 

내가 사용한 분산 환경은 다음과 같음.

네트워크로 연결되어 있는 서로 다른 세 서버 위에

Zookeepr 와 Nifi Container 를 하나씩 올려두고 

Cluster 를 만드는 것.

 

 

 

1. 

Docker Swarm 기능을 사용하여 각 서버간 docker 네트워크를 구성한다. 

 

server 1 에서)

sudo docker swarm init --advertise-addr [host IP(server 1 의 ip 주소)]
예 ) sudo docker swarm init --advertise-addr 10.35.103.194

 

위의 명령어를 실행하면 해당 docker swarm 에 join 할 수 있는 join 명령어가 반환됨.
아래와 같은 명령어들이 반환되고 server 2, 3 에서 해당 명령어를 실행하여 swarm 에 join

아래 명령어는 내가 만든 토큰값이 적용되었기 때문에, 이걸 보는 개발자들은

이걸 복붙하지 말고 각자 리턴된 명령어를 사용하길 바람.

 

server 2 에서)
sudo docker swarm join --token SWMTKN-1-4jeu4zabv082iqr93jwbqp7evkc2j8nxn4kcgto3lc5qtjnv4a-9qftkjhthjpphdy3ihnf53wvf

 

server 3 에서)
sudo docker swarm join --token SWMTKN-1-4jeu4zabv082iqr93jwbqp7evkc2j8nxn4kcgto3lc5qtjnv4a-9qftkjhthjpphdy3ihnf53wvf

 

2.

server 1 에서)

아래 명령어를 통해 overlay network 를 생성한다.


sudo docker network create -d=overlay --attachable --subnet 11.0.0.0/24 nifi-net

 

subnet 옵션을 줌
각 Docker Container 에 구체적인 ip를 주어 명확히 구분하기 위함

 

 

 

3.

아래 명령어로 Zookeeper Container 를 3대 만들고 ensemble 을 구축한다.

 

server 1 에서)
sudo docker run -itd --name zkp1 --network nifi-net --ip 11.0.0.2 -e ZOO_MY_ID=1 -e ZOO_SERVERS='server.1=0.0.0.0:2888:3888;2181 server.2=zkp2:2888:3888;2181 server.3=zkp3:2888:3888;2181' zookeeper bash


server 2 에서)
sudo docker run -itd --name zkp2 --network nifi-net --ip 11.0.0.4 -e ZOO_MY_ID=2 -e ZOO_SERVERS='server.1=zkp1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zkp3:2888:3888;2181' zookeeper bash


server 3 에서)
sudo docker run -itd --name zkp3 --network nifi-net --ip 11.0.0.5 -e ZOO_MY_ID=3 -e ZOO_SERVERS='server.1=zkp1:2888:3888;2181 server.2=zkp2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181' zookeeper bash

 

 

4.

각 Zookeeper Container 내에서 다음 명령어 실행


apt-get update ; apt-get install -y procps


bin/zkServer.sh start

 


procps 를 왜 설치할까?

이유는, Container 에 ps 명령어가 없어서 FAILED TO START 가 뜨기 때문이다.

zkServer.sh 를 뜯어보면 ps 의 반환값을 기반으로 STARTED 와 FAILED TO START 가 나뉘는데

ps 명령어 자체가 없어서 무조건 FAILED TO START 가 뜨기 때문.

 

bin/zkServer.sh

 

 

 

5.

Zookeeper 의 구동을 확인한다.

 

bin/zkServer.sh status 명령어를 통해
각 서버의 zookeeper 가 follower, leader 인 것을 확인

 

또한, 로그 ( /logs/zookeeper--server-[hostname].out ) 를 통해
‘성공적으로 leader 에 연결’ 등의 로그를 확인

 

 

 

 

6.

다음 명령어를 통해 Nifi Container 3 대를 각 서버에 만들어 Cluster 를 구축한다.

 

server 1 에서)
sudo docker run -itd --name nifi1 --network nifi-net -p 8080:8080 --ip 11.0.0.12 -e NIFI_CLUSTER_IS_NODE=true  -e NIFI_ELECTION_MAX_WAIT='1 min' -e NIFI_ZK_CONNECT_STRING='zkp1:2181,zkp2:2181,zkp3:2181' -e NIFI_CLUSTER_NODE_PROTOCOL_PORT=9999 apache/nifi:latest bash

 

server 2 에서)
sudo docker run -itd --name nifi2 --network nifi-net --ip 11.0.0.13 -e NIFI_CLUSTER_IS_NODE=true -e NIFI_ELECTION_MAX_WAIT='1 min' -e NIFI_ZK_CONNECT_STRING='zkp1:2181,zkp2:2181,zkp3:2181' -e NIFI_CLUSTER_NODE_PROTOCOL_PORT=9999 apache/nifi:latest bash

 

server 3 에서)
sudo docker run -itd --name nifi3 --network nifi-net --ip 11.0.0.14 -e NIFI_CLUSTER_IS_NODE=true  -e NIFI_ELECTION_MAX_WAIT='1 min' -e NIFI_ZK_CONNECT_STRING='zkp1:2181,zkp2:2181,zkp3:2181' -e NIFI_CLUSTER_NODE_PROTOCOL_PORT=9999 apache/nifi:latest bash

 

 

 

 

7.

webui 접근하기 위한 nifi1 container 내의 conf/nifi.properties 에

다음과 같이 nifi.web.http.network.interface 를 추가한다.

 

# web properties #

...

nifi.web.network.interface.default=eth0

nifi.web.network.interface.eth1=eth1

...

 

추가 후 재부팅을 해준다.

 

sudo docker restart nifi1

 

 

 

 

8.

Nifi 가 잘 구동되고 있는지 확인한다.

 

/bin/nifi.sh status 를 통해 ‘nifi is currently running’ 이라는 결과를 확인한다.

 

또한, wget 이나 curl 등의 명령어로 localhost:8080 에 접근하여

받은 index.html 의 내용을 확인해본다.

 

wget localhost:8080

curl localhost:8080 -v

 

 

 

 

 

추가 자료

dzone.com/articles/setting-apache-nifi-on-docker-containers

www.nifi.rocks/apache-nifi-docker-compose-cluster/

 

 

 

 

 

 

 

 

이슈 해결 기록

 

cannot convert null to int 에러 발생 해결 : NIFI_CLUSTER_NODE_PROTOCOL_PORT 추가

https://stackoverflow.com/questions/46190071/nifi-cluster-on-docker-is-not-starting-up-working-only-on-one-node

 

에러 로그 : Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flowService': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flowController' defined in class path resource [nifi-context.xml]: Cannot resolve reference to bean 'clusterCoordinator' while setting bean property 'clusterCoordinator'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clusterCoordinator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clusterCoordinationProtocolSenderListener' defined in class path resource [nifi-cluster-protocol-context.xml]: Cannot resolve reference to bean 'protocolListener' while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'protocolListener' defined in class path resource [nifi-cluster-protocol-context.xml]: Unsatisfied dependency expressed through constructor parameter 1: Could not convert argument value of type [null] to required type [int]: Failed to convert value of type 'null' to required type 'int'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type 'null' to required type 'int': PropertyEditor [org.springframework.beans.propertyeditors.CustomNumberEditor] returned inappropriate value of type 'null'

 

 

 

Zookeeper Container 내부에 ps 가 없기 때문에 FAILED TO START 로 빠지면서
exit 1 이 됨. 따라서 start 하기 전에 ps 를 설치해 줌

설치 명령어
apt-get update ; apt-get install -y procps

 

docker swarm network (overlay network) 위에서 nifi(-p 8080:8080) + zookeeper docker cluster 를 구축하면 localhost:8080 으로 접속이 되지 않는 이슈

wget 이나 curl 로 접근하면
connection reset by peer 에러가 뜨는데
이는 nifi http 접근을 docker container 내부 ip 에서만
가능하게 설정했기 때문(port 랑 상관 없음)
모든 ip 에서 접근 가능하도록 옵션을
-e NIFI_WEB_HTTP_HOST=0.0.0.0
으로 바꿔주면 접근 가능하게 됨... 

참고
https://stackoverflow.com/a/49117160
https://enghqii.tistory.com/56
http://apache-nifi-users-list.2361937.n4.nabble.com/Nifi-1-1-0-cluster-on-Docker-Swarm-td1229.html


아래 이미지는 connection reset by peer 가 발생했을 때의 로그

 


근데 이렇게 해서 신나게 Processor 를 추가하려고 했더니
이번에는 다른 에러가 뜨네??
바로 Transaction is already in progress 에러.

409 conflict 가 났다는 에러와 함께 해당 Transaction 이 벌써 실행중이라고 뜬다.
Received a status of 409 from 0.0.0.0:8080
Transaction is already in progress

standalone 일 때는 webui 에 접근도 잘 되고 Processor 들도 잘 생성되는데,
cluster 일 때는 Processor 를 해당 에러 때문에 만들지 못한다.

해결 방법은 아래에 다시 적음.

나랑 같은 상황에 놓인 한 사람의 질문 : http://apache-nifi-users-list.2361937.n4.nabble.com/nifi-cluster-in-kubernetes-td7684.html

nifi-app.log 에 뜬 에러 로그
nifi-user.log 에 뜬 에러 로그
실제로 webUI 에서 Processor 를 만들려고 하면 해당 에러가 뜬다.

 

위의 방법은 맞는 해결책이 아니었다.
그럼 뭐가 해결책인가

다음과 같이 webui 에 접근할 nifi container 내의 conf/nifi.properties 에
nifi.web.network.interface 를 추가해주면 된다.

nifi.web.network.interface.default=eth0
nifi.web.network.interface.eth1=eth1

여기서 nifi.web.network.interface 가 무엇이냐? 공식 문서에서는 아래와 같이 설명하고 있다.
The name of the network interface to which NiFi should bind for HTTP requests.
즉 HTTP 요청(우리가 webui 를 통해 요청하는 것들) 을 위해 Nifi 가 바인드해야하는 네트워크 인터페이스의 이름.
....뭔 소리임?

docker swarm network 는 특별한 네트워크 환경을 갖고 있기 때문에 위와 같이 귀찮은 추가 작업을 해줘야 한다.
분명한 원인은 아직 내가 미숙하여 모르겠다.
Docker Network 에 대한 아래 설명 읽었는데도 모르겠음(...)

bluese05.tistory.com/15

blog.neonkid.xyz/87


네트워크 공부 좀 더 하고나서 원인을 파악하면 추후 업데이트 하겠음.


the sites which saved my day :
https://mail-archives.apache.org/mod_mbox/nifi-dev/202006.mbox/%3CCAHThYcVJWmeoaTZFDL_oBMyr8BvF6PToQjJwRv94Jvsa0E8N9A%40mail.gmail.com%3E
https://stackoverflow.com/questions/62391633/exposing-nifi-ui-when-running-a-cluster-in-docker-swarm

기타 참고 자료들
http://apache-nifi-users-list.2361937.n4.nabble.com/NiFi-1-4-Clustering-Error-Cannot-Replicate-Request-GET-nifi-api-flow-current-user-td3964.html
https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html

 

 

 

 

 

해당 이슈에 대해 이해하려고 찾아본 참고 자료들

 

bluese05.tistory.com/15

blog.neonkid.xyz/87

 

egloos.zum.com/rucaus/v/2358870

brunch.co.kr/@toughrogrammer/16

recipes4dev.tistory.com/153

thenewstack.io/how-to-setup-influxdb-telegraf-and-grafana-on-docker-part-1/

m.blog.naver.com/PostView.nhn?blogId=ifkiller&logNo=70081005002&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

 

 

 

'NiFi' 카테고리의 다른 글

[Nifi] Clustering 용어 설명  (0) 2020.09.17
[Nifi] Clustering 의 필요성  (0) 2020.09.16
[Nifi] sample templates 링크  (0) 2020.09.07
[Nifi] 유용한 정보들  (9) 2020.09.01
[Nifi] external zookeeper 로 Nifi Cluster 설치하는 방법  (0) 2020.08.31

+ Recent posts