본문 바로가기
제품/Kafka

Replications(복제) - 리더와 팔로워

by 헬로웬디 2024. 12. 22.

카프카(Kafka)는 대규모 분산 메시징 시스템으로, 많은 데이터를 빠르고 안정적으로 처리할 수 있도록 설계되었습니다. 카프카에서 데이터를 안전하게 저장하고 관리하는 핵심 개념 중 하나는 바로 파티션 복제입니다. 

 

모든 파티션 데이터를 단일 스토리지, 즉 단일 브로커에 저장한다면, 여러 가지 위험이 따릅니다. 이 단일 브로커가 장애를 겪게 되면 해당 파티션의 데이터도 함께 손실될 수 있기 때문입니다. 그래서  데이터를 안전하게 지키기 위해서 파티션 데이터를 다른 브로커에 복사하게 하는 파티션 복제 기능을 사용합니다.

 

이 때 복사본을 follower replica,원본 파티션을 leader replica 라고 명명하며, 파티션은 하나의 리더와 N-1개의 팔로워를 가질 수 있습니다.

  • 리더(Leader): 리더는 해당 파티션의 원본 데이터를 저장하는 역할을 합니다. 모든 쓰기 작업은 리더에 발생하고, 데이터 생산자는 데이터를 리더에게 씁니다.
  • 팔로워(Follower): 팔로워는 리더의 데이터를 복제하여 저장합니다. 리더가 새로운 데이터를 받으면, 이 데이터는 팔로워로 전파되어 복제됩니다. 이 과정을 통해 여러 브로커에 데이터가 분산 저장되므로, 하나의 브로커가 실패하더라도 데이터가 손실되지 않습니다.

 


 

 

파티션 수에 따라 파티션이 브로커에 어떻게 분배되는지 확인해 볼께요. 우선 3개의 카프카 브로커로 구성된 클러스터에서 다음 각 토픽을 생성해 봅시다.

  • 파티션이 3개이고 리플리케이션이 1개인 mytest-0 토픽 생성
./kafka-topics.sh --create --bootstrap-server localhost:9092 --topic mytest --replication-factor 1 --partitions 3

./kafka-topics.sh --bootstrap-server localhost:9092 --topic mytest --describe

 

 

--replication-factor 값은 원본을 포함한 리플리케이션 값을 나타냅니다. --replication-factor 이 1일 때는 원본, 리플리케이션 포함해서 파티션이 1개입니다.  토픽 mytest는 파티션 0, 1, 2으로 구성되었고, 파티션 0의 리더는 브로커 2, 파티션 1의 리더는 브로커 3, 파티션 2의 리더는 브로커 1에 분산되어 있습니다. 이는 리더가 있는 브로커에 오류가 생겨 작동하지 못하더라도, 해당 브로커에 리더를 둔 파티션만 실패하고 다른 파티션에 영향을 받지 않게 하여 데이터 손실을 최소화합니다.  또 여러 소비자/생산자가 동일한 브로커에 집중되는 과부하를 피할 수 있습니다. 

 

  • 파티션이 3개이고 리플리케이션이 2개인 mytest-1 토픽 생성
./kafka-topics.sh --create --bootstrap-server localhost:9092 --topic mytest-1 --replication-factor 2 --partitions 3

./kafka-topics.sh --bootstrap-server localhost:9092 --topic mytest-1 --describe

 

 

토픽 mytest-1은 파티션 0, 1, 2으로 구성되었고, 파티션 0의 리더는 브로커 1, 파티션 1의 리더는 브로커 2, 파티션 2의 리더는 브로커 3에 분산되어 있습니다. 각 파티션의 팔로워는 3, 1, 2에 존재하여 원본 데이터가 있는 브로커와 다른 브로커에 복제되었음을 확인할 수 있습니다. 그림에서 Isr(In-sync replica) 필드를  무엇일까요? 카프카에서 리더는 모든 쓰기 요청을 처리하고, 팔로워들은 리더의 데이터를 복제하여 저장할  때 ISRs는 각 파티션에 있는 복제본들이 리더와 동기화되어 있는지를 나타냅니다. 즉, ISR에 포함된 브로커들은 리더와 동일한 데이터를 가지고 있다는 의미입니다.

 

만약 우리가 리플리케이션 수를 브로커 수보다 크게하면 어떻게 될까요?

  • 파티션이 3개이고 리플리케이션이 4개인 mytest-2 토픽 생성
./kafka-topics.sh --create --bootstrap-server localhost:9092 --topic mytest-2 --replication-factor 4 --partitions 3

 

카프카는 Replication factor가 broker 개수보다 크기 때문에 토픽 생성을 실패합니다.  

 

카프카는 각 파티션에 대해 N-1개까지의 팔로우를 설정할 수 있음을 알 수 있습니다.

 

카프카의 리더-팔로워 구조는 데이터의 안정성을 높이는 중요한 기능입니다. 데이터가 하나의 브로커에만 저장되는 것이 아니라 여러 브로커에 복제되어 저장되므로, 브로커 장애나 시스템 오류로부터 안전하게 데이터를 보호할 수 있습니다.