ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kafka 101] bootstrap.servers 설정에 관하여 (Inside of bootstrap.server)
    개발자 라이프/카프카 2020. 4. 12. 19:03
    반응형

    들어가며

     카프카 클라이언트, 그 중 대표적으로 프로듀서와 컨슈머는 메시지를 발행, 구독하기 위해 필수로 bootstrap.servers 설정을 합니다. 하지만 이 bootstrap.servers 설정은 카프카 클러스터를 구성하는 전체 브로커에 대해 설정해주지 않아도 클라이언트는 각자의 브로커 자원 위치를 알고 작업을 수행합니다. 이번 글은 클라이언트의 bootstrap.servers 설정과 이 설정에 관한 내부 작동에 관하여 설명합니다.

    bootstrap의 대략적인 의미 (출처 : 나무위키)

    카프카의 구조적인 특징

     카프카 클러스터의 가장 큰 특징은 각 브로커들이 클러스터 전체 데이터의 일부분을 가지고 있다는 것입니다. 이는 카프카의 구성 요소인 토픽, 파티션과 깊은 연관이 있습니다. 논리적인 단위인 토픽은 메시지 저장의 단위인 파티션으로 쪼개져 구성되고, 파티션은 복제(replication)를 통해 여러 브로커에 산개되어 구성되기 때문입니다.

    토픽 파티션이 브로커에 산개되어 있는 모습. 프로듀서가 topic1-partition1에 메시지를 전달하려면 해당 리더 파티션이 위치한 1번 브로커에 메시지를 전달해야 합니다. (출처 : https://www.confluent.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/ )

     이처럼 개별 브로커는 클러스터 전체 데이터를 가지고 있지 않습니다. 그렇기 때문에 클라이언트는 브로커와 연결하여 브로커 내부의 자원에 접근하기 위해, 클라이언트가 접근하고자 하는 자원의 위치를 알아야합니다. 위 그림을 예로, 프로듀서가 토픽 1의 파티션 1(topic1-partition1)에 메시지를 발행하려면 프로듀서는 해당 토픽 파티션이 전체 브로커 클러스터 중 몇 번 브로커에 위치하는 지 알아야합니다. 그래서 카프카는 클라이언트가 카프카와 처음 연결될 때, 자원들의 메타데이터를 공유하기 위해 bootstrap.servers 설정을 요구합니다.

    bootstrap.servers 설정

    bootstrap.servers 에 관한 공식 문서 내용 (출처 : https://kafka.apache.org/documentation/)

     bootstrap.servers 설정은 클라이언트가 접근하는 토픽 파티션의 메타데이터를 요청하기 위한 설정입니다. 그렇기 때문에 브로커의 호스트/포트 정보의 리스트 형태의 값을 가집니다. 하지만 입력되는 설정 값은 클러스터의 모든 브로커 호스트일 필요가 없습니다. 이는 설정 값의 호스트 정보를 기준으로 순차적으로 메타데이터를 요청하고, 만약 성공할 경우에는 그 메타데이터를 이용하기 때문입니다. 예를 들어, bootstrap.servers=broker1:9092,broker2:9092,broker3:9092로 설정되어 있다면 클라이언트는 broker1:9092 부터 메타데이터를 요청하고 해당 요청이 실패하면 broker2:9092로 요청합니다.

     그렇다면 bootstrap.servers 설정에는 몇 개의 브로커 호스트를 등록해야 할까요? 클러스터 운영 환경에 따라 다릅니다. 하지만 너무 적게 입력하면 다른 브로커가 멀쩡히 구동 중임에도 불구하고 설정에 겨우 입력된 브로커가 중단된다면, 클라이언트는 카프카 클러스터와 연결할 수 없게 됩니다. 조금 극단적인 예로는 100개의 브로커가 구동 중인데, 클라이언트가 bootstrap.servers 설정에 1개의 브로커 호스트만 입력하고, 이 때 해당 브로커가 어떤 이유(비정상 중단 혹은 롤링 리스타트 등)에서 잠시 중단된다면 해당 클라이언트는 정말 운이 나쁘게도 그 카프카 클러스터와 연결할 수 없게 됩니다.

    메타데이터 요청 과정

     앞서 언급한 것처럼 클라이언트는 bootstrap.servers 설정에 입력된 브로커 호스트 정보를 이용하여 메타데이터를 요청합니다. 클라이언트와 브로커 사이의 메타데이터를 주고받는 과정은 다음과 같습니다. 

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

    클라이언트와 카프카 간 네트워크 패킷의 모습. 470~472번 통신을 통해 메타데이터가 요청/응답된다.

     메타데이터 요청 과정을 통해 클라이언트가 토픽 파티션의 위치를 알게되면, 이 후 Pub/Sub 과정을 진행하게 됩니다. 이처럼 메타데이터는 클라이언트가 브로커에 처음 접근할 때와 주기적으로 갱신할 때 요청합니다. 하지만 다음 2가지 상황이 발생하면 클라이언트가 브로커에 다시 메타데이터를 요청합니다. 

    • 현재 접근하고 있는 브로커가 비정상인 경우 : 비정상 중단 혹은 롤링 리스타트 등
    • 클라이언트가 접근하고 있던 리더 토픽 파티션의 위치가 변경된 경우 : Partition Re-assign

    마무리

     프로듀서, 컨슈머, 스트림즈(Streams) 어플리케이션, 커넥터(Connector) 등 카프카와 연계된 즉, 브로커 자원에 접근하는 모든 클라이언트는 공통적으로 bootstrap.servers 설정이 필수입니다. 그 이유는 앞서 살펴봤던 메타데이터 전달 과정이 있어야하기 때문입니다. 

    ps 1. 혹시 잘못되거나 부족한 부분은 댓글로 남겨주시길 바랍니다. 
    ps 2. 내용이 마음에 드셨다면 공감 버튼❤️을 눌러주세요!

     

    반응형

    댓글

Designed by Tistory.