imhamburger 님의 블로그

카프카(Kafka) - Kafka Broker 왜 홀수 개의 브로커가 필요할까? 본문

데이터엔지니어 부트캠프

카프카(Kafka) - Kafka Broker 왜 홀수 개의 브로커가 필요할까?

imhamburger 2024. 11. 12. 21:30

파이널 프로젝트 시작 전에 모든 개발환경을 yaml 파일로 실행시키고 Grafana 시각화를 만드는 작은? 프로젝트를 먼저 진행하였다. (작은?!!)

나는 그중에서 Kafka를 맡았는데 이번에 Kafka를 yaml로 구축하면서 더 자세히 들여다볼 수 있는 시간을 가졌던 것 같다.

 

 

카프카는 Broker를 통해 데이터를 보내고 받는 형식이다.

Broker는 내가 개수를 지정할 수 있는데, 이러한 의문이 들었다.

 

Broker는 몇 개가 적당한거지?

 

그래서 여기저기 검색해보니 브로커를 최소 3개를 사용하는게 좋다는 내용을 보았다.

그리고 홀수개여야 한다는 점!

 

왜 3개가 좋은건지 이해하기 전에 acks 와 min.insync.replicas 옵션을 먼저 짚고 넘어가야 한다.

 

카프카에서 acks는 프로듀서가 메시지를 전송한 후, 카프카 브로커가 메시지를 처리했다는 응답을 얼마나 기다릴 것인지를 설정하는 파라미터이다.

 

 

acks의 설정값 (공식문서)

 

  • acks=0 
    • 프로듀서는 메시지를 브로커에 전송한 후 응답을 기다리지 않는다.
    • 즉, 메시지가 전송되었음을 확인할 필요 없이 계속해서 다른 메시지를 보낼 수 있다.
    • 이 설정은 최고의 성능을 제공하지만, 메시지 손실이 발생할 위험이 있다.
  • acks=1 
    • 프로듀서는 메시지를 리더 브로커에 전송하고, 리더가 메시지를 받았다는 응답을 받으면 그때서야 다음 메시지를 전송한다.
    • 리더만 응답을 보내면 되므로 상대적으로 빠른 응답을 얻을 수 있다.
    • 그러나 팔로워가 동기화되지 않거나 실패할 수 있으므로 데이터 손실 위험이 존재할 수 있다.
  • acks=all 또는 acks=-1 
    • 프로듀서는 메시지를 리더와 모든 팔로워 브로커가 복제한 후에야 응답을 받는다.
    • 이 설정은 최고의 내구성을 보장하지만, 응답 시간은 더 길어질 수 있다.
    • 모든 복제본이 메시지를 동기화해야 하므로 데이터 손실 가능성이 거의 없고, 높은 데이터 안정성을 제공한다.

 

 

min.insync.replicas

 

min.insync.replicas는 카프카에서 파티션의 복제본 중 최소한 몇 개가 동기화되어 있어야 하는지를 설정하는 중요한 파라미터이다.

acks=all 로 설정하여 메세지를 보낼 때 최소 복제본의 수를 의미한다.

 

복제본?

카프카에서는 각 파티션에 대해 여러 복제본을 만들 수 있다. 각 복제본은 리더(Leader)와 팔로워(Follower)로 나뉜다.

 

카프카는 리더-팔로워 모델을 사용하여 데이터 복제를 처리하는 데, 각 파티션마다 하나의 리더와 여러 개의 팔로워가 존재한다.

리더는 모든 읽기/쓰기 작업을 처리하고,

팔로워는 리더의 데이터를 복제하여 데이터의 가용성과 내구성을 높인다.

 

 

  • min.insync.replicas=1일 경우,
    • 리더만 동기화되면 쓰기가 가능하며, 다른 팔로워가 동기화되지 않아도 데이터를 쓸 수 있다. 이 설정은 빠른 응답을 주지만, 복제 실패로 인한 데이터 손실 위험이 존재할 수 있다.
  • min.insync.replicas=2일 경우,
    • 리더와 최소 1개의 팔로워가 동기화되어 있어야 한다. 팔로워가 하나라도 동기화되지 않으면, 쓰기 작업을 거부하고 오류를 발생시킨다. 이 설정은 더 높은 데이터 안정성을 제공한다.
  • min.insync.replicas 값을 높이면,
    • 더 많은 복제본이 동기화되었을 때만 쓰기가 허용되므로 데이터 안정성이 높아지지만, 성능은 낮아질 수 있다.

 

그러니 무작정 많이 늘리는 것도 문제다.

 

결론은 안정적인 데이터 전송을 위해서는 최소 3개의 브로커를 사용하고 min.insync.replicas 값은 2 그리고

acks 값도 all로 설정하는 것이다.

 

 

 

그럼 왜 홀수 개의 브로커가 필요할까?

 

홀수개여야 하는 점은 카프카에서 리더 선출 알고리즘으로 Zookeeper를 이용하여 파티션의 리더 브로커를 결정하는 프로세스가 있기 때문이다.

 

리더 선출은 다음과 같은 과정으로 이루어진다.

  • Zookeeper를 통해 브로커들이 서로의 상태를 주기적으로 체크하고, 파티션의 리더를 지정하는 역할
  • 각 파티션에 대해 복제본(replica)이 여러 개 존재할 수 있지만, 실제로 데이터를 처리하는 리더는 하나만 존재
  • 리더 선출 알고리즘은 Zookeeper가 파티션에 대한 리더를 자동으로 결정. 주로 가장 건강한 상태의 브로커가 리더로 선출

 

카프카에서 홀수 개의 브로커가 권장되는 이유는 리더 선출과 장애 복구와 관련이 있다.

 

카프카는 브로커들이 복제본(follower) 상태로 데이터를 동기화하고, 이 복제본들이 리더의 상태를 추적한다.

장애가 발생했을 때 리더를 다시 선출해야 하는데, 이 과정에서 다수결을 이용해 새 리더를 결정한다.

 

예를들면, 3개의 브로커가 있으면 리더와 팔로워들이 각자의 상태를 서로 비교하여 다수결로 리더를 선출할 수 있다.

홀수 개의 브로커를 사용하면 과반수가 항상 존재하기 때문에, 리더를 결정할 때나 문제가 발생하더라도 결정이 확실하게 이루어진다.

반면, 2개의 브로커가 있을 경우, 하나가 리더가 되고, 다른 하나가 팔로워가 된다.

리더가 장애가 발생하면, 1개만의 브로커만 남게 되어 과반수를 만족할 수 없으므로 리더 선출이 제대로 이루어지지 않거나 장애가 지속될 수 있다.