ZooKeeper 살펴보기 ( feat. Kafka 조금... )

2021. 5. 2. 17:40개발/Kafka

설정파일 작성


ZooKeeper를 설치하고 zoo.cfg 설정파일을 작성한다. zoo.cfg 파일은 conf폴더 하위에 작성한다. 

 

 

총 3대의 서버를 사용한다. 각 서버의 hostname은 zk-server1, zk-server2, zk-server3으로 했다. 

( 모든 서버에 zoo.cfg 파일을 작성한다. )

 

zoo.cfg 작성

설정들의 의미를 살펴본다. 

tickTime

client와 연결을 확인하기 위해 주기적으로 client에 연결확인 요청을 보내는데 그 주기를 tickTime이라고 한다. 단위는 밀리세컨드이다. 위에선 2000ms(2초)로 셋팅했다. 셋팅된 시간의 2배를 초과할 경우 세션 timeout이 발생한다. 

 

dataDir

메모리 저장된 정보의 스냅샷 또는  트랜잭션 로그 등을 기록하기 위한 경로.

 

clientPort

client와 연결 하기 위한 포트번호. 

 

server.x 

주키퍼 서버의 앙상블을 이루기 위한 정보를 기록한다. 위 예시에서 입력된 정보를 통해 살펴보자. zk-server1, zk-server2, zk-server3은 각 서버의 hostname을 의미한다. 2888은 follwer가 leader에게 연결을 요청하기 위해 사용하는 포트다. 3888은 leader를 선출하기 위해 사용하는 서버다. 각 포트가 TCP로 연결되기 때문에 겹치는 포트를 사용하지 않는것이 포인트다.


myid 작성


서버의 유일성을 위한 myid 파일을 생성한다. zoo.cfg에서 작성한 dataDir 경로 하위에 myid라는 파일을 생성한다. 다른 서버와 겹치지 않으며 1~255사이의 숫자를 하나 선택해서 작성한다.

myid를 작성할 위치 확인
2번 ZooKeeper 서버의 myid


실행하기


Zookeeper 서버를 foregroud로 실행하기 위해서 ./zkServer.sh start-foreground 명령어를 사용한다. 

최초 실행시 모습

ZooKeeper 앙상블에선 서버중 과반수 이상이 정상적으로 작동하면 정상수행으로 간주한다. 최초 실행시에 에러가 뜨지만 2개 서버가 성공적으로 Connection 되면 에러 로그가 사라진다. 

 

./zkServer.sh status 명령어를 통해서 현재 서버의 상태를 조회할수 있다. 1번 서버에서 해당 명령어를 실행해봤는데 Mode가 follower로 나온다. 

 

3개 ZooKeeper 서버 중에서 2번 서버가 leader 역할을 수행한다. 

리더 서버는 Client로부터 발생한 write 명령어를 수행한다.


 

Znode확인


Znode를 조회하기 위해서 ./zkCli.sh 명령어를 수행한다.

 

ZooKeeper가 Znode를 관리하는 방식은 트리형태이며, Linux의 파일시스템 구조와 같다. 

 

./zkCli.sh 명령어를 실행하고, ls /을 통해서 루트 Znode를 조회해보면 zookeeper 노드만 들어있다. zookeeper의 하위에는 config, quota 노드가 있다.  이 정보는 모든 서버에 copy된다.


Znode 생성과 데이터 쓰기


create [znode] 명령어를 통해 zookeeper의 하위에 test_znode라는 znode를 생성한다.

znode에는 간단한 정보를 기록할 수 있다. ( 대략 1MB ) 

get 명령어를 통해 znode의 데이터를 확인할 수 있고 set 명령어를 통해 데이터를 작성할 수 있다. 

 

최초에 test_znode를 생성했을때 get 명령어를 수행하면 null 나온다. 

set명령어를 통해 "hello Znode" 문자열을 셋팅했다. 

 

위에서 생성한 test_znode는 (당연히) zk-Sever2, zk-Server3에도 복사되어 있다.

zk-server2 
zk-server3

 

 

Kafka가 생성한 Znode


이전 게시물에서 Kafka를 설치했다. Kafka를 설치하고 Topic을 하나 생성한 뒤에 ZooKeeper의 Znode를 조회하면 다음과 같은 Znode들이 생성되었음을 확인할 수 있다. 

뭔진 잘 모르겠지만 zNode 이름만 봐도 kafka의 broker, consumer 정보 같은 것들을  zNode로써 관리함을 확인할 수 있다.

 

topics Znode의 하위 노드를 보면 이젠 만들어둔 Topic( sample-topic1 )들의 상세정보를 확인할 수 있다. 

파티션을 1개만 가지는 sample-topic1 토픽임을 알 수 있다.

 

정리해보면 Kafka는 토픽 정보를 ZooKeeper에 write 함으로써 Kafka의 다른 클라이언트가 동기화된 정보를 읽어들 일 수 있게된다.