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 가 뜨기 때문.
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 추가
에러 로그 : 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 으로 바꿔주면 접근 가능하게 됨... 참고 아래 이미지는 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 |
위의 방법은 맞는 해결책이 아니었다. 그럼 뭐가 해결책인가 다음과 같이 webui 에 접근할 nifi container 내의 conf/nifi.properties 에 nifi.web.network.interface 를 추가해주면 된다. nifi.web.network.interface.default=eth0
|
해당 이슈에 대해 이해하려고 찾아본 참고 자료들
egloos.zum.com/rucaus/v/2358870
brunch.co.kr/@toughrogrammer/16
thenewstack.io/how-to-setup-influxdb-telegraf-and-grafana-on-docker-part-1/
'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 |