[Apache Kafka] bootstrap.server

박현아·2021년 12월 20일
2
post-thumbnail

0. 개요


Kafka Command line 명령어 중,

  1. consumer 생성 명령어
kafka-console-consumer.bat --bootstrap-server host:port --topic [topic_name]
  1. consumer group list 확인 명령어
kafka-consumer-groups.sh --bootstrap-server host:port --list
  1. consumer group의 상세 정보 확인
kafka-consumer-groups.sh --bootstrap-server host:port --group [consumer_group_name] --describe

등등... 적지 않은 명령어에서 bootstrap server 발견


1. Kafka 구조


이미지 출처: https://www.confluent.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/

위 예시에서 Kafka Cluster는 4대의 broker로 구성되어 있고, 1개의 Topic이 있습니다. 논리적 단위인 topic은 여러개의 partition으로 쪼개져 구성되고, partition은 복제(replication)을 통해 여러 broker에 분산되어 있습니다. 이때, Leader replica는 producer / consumer가 write / read 하는 대상이 됩니다. Leader replica를 복제한 Follower replica는 Leader replica의 데이터를 복제하여 동일하게 유지하다가 Leader replica가 중단된 경우에 새로운 Leader replica로 선출됩니다.

위 그림에서 알 수 있듯이, 개별 broker는 cluster 전체 데이터를 가지고 있지 않습니다. 따라서 Kafka 클라이언트(producer, consumer 등)는 브로커와 연결하여 브로커 내부의 자원에 접근하기 위해, 클라이언트가 접근하고자 하는 자원의 위치를 알아야합니다. 그래서 Kafka는 클라이언트가 kafka와 처음 연결될 때, 자원들의 메타데이터를 공유하기 위해 bootstrap.servers 설정을 요구합니다.


2. bootstrap.servers


출처: https://kafka.apache.org/documentation/

bootstrap.servers 설정은 클라이언트가 접근하는 토픽의 메타데이터를 요청하여 원하는 브로커를 찾기 위한 설정입니다.(*메타데이터: 다른 데이터를 설명해주는 데이터) 그렇기 때문에 브로커의 host:port 정보의 리스트 형태의 값을 가집니다. 하지만 리스트에 클러스터의 모든 브로커 호스트를 쓸 필요는 없습니다. 이는 설정 값의 호스트 정보를 기준으로 순차적으로 메타데이터를 요청하고, 만약 성공할 경우에는 그 메타데이터를 이용하기 때문입니다.

ex) bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
-> 클라이언트는 broker1:9092부터 메타데이터를 요청하고 해당 요청이 실패하면 broker2:9092로 요청합니다.

하지만, 극단적인 예로 100개의 브로커가 구동 중인데, 클라이언트가 boostrap.servers 설정에 단 1개의 브로커 호스트만 입력하고, 이때 해당 브로커가 어떤 문제로 인해 잠시 중단된다면 해당 클라이언트는 그 카프카 클러스터와 연결할 수 없게 됩니다. 따라서 클러스터 운영 환경에 맞게 설정 값을 작성해주어야 합니다.


메타데이터 요청 과정

  1. 클라이언트가 브로커와 연결
  2. 연결 성공 시, 클러스터에 등록된 모든 브로커와 토픽, 파티션의 메타데이터 전송
  3. 클라이언트는 메타데이터에서 토픽 파티션의 위치(브로커)를 찾음
  4. 클라이언트는 해당 브로커로 요청

zookeeper vs bootstrap.servers

Kafka consumer는 본인이 어디까지 메시지를 읽어왔는지를 알기 위해서 kafka에게 offset을 보내고 받아와야 합니다. 이때, kafka가 offset storage를 zookeeper에서 kafka broker로 옮기면서, kafka consumer가 zookeeper와 직접적으로 통신해야 할 필요가 없어졌습니다.

  • Kafka 구버전(0.9.0) -> 모든 offset 관련 정보(현재 partition offset 등)가 zookeeper에 저장됨.

  • Kafka 현재버전(0.10.0 이상) -> 모든 토픽 메타데이터(total partition, partition offset 등)가 kafka server의 __consumer_offset 토픽에 저장됨. 그래서 kafka broker가 zookeeper와 통신하고, kafka consumer는 kafka broker를 통해서 메타데이터를 얻을 수 있음. kafka server 한 곳에 데이터와 메타데이터가 존재하므로 관리에 더 용이함.


3. 참조


https://kafka.apache.org/documentation/
https://always-kimkim.tistory.com/entry/kafka101-configuration-bootstrap-servers
https://stackoverflow.com/questions/46173003/bootstrap-server-vs-zookeeper-in-kafka

0개의 댓글