서론
Kafka 모니터링을 하기 위해 CMAK 환경을 세팅하는중에KeeperErrorCode = Unimplemented for /kafka-manager/mutex
에러가 발생했다.
이 에러를 해결한 과정을 적어본다.
개발 환경
docker-compose를 통해 zookeeper, kafka, cmak을 로컬 환경에서 실행시켰다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
version: "3" services: zookeeper: container_name: 'zookeeper' image: 'wurstmeister/zookeeper' ports: - '2181:2181' environment: - ZOOKEEPER_CLIENT_PORT=2181 - ALLOW_ANONYMOUS_LOGIN=yes healthcheck: test: if netstat -ltn | grep -c "2181"; then echo 0; else echo 1; fi interval: 10s timeout: 5s retries: 2 kafka: container_name: 'kafka' image: 'wurstmeister/kafka' ports: - '9092:9092' environment: KAFKA_ADVERTISED_HOST_NAME: kafka KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 depends_on: zookeeper: condition: service_healthy healthcheck: test: if netstat -ltn | grep -c "9092"; then echo 0; else echo 1; fi interval: 10s timeout: 5s retries: 2 kafka-manager-cmak: container_name: 'kafka-manager-cmak' image: 'hlebalbau/kafka-manager' restart: on-failure ports: - "9000:9000" environment: ZK_HOSTS: zookeeper:2181 APPLICATION_SECRET: "random-secret" KM_ARGS: -Djava.net.preferIPv4Stack=true depends_on: kafka: condition: service_healthy
CMAK 에러 “KeeperErrorCode = Unimplemented for /kafka-manager/mutex”
이 에러는 CMAK에서 add cluster시에 필요한 zookeeper의 znode
가 없어서 발생했다.
znode
는 Zookeeper에서 데이터를 저장하고 관리하기 위한 추상적인 노드이고,znode
를 생성해주면 이 에러는 해결된다.
이 에러를 찾아보면서 자세히 알아보았는데,
최신 CMAK은 Apache Curator 2.12.0을 사용하기 때문에
기본적으로 3.5.x 버전의 zookeeper를 지원하고
build에 수정 사항이 있는 3.4.x 버전만 지원한다고 한다.
내가 사용한 zookeeper의 버전은 3.4.13 버전이었고,
직접 수정 해줘야하는 부분이 있었던 것이다.
znode 생성하기
생성해줘야 하는 znode는/kafka-manager/mutex
/kafka-manager/mutex/locks
/kafka-manager/mutex/leases
총 3개이다.
/kafka-manager
는 cmak 컨테이너를 실행시키면 생성되기 때문에
zookeeper, kafka, cmak 컨테이너를 전부 실행시키고 진행한다.
zkCli.sh 실행
Zookeeper의 zkCli.sh
을 실행하여 Zookeeper 서버에 연결하고,
Zookeeper 클러스터의 구성요소를 관리할 수 있다.
도커 데스크탑을 사용하는 경우,
Zookeeper 컨테이너의 터미널 창에서 ./bin/zkCli.sh
명령어를 입력하여 접속하고,
직접 명령어로 컨테이너에 접근하고 싶다면,docker-compose exec -t zookeeper bash
명령어를 입력하여
‘zookeeper’ 컨테이너에서 bash shell 환경을 열 수 있다.
그리고 ./bin/zkCli.sh
명령어를 입력하여 Zookeeper 서버에 연결한다.
아래와 같은 로그가 출력된다. (…은 생략)
|
|
znode 생성
zkCli.sh
를 실행했다면 이제 세 가지의 znode를 생성한다.create /kafka-manager/mutex ""
create /kafka-manager/mutex/locks ""
create /kafka-manager/mutex/leases ""
잘 생성된 것을 확인할 수 있다. (Created
)
이제 Add Cluster가 성공적으로 이뤄진다!
스크립트 작성
매번 컨테이너를 시작할 때마다
수작업으로 znode를 생성하는 것은 비효율적이기 때문에
자동화할 수 있는 스크립트를 간단히 작성했다.
|
|
docker-compose exec
명령어를 sh 파일에서 실행하면
일반적으로 동작하지 않는다.
docker-compose exec
는 명령어를 특정 컨테이너에서 실행하기 위해 사용하는 커맨드이며,
이 명령어는 docker-compose.yml
파일에 정의된 컨테이너들만 접근할 수 있다.
따라서, docker-compose exec
명령어를 실행하려면
일반적으로 터미널에서 수동으로 입력해야 하고,
스크립트에서 자동으로 docker-compose exec
명령어를 실행하고 싶다면,
위와 같이 EOF
를 명시해줘야 한다.
위 스크립트에서 ‘quit’는 zkCli.sh
를 종료하는 명령어이고,
’exit’는 docker-compose exec
명령어로 실행한
zookeeper 컨테이너의 bash shell을 종료하는 명령어이다.
이제 스크립트를 실행하면 znode 세팅을 빠르게 끝낼 수 있다!