코딩/sparta TIL
Kafka : failover(장애 전환)
americanoallday
2025. 6. 26. 16:57
✅ Failover란?
서버나 Consumer가 죽었을 때, 다른 애가 자동으로 대신 맡아서 처리하는 것
즉,
“A 서버가 메시지 읽다가 뻗었어. 그럼 Kafka는 자동으로 ‘그 파티션’을 B 서버한테 넘겨줌” → 이게 **failover (장애 전환)**이야.
💥 예시 상황
🔸 Consumer Group:
chat-group
Kafka Topic: chat-messages (2개의 파티션)
Consumer Group: chat-group
├── Consumer 1 → 파티션 0
└── Consumer 2 → 파티션 1
👉 이 상태에서 Consumer 1이 죽었다! 😵
🔄 Kafka의 자동 failover 동작
Kafka는 주기적으로 heartbeat 체크를 함
(“야 너 아직 살아 있어?” 같은 ping)
- 일정 시간 응답 없으면 → Consumer 1은 죽었다고 판단
- Kafka가 파티션 0을 → Consumer 2에게 자동 재할당
- 이제 Consumer 2가 파티션 0과 1 둘 다 읽음 (혼자서 두 역할)
Consumer Group: chat-group
└── Consumer 2 → 파티션 0, 1 전담
✔️ 메시지 유실 없이 서비스 지속됨
✔️ 새로운 Consumer가 추가되면 → Kafka가 다시 자동 분배
✅ 왜 이게 중요한가?
이유 | 설명 |
장애 복구 | 서버가 죽어도 메시지 처리가 끊기지 않음 |
무중단 운영 | 사용자 입장에서 서비스가 계속 살아 있음 |
자동화 | 사람이 개입하지 않아도 Kafka가 자동으로 재할당 |
확장성 | Consumer 수가 늘거나 줄어도 자동 분배 가능 |
Failover = Consumer가 죽었을 때 Kafka가 파티션을 자동으로 다른 Consumer에 넘겨주는 구조
이건 Kafka가 Consumer Group 기반으로 관리하기 때문에 가능.
🙌 완전히 자동. 따로 코드로 짤 필요 없음.
Kafka는 Consumer Group + Kafka Client 라이브러리만 잘 써주면 서버가 죽든, 새로 들어오든 전부 자동으로 처리.
✅ 왜 자동이냐?
Kafka는 Consumer Group Coordinator라는 애가 그룹을 감시하면서:
- 누가 그룹에 들어왔는지
- 누가 나갔는지 (죽었는지)
- 파티션을 어떻게 분배할지
이걸 자동으로 판단해서 동적으로 재조정(rebalance).
🔄 자동 동작 흐름 (실제 상황)
🟢 정상 상태
Topic: chat-messages (2 partitions)
Group: chat-group
Consumer 1 → Partition 0
Consumer 2 → Partition 1
🔴 Consumer 1 죽음 → Kafka가 자동 감지 (heartbeat 응답 없음)
🔁 자동 재할당
Consumer 2 → Partition 0, 1 모두 맡음 (failover 완료)
✅ 네가 해야 할 건 뭐냐?
딱 하나만 하면 됨:
@KafkaListener(topics = "chat-messages", groupId = "chat-group")
public void listen(String message) {
System.out.println("받은 메시지: " + message);
}
이렇게 groupId만 설정하면,
- Kafka가 이 Consumer를 같은 그룹으로 인식하고
- 파티션을 자동 분배하고
- 죽은 Consumer 생기면 자동 failover 시켜줌