1. 리더 파티션에 장애가 나면 어떻게 될까?
Kafka를 복제 구조로 운영하는 가장 큰 이유 중 하나는, leader replica가 있는 Broker에 장애가 나더라도 다른 replica가 leader 역할을 이어받을 수 있게 만들기 위해서이다.
Apache Kafka 공식 문서는 partition마다 하나의 leader와 여러 follower가 있고, leader가 실패하면 follower 중 하나가 자동으로 새 leader가 된다고 설명한다. [1]
또한 Kafka 공식 설계 문서는 ISR(In-Sync Replicas) 안에 있는 replica만 leader 후보가 될 수 있다고 설명한다. [2]
즉, 입문 단계에서는 아래처럼 이해하면 된다.
리더 파티션에 장애가 나면
ISR 안에 있던 follower replica 중 하나가 새 leader가 된다.
2. 먼저 leader가 누구인지 확인하기
현재 email.send 토픽의 leader를 확인한다.
bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--describe \
--topic email.send
예를 들어 아래처럼 보였다고 가정하자.
Topic: email.send Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
이 경우 1번 Broker가 leader이고, 2번과 3번 Broker는 follower replica를 가지고 있다고 해석할 수 있다.
3. leader가 있는 Broker를 종료해보기
이제 leader가 있는 1번 Broker에 장애가 난 상황을 가정한다.
포그라운드에서 실행 중이었다면 Ctrl + C로 종료한다.
bin/kafka-server-start.sh config/server.properties
처럼 실행했던 Broker라면 해당 터미널에서 종료하면 된다.
Apache Kafka 공식 운영 문서는 broker가 종료되거나 장애가 나면, cluster가 이를 감지하고 그 broker가 leader이던 partition들의 새 leader를 자동으로 선출한다고 설명한다. [3]
4. 다시 leader를 조회해보기
1번 Broker가 종료됐으므로, 살아 있는 다른 Broker 주소로 토픽 정보를 조회해야 한다.
bin/kafka-topics.sh \
--bootstrap-server localhost:19092 \
--describe \
--topic email.send
이제 예를 들어 아래처럼 보일 수 있다.
Topic: email.send Partition: 0 Leader: 2 Replicas: 1,2,3 Isr: 2,3
이 출력은 아래 의미를 가진다.
Leader: 2- 원래 1번 Broker가 leader였는데, 이제 2번 Broker가 새 leader가 됐다.
Replicas: 1,2,3- 원래 복제본 배치 자체는 여전히 1, 2, 3번 Broker를 대상으로 한다.
Isr: 2,3- 1번 Broker는 현재 동기화 상태 replica 집합에서 빠졌다.
Apache Kafka 공식 모니터링 문서는 broker가 내려가면 ISR이 줄어들고(shrink), broker가 다시 올라와 충분히 따라잡으면 ISR이 다시 늘어난다(expand)고 설명한다. [4]
즉, 여기서 Isr에 1번 Broker가 빠졌다는 것은 아래 가능성 중 하나를 의미한다.
- Broker가 실제로 종료됐다.
- 네트워크 문제가 생겼다.
- leader 데이터를 아직 충분히 따라잡지 못했다.
5. Kafka 서버 1대가 고장나도 메시지를 넣고 읽을 수 있을까?
이제 살아 있는 Broker 주소를 사용해 producer와 consumer를 실행해본다.
메시지 넣기:
bin/kafka-console-producer.sh \
--bootstrap-server localhost:19092 \
--topic email.send
입력:
test
메시지 조회:
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:19092 \
--topic email.send \
--from-beginning
정상적으로 test가 들어가고 읽히면, 1대 장애가 났어도 cluster 전체가 바로 멈추지는 않았다는 뜻이다.
이게 가능한 이유는 아래와 같다.
- replication factor가 3으로 잡혀 있다.
- leader가 죽었을 때 ISR 안의 다른 follower가 새 leader가 됐다.
- producer와 consumer는 살아 있는 Broker를 bootstrap 주소로 사용해 계속 동작할 수 있다.
단, 이것은 “Kafka 서버 1대가 죽어도 무조건 아무 문제 없다”는 뜻은 아니다.
replication factor, ISR 상태, min.insync.replicas, producer acks 설정에 따라 실제 내구성과 가용성은 달라질 수 있다.
이번 실습에서는 입문 관점에서 “Broker 1대 장애 시에도 기본적인 read/write가 계속 가능한 구조”만 확인하면 충분하다.
6. 왜 여러 대를 운영할까?
Kafka 서버를 1대만 운영하면 그 1대가 leader이자 follower 복제 대상 전부를 동시에 맡게 되므로, 그 서버가 죽는 순간 해당 데이터 처리가 멈출 수 있다.
반면 Kafka 서버를 여러 대 운영하면,
한 대 장애 = 나머지 replica가 leader를 이어받을 여지
가 생긴다.
Apache Kafka 공식 소개 문서도 Kafka cluster가 fault-tolerant하며, 어떤 서버가 실패해도 다른 서버가 계속 서비스를 이어갈 수 있도록 설계됐다고 설명한다. [5]
물론 3대 모두 동시에 멈추거나, leader가 죽었는데 ISR에 선출 가능한 replica가 전혀 없으면 가용성이 깨질 수 있다.
즉, 서버 수를 늘린다고 장애가 완전히 사라지는 것은 아니지만, 단일 장애 지점을 줄일 수는 있다.
7. 종료했던 Broker를 다시 복구해보기
이제 아까 종료했던 Broker를 다시 실행한다.
1번 Broker를 내렸다면 아래처럼 다시 올린다.
bin/kafka-server-start.sh config/server.properties
Broker가 다시 올라왔다고 해서 즉시 ISR에 복귀하는 것은 아니다. follower replica는 leader의 로그를 다시 충분히 따라잡아야 한다.
Kafka 공식 모니터링 문서는 내려갔던 broker가 다시 올라오면, replica가 fully caught up 된 뒤 ISR이 다시 확장된다고 설명한다. [4]
8. 복구가 끝났는지 확인하기
다시 토픽 세부 정보를 확인한다.
bin/kafka-topics.sh \
--bootstrap-server localhost:19092 \
--describe \
--topic email.send
예를 들어 아래처럼 보이면
Topic: email.send Partition: 0 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3
1번 Broker가 다시 ISR에 합류했다는 뜻이다.
이 상태는 아래를 의미한다.
- 1번 Broker 프로세스가 다시 살아났다.
- leader가 가진 데이터를 1번 Broker가 다시 따라잡았다.
- 현재 1, 2, 3번 Broker가 모두 in-sync 상태다.
추가로 아까 장애가 났던 1번 Broker 주소로도 메시지 조회가 되는지 볼 수 있다.
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic email.send \
--from-beginning
test 메시지가 정상적으로 조회된다면, 복구된 Broker도 metadata와 replica 동기화 측면에서 다시 cluster에 합류했다고 해석할 수 있다.
정리
Kafka에서 leader partition이 있는 Broker에 장애가 나면, ISR 안에 있던 follower replica 중 하나가 새 leader로 승격될 수 있다.
핵심만 다시 정리하면 아래와 같다.
- 장애 전에는
Leader: 1,Isr: 1,2,3처럼 보일 수 있다. - 1번 Broker를 내리면
Leader: 2,Isr: 2,3처럼 바뀔 수 있다. - 살아 있는 Broker 주소로는 계속 메시지를 넣고 읽을 수 있다.
- 내려갔던 Broker가 복구되고 충분히 catch-up 되면
Isr: 1,2,3으로 다시 확장될 수 있다.
즉, Kafka 서버를 여러 대 운영하면 특정 Broker 장애가 전체 서비스 중단으로 바로 이어지지 않도록 완충할 수 있다.
출처
- Apache Kafka, “Introduction”, https://kafka.apache.org/082/getting-started/introduction/
- Apache Kafka, “Design - Replication and ISR”, https://kafka.apache.org/090/design/design/
- Apache Kafka, “Basic Kafka Operations - Graceful shutdown”, https://kafka.apache.org/41/operations/basic-kafka-operations/
- Apache Kafka, “Monitoring - ISR shrink and expand”, https://kafka.apache.org/082/operations/monitoring/
- Apache Kafka, “Documentation - Introduction”, https://kafka.apache.org/documentation/