브로커가 0, 1, 2, 3, 4번으로 구성된 클러스터가 있고, 특정 토픽의 파티션은 0번이 리더이며 1번과 2번에 복제본이 있다고 가정합니다.
- 브로커 : 0,1,2,3,4
- 토픽의 파티션 : 0(리더), 1(팔로워), 2(팔로워)
이후 브로커 2번을 graceful shutdown하거나 예상치 못한 장애로 인해 오래 오프라인 상태가 되는 상황을 떠올려볼 수 있습니다.
“브로커 2번이 장시간 오프라인이면, 카프카가 자동으로 복제본을 3번이나 4번 브로커로 옮겨주지 않을까?”
복제본이 자동으로 이동한다면 가용성과 내구성이 유지될 것처럼 보입니다. 그러나 실제 Kafka는 어떻게 동작할까요.
카프카의 동작
브로커 2번이 1분, 10분, 1시간, 그 이상을 오프라인 상태로 유지하더라도 Kafka는 오직 두 가지 동작만 수행합니다.
첫째, 브로커 2번이 일정 시간 동안 리더를 따라잡지 못하면 ISR(In-Sync Replicas)에서 제외합니다.
둘째, 필요한 경우 리더 교체만 처리합니다.
그러나 Kafka는 복제본을 다른 브로커로 이동하지 않습니다. 즉, replica 목록은 그대로 [0,1,2] 상태로 유지되며, 복제본 불일치 문제는 운영자가 직접 조치하지 않는 이상 해결되지 않습니다. 이로 인해 replication.factor가 3이라도 실질적으로는 2개의 replica만 운영되는 결과가 일어납니다. 이런 현상을 Under replicated partition 상태라고 부릅니다.
관련 문서
https://kafka.apache.org/documentation/#basic_ops_decommissioning_brokers
Decommissioning brokers
The partition reassignment tool does not have the ability to automatically generate a reassignment plan for decommissioning brokers yet. As such, the admin has to come up with a reassignment plan to move the replica for all partitions hosted on the broker to be decommissioned, to the rest of the brokers. This can be relatively tedious as the reassignment needs to ensure that all the replicas are not moved from the decommissioned broker to only one other broker. To make this process effortless, we plan to add tooling support for decommissioning brokers in the future.
브로커를 폐지(decommission)할 때, 현재의 파티션 재할당 도구는 이를 위한 자동 재할당 계획을 생성하는 기능을 제공하지 않습니다. 따라서 관리자는 폐지하려는 브로커가 가지고 있는 모든 파티션의 복제본을 나머지 브로커로 옮기기 위한 재할당 계획을 직접 만들어야 합니다. 이 작업은 상당히 번거로울 수 있습니다. 왜냐하면 재할당 과정에서 복제본이 폐지되는 브로커에서 단일 브로커로만 몰려 이동하지 않도록 신경 써야 하기 때문입니다. 이 과정을 보다 수월하게 만들기 위해, Kafka는 향후 브로커 폐지를 위한 자동화된 도구 지원을 추가할 계획입니다
그렇다면 운영에서는 어떻게 대응해야 하는가
브로커가 단기간 오프라인인 경우에는 ISR에서 빠졌다가 복구 시 다시 합류하면 문제는 자연스럽게 해결됩니다. 그러나 브로커가 장기간 복구되지 않거나 아예 폐지할 예정이라면 운영자가 직접 복제본 재배치 작업을 실행해야 합니다. Kafka는 kafka-reassign-partitions.sh와 같은 관리 도구를 통해 명시적으로 원하는 replica 구성을 지정하도록 설계되어 있습니다. 관리자가 “파티션 0의 복제본을 0, 1, 3으로 옮기겠다”라고 지시해야만 Kafka는 이에 따라 실제 복제 작업을 수행합니다.
'빅데이터 > Kafka' 카테고리의 다른 글
| KIP-932 Queues for Kafka 사용해보기(KafkaShareConsumer) (1) | 2025.09.12 |
|---|---|
| Apache Kafka 4.1.0 docker-compose.yaml 실행 (0) | 2025.09.12 |
| 윈도우즈 wsl2 환경에서 로컬 카프카 브로커 연동하기 (0) | 2025.05.25 |
| Sent auto-creation request for Set(__consumer_offsets) to the active controller 에러 해결 방법 (0) | 2025.04.18 |
| 카프카4.0 부터는 eager rebalancing protocol이 삭제됩니다. (0) | 2025.02.28 |
| [local macOS 환경] apache kafka(3.5.0기준) + redpanda/console 로 편하게 테스트 하기 (0) | 2025.02.26 |