Kafka 프로듀서가 메시지를 브로커에 전송할 때, 데이터가 얼마나 안전하게 저장되는지는 acks 설정에 따라 크게 달라진다.
acks 설정의 종류와 특징
acks=0: 확인 응답 없음

프로듀서가 메시지를 전송한 후 브로커의 응답을 기다리지 않고 즉시 성공으로 간주한다.
특징:
- 브로커가 메시지를 실제로 받았는지 확인하지 않음
- 네트워크 오버헤드가 최소화되어 가장 높은 처리량 제공
- 브로커가 다운되거나 예외가 발생하면 데이터 손실 발생
적합한 사용 사례:
- 일부 데이터가 손실되어도 괜찮은 메트릭 수집
- 처리량이 데이터 안전성보다 중요한 경우
acks=1: 리더 확인

프로듀서가 메시지를 전송한 후 리더 브로커가 메시지를 받았다는 확인을 받으면 성공으로 간주한다.
특징:
- Kafka 1.0~2.8 버전까지의 기본값
- 리더 브로커만 메시지를 저장했는지 확인
- 레플리카에 복제되기 전에 리더가 실패하면 데이터 손실 가능성 존재
- acks=0보다 안전하지만 여전히 데이터 손실 위험 있음
적합한 사용 사례:
- 데이터 안전성과 처리량 사이의 균형이 필요한 경우
acks=all (또는 acks=-1): 모든 레플리카 확인

프로듀서가 메시지를 전송한 후 리더와 모든 동기화된 레플리카(ISR)가 메시지를 받았다는 확인을 받으면 성공으로 간주한다.
특징:
- Kafka 3.0 이상 버전의 기본값
- 가장 높은 데이터 안전성 제공
- 모든 동기화된 레플리카가 메시지를 저장했는지 확인
- 처리량은 다소 감소할 수 있지만, 비동기 프로듀서와 적절한 설정으로 성능 최적화 가능
적합한 사용 사례:
- 금융 거래, 중요한 이벤트 로그 등 데이터 손실이 허용되지 않는 경우
min.insync.replicas 설정의 중요성
min.insync.replicas는 브로커 또는 토픽 레벨에서 설정할 수 있는 값으로, acks=all 설정과 함께 사용될 때 특히 중요하다.
min.insync.replicas=1 (기본값)
- 리더 브로커만 살아있어도 쓰기 작업 가능
- 데이터 안전성 보장이 약함
min.insync.replicas=2 (권장값)
- 리더와 최소 1개의 레플리카가 동기화되어야 쓰기 작업 가능
- 복제 계수(replication factor)가 3일 때 최대 1개의 브로커 장애를 허용
- 데이터 안전성과 가용성의 좋은 균형점
min.insync.replicas=3
- 모든 레플리카가 동기화되어야 쓰기 작업 가능
- 브로커 장애를 허용하지 않음 (실용적이지 않음)
최적의 설정 조합
데이터 안전성과 가용성을 모두 고려한 가장 권장되는 설정 조합은 다음과 같다:
acks=all
replication.factor=3
min.insync.replicas=2
이 조합은 다음과 같은 이점을 제공한다:
- 최대 1개의 브로커 장애를 허용하면서도 데이터 안전성 보장
- 데이터 지속성과 가용성의 균형 유지
- 브로커 장애 시에도 안정적인 운영 가능
토픽 가용성과 브로커 장애 허용
복제 계수가 N이고 min.insync.replicas가 M일 때, 토픽은 최대 N-M개의 브로커 장애를 허용할 수 있다. 이는 쓰기 작업의 가용성을 의미하며, 읽기 작업은 이와 별개로 계속 가능하다.
예를 들어:
- 복제 계수 3, min.insync.replicas=1: 최대 2개 브로커 장애 허용
- 복제 계수 3, min.insync.replicas=2: 최대 1개 브로커 장애 허용
- 복제 계수 3, min.insync.replicas=3: 브로커 장애 허용 불가
결론
Kafka 3.0부터 acks=all이 기본값으로 설정된 것은 데이터 안전성을 중요시하는 현대 시스템의 요구를 반영한다. 특히 enable.idempotence=true와 함께 사용하면 멱등성 있는 프로듀서를 구성할 수 있어, 중복 없이 정확히 한 번의 메시지 전송을 보장할 수 있다.
데이터의 중요도와 시스템의 요구사항에 따라 적절한 acks 설정을 선택하되, 중요한 데이터를 다룰 때는 acks=all, min.insync.replicas=2, replication.factor=3의 조합을 권장한다. 이 설정은 데이터 안전성과 시스템 가용성 사이의 최적의 균형점을 제공한다.