CMAK cluster 생성시 주키퍼 오류(KeeperErrorCode) 해결하기

CMAK 사용시 필요한 zookeeper znode를 생성하는 로직을 자동화 해본다.

서론

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 서버에 연결한다.

아래와 같은 로그가 출력된다. (…은 생략)

1
2
3
4
5
6
7
8
9
# ./bin/zkCli.sh
Connecting to localhost:2181
...
Welcome to ZooKeeper!
...

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

znode 생성

zkCli.sh를 실행했다면 이제 세 가지의 znode를 생성한다.
create /kafka-manager/mutex ""
create /kafka-manager/mutex/locks ""
create /kafka-manager/mutex/leases ""

잘 생성된 것을 확인할 수 있다. (Created)

이제 Add Cluster가 성공적으로 이뤄진다!


스크립트 작성

매번 컨테이너를 시작할 때마다
수작업으로 znode를 생성하는 것은 비효율적이기 때문에
자동화할 수 있는 스크립트를 간단히 작성했다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#! /bin/sh

echo "# Add Zookeeper's ZNodes"
docker-compose exec -t zookeeper bash <<EOF
  ./bin/zkCli.sh
    create /kafka-manager/mutex ""
    create /kafka-manager/mutex/locks ""
    create /kafka-manager/mutex/leases ""
  quit
exit
EOF

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 세팅을 빠르게 끝낼 수 있다!


References

Choi SeungEun Tech Blog
Built with Hugo
Theme Stack designed by Jimmy