코딩/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)

  1. 일정 시간 응답 없으면 → Consumer 1은 죽었다고 판단
  2. Kafka가 파티션 0을 → Consumer 2에게 자동 재할당
  3. 이제 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라는 애가 그룹을 감시하면서:

  1. 누가 그룹에 들어왔는지
  2. 누가 나갔는지 (죽었는지)
  3. 파티션을 어떻게 분배할지

이걸 자동으로 판단해서 동적으로 재조정(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 시켜줌