kafka 환경세팅 및 zookeeper 설명(kafka, zookeeper, akhq, quorum controller)
안녕하세요 codeshow 입니다.
이번 시간에는 kafka 를 실습하겠습니다.
실습을 위해서는 codeshow github 의 devcontainers repository를 clone해주세요.
kafka 폴더에서 vscode를 실행해주세요.
devcontainers 를 실행해주세요.
container 실행될때까지 기다려주세요.
container가 다 실행되면 docker desktop을 열겠습니다.
kafka 3개와 zoo keeper AKHQ가 실행됩니다.
이 컨테이너들을 설명드리면,
zoo keeper는 distribution system coordinator입니다.
분산 환경에서 여러대의 kafka를 관리합니다.
AKHQ는 kafka를 편리하게 관리하기 위해 web UI를 제공합니다.
8080 port를 사용합니다.
zookeeper는 주기적으로 모든 kafka 노드에 heart beat 시그널을 날립니다. zookeeper는 ping 요청, 카프카는 pong 응답을 합니다. 만약 일부 kafka 노드가 응답을 주지 못하면 zookeeper는 해당 kafka 노드를 장애로 간주합니다.
만약 3번 kafka가 장애가 난 경우,
ping, pong은 실패를 하게 되고,
zookeeper는 3번 kafka를 관리 노드에서 삭제를 합니다.
그리고 나머지 kafka 1 과 2번에게 3번노드 장애를 통보하고 kafka 1과 2는 더 이상 3과 통신하지 않습니다.
참고로 kafka3가 다시 생성되면 그림과 같이 zookeeper에 등록되고 다시 kafka 1, 2, 3은 cluster가 됩니다.
참고로, 실습에서는 zookeeper가 한대지만
그림과 같이 production 환경에서는 여러대의 zookeeper 노드를 설치해
zookeeper 하나가 다운되더라도 서비스는 동작할 수 있도록 구성합니다.
수업에서는 운영 환경과 같은 고가용성이 불필요하기 때문에 1개의 zookeeper만 사용하겠습니다.
browser로 AKHQ에서 제공하는 Nodes 메뉴로 들어가겠습니다.
화면에는 총 3개의 kafka 노드가 실행하고 있습니다.
docker desktop에서 kafka2 를 정지하겠습니다.
AKHQ의 노드 메뉴로 돌아가 새로고침을 하면,
kafka2가 사라진것을 확인할 수 있습니다.
다시 docker desktop에서 start 버튼을 누릅니다.
kafka가 로딩되는것을 기다린후 AKHQ의 Nodes 화면을 새로고침합니다.
kafka2가 다시 화면에서 조회됩니다..
이 kafka 노드들중에 control 노드를 stop하겠습니다.
기존에 control 노드가 health check에 실패하자 다른 노드가 control 노드가 되는 것을 확인할 수 있습니다.
kafka는 분산 환경에서 노드들간에 조율을 zookeeper가 담당합니다.
devcontainer 설정에서 zookeeper의 admin server 설정을 true로 하였기 때문에,
우리는 브라우저를 통해 8081 port로 zookeeper 정보를 확인할 수 있습니다.
브라우저에서 localhost 콜론 8081 slash commands 를 주소로 입력하겠습니다.
commands 페이지에서는 zookeeper에서 제공하는 command 들을 링크로 볼 수 있습니다.
connections 링크를 선택합니다.
http://localhost:8081/commands/connections
connections로 조회한 json 데이터를 통해 zookeeper 연결된 kafka 노드의 정보를 확인할 수 있습니다.
이 IP가 kafka 노드가 맞는지 docker container에 들어가 확인해보겠습니다.
hostname -I
zookeeper connection 정보와 kafka 노드의 IP가 일치하는 것을 확인할 수 있습니다.
connections 배열에는 kafka 노드 3개의 connection 정보를 확인할 수 있습니다.
지금은 총 3개의 kafka 노드들이 주기적으로 ping 체크를 하는 것을 확인 할 수 있습니다.
앞서 그림으로 설명한 것 처럼,
zookeeper는 ping, pong 이 실패하면 실패한 노드의 정보를 다른 kafka 노드에 전달해서
남은 두대의 kafka 노드들은 더이상 실패한 노드와 통신을 하지 않습니다.
그리고 zookeeper에 다시 kafka 노드가 살아나서 ping, pong 이 성공하면,
남은 두대의 노드들에게 다시 이 정보를 전파하고 이 kafka 노드들은 새로운 노드와 통신을 하게 됩니다.
추가로 모든 kafka 노드는 필수적으로 한대의 controller가 필요합니다.
이 controller 노드는 다른 kafka 노드를 관리 제어하는 매우 중요한 노드입니다.
zookeeper를 사용하는 경우, kafka 노드중 한대만 controller 노드가 될 수 있습니다.
이 한대의 controller 노드가 장애시 모든 kafka cluster는 동작할 수 없습니다.
그러므로 controller 노드가 장애가 난 경우 다른 kafka 노드중 하나가 controller 노드로 선정되야합니다.
이때 노드들간에 투표를 통해 선출되는데 이 과정에 zookeeper가 관여를 합니다.
그러므로 zookeeper는 kafka 분산 시스템에서 중요한 역할을 담당합니다.
참고로, controller 노드를 제외한 나머지 노드는 broker 노드라고 부릅니다. 다음 수업에 학습하게될 partition을 저장하는 노드는 broker 노드에서 담당합니다. controller 노드는 broker 노드가 사용할 여러 메타 데이터를 저장하고 broker 노드를 관리합니다.
참고로 kafka는 2.8.0 버전부터 quorum controller를 추가로 제공합니다.
이는 zookeeper로 kafka를 조율하지 않고 KRaft protocol을 통해 zookeeper를 사용하지 않고 kafka 노드에서 직접 kafka metadata들을 관리합니다.
특징으로는 기존 zookeeper는 controller 노드를 한대만 두는데에 비해,
quorum controller는 여러대의 controller 노드를 둘 수 있습니다.
즉, controller 노드 장애시 바로 다른 controller 노드를 사용할 수 있습니다.
controller 노드는 meta 데이터를 항상 동기화 합니다.
기존에 zookeeper에서 meta데이터를 복사해야하는 비용이 줄어들어 매우 빠르게 controller 노드를 시작할 수 있습니다.
지금은 zookeeper와 quorum 방식 두가지를 선택할 수 있습니다.
미래에 kafka는 zookeeper를 deprecate할 수 있습니다.
하지만 현재는 과도기이므로 순서대로 zookeeper를 학습하고 quorum controller를 학습하는게 좋다고 생각합니다.
간단히 zookeeper를 shell 명령어를 이용해 조회하는 실습을 하겠습니다.
kafka가 설치된 container의 shell을 실행합니다.
zookeeper를 통해 모든 kafka를 조회합니다.
zookeeper-shell zookeeper:2181 ls /brokers/ids
배열로 총 3대의 0, 1, 2 cluster가 있는 것을 확인했습니다.
get 명령어로 0번째 kafka 정보를 살펴보겠습니다.
zookeeper-shell zookeeper:2181 get /brokers/ids/0
zookeeper-shell zookeeper:2181 get /brokers/ids/1
zookeeper-shell zookeeper:2181 get /brokers/ids/2
zookeeper에 저장된 kafka broker의 정보를 확인할 수 있습니다.
이상의 내용을 통해 zookeeper로 분산환경의 kafka의 여러정보들을 저장하고 조율하는것을 학습했습니다.
이상으로 kafka 환경 세팅과 내부 동작에 대해 살펴보았습니다.
다음시간에는 topic과 partition에 대해 학습하도록 하겠습니다.
구독과 좋아요 알림 설정은 컨텐츠 제작자에게 많은 도움이 됩니다.
감사합니다.