i.am.developer

카프카 메시지 읽기,쓰기 요청은 리더 파티션에게 간다? 본문

프로그래밍

카프카 메시지 읽기,쓰기 요청은 리더 파티션에게 간다?

jongwow 2023. 11. 3. 01:13

복제! 그게 강력함의 핵심이야!


복제(Replication)은 카프카 아키텍처의 핵심이다. 카프카 클러스터는 보통 여러 개의 브로커(Broker)로 구성된다. 그리고 카프카의 토픽(Topic)은 여러 브로커들에 걸쳐서 복제되어 저장된다. 이걸 복제(Replication)라 부른다. 이때, Replication 의 단위는 Topic Partition 이다.

Replication의 구분

Topic Partition 단위의 Replication은 크게 두가지로 나뉜다. Leader partition과 Follower partition. 카프카의 파티션은 단 하나의 리더 파티션을, 0개 이상의 팔로워 파티션을 가진다.

  • 브로커가 하나면 리더 파티션만 존재한다.
  • 브로커가 2개 이상이여야 리더 파티션 하나와 나머지 팔로워 파티션을 갖는다.

읽기, 쓰기 요청은 오직 리더 파티션에게만 간다는 오해

책들을 보면 카프카로 들어오는 읽기 요청, 쓰기 요청은 모두 리더 파티션을 통해서만 일어난다고 한다.

“모든 읽기와 쓰기가 리더를 통해서만 일어난다는 점”, “팔로워는 리더의 데이터를 그대로 리플리케이션만 하고 읽기와 쓰기에 관여하지 않습니다” - 카프카, 데이터 플랫폼의 최강자
”모든 읽기와 쓰기는 리더를 통해서만 가능”, “프로듀서는 … 리더에게만 메시지를 전송”, “컨슈머도 오직 리더로부터 메시지를 가져옵니다” - 실전 카프카, 개발부터 운영까지

 

하지만! 공식 문서에선 모든 쓰기 요청은 리더 파티션에게만 가지만 쓰기 요청은 리더 혹은 팔로워 파티션들에게 간다고 명시되어 있다.

“All writes go to the leader of the partition, and reads can go to the leader or the followers of the partition” - https://kafka.apache.org/documentation/#replication

 

찾아보니 옛날(2.3 or older)에선 모든 읽기, 쓰기가 리더 파티션에게만 집중됐던 것이 맞고 그건 바꿀 수 없었다. 하지만 2.4 버전 이후에서는 팔로워 파티션에서도 읽기(메세지를 Consume)할 수 있도록 허용해주도록 바뀌었다. 아마 책이 쓰여질 당시엔 2.4 버전이 출시하기 전이기 때문일거라 생각된다.

결론은 2.4 버전 이상에선 팔로워 파티션을 통해서 읽기 요청을 처리할 수 있다고 알면 될 것 같다.

  • 리더 파티션: 쓰기 요청, 읽기 요청 가능.
  • 팔로워 파티션: 읽기 요청 가능.

어떻게 설정할 수 있을까?

카프카 2.4 버전 이상에선 ReplicaSelector 인터페이스를 제공한다.

  • LeaderSelector구현체:  리더 파티션으로 가도록 한다.
  • RackAwareReplicaSelector구현체: consumer에 가까운 replica를 선택하도록 rack ID를 사용한다.
  • Default: LeaderSelector

Kafka의 기본 설정(LeaderSelector)은 이전과 동일하게 모든 읽기, 쓰기 요청이 리더 파티션에게 가도록 되어있다.

아래 Redhat의 글이 매우 잘 설명되어있다.

https://developers.redhat.com/blog/2020/04/29/consuming-messages-from-closest-replicas-in-apache-kafka-2-4-0-and-amq-streams#the_new_replicaselector_interface

결론

각각의 경우가 성능적으로, 안정성적으로 얼마나 차이가 날진 모르겠다. 하지만 기본 설정도 충분하기 때문에 특별히 팔로워 파티션으로 읽기를 나눠야겠다는 니즈가 없으면 그냥 기본옵션대로 살면 될 것 같다.

참고 링크

'프로그래밍' 카테고리의 다른 글

JSON.stringify 구현해보기  (0) 2022.11.20
Design Pattern - 들어가기  (0) 2022.11.20