4.3 로그(로그 세그먼트)
- 카프카 토픽에 들어오는 메시지는 세그먼트 파일에 저장된다.
- 메시지 뿐 아니라 메시지 키, 벨류, 오프셋, 메시지 크기 등 메타 정보가 함께 저장된다.
- 로그 세그먼트 파일을 브로커의 로컬 디스크에 보관된다.
- 로그 세그먼트 파일의 최대 크기는 1GB가 기본값이다.
- 1GB보다 커지면 기본적으로 롤링 전략을 적용해 기존 파일을 닫고 새 로그 세그먼트를 생성한다.
- 그럼에도 무한히 파일이 늘어나는 것에 대비해 삭제와 컴팩션 전략을 수립해 둘 필요가 있다.
4.3.1 로그 세그먼트 삭제
- 카프카 브로커는 기본 설정으로 로그 세그먼트 삭제 정책을 적용한다.
- server.properties에서 log.cleanup.policy가 delete로 명시되어야 한다. (기본값임)
- retention.ms
- 이 옵션의 값보다 보관 기간이 큰 로그 파일을 삭제할 수 있다.
- 카프카 기본 설정값을 7일이기에 7일 뒤면 모든 세그먼트 파일이 삭제된다.
- retention.byte
- 이 옵션의 값보다 큰 로그 세그먼트 파일을 삭제할 수 있다.
- 로그 세그먼트 삭제는 기본값으로 5분 주기로 수행된다.
4.3.2 로그 세그먼트 컴팩션
- 로그 컴팩션
- 로그를 삭제하지 않고 압축해서 보관하는 방식
- 로컬 디스크에 저장되어 있는 활성화된 세그먼트 외의 세그먼트를 대상으로 실행된다.
- 카프카에선 컴팩션 시 메시지의 키값 기준으로 마지막 데이터만 보관한다.
- __consumer_offset 토픽
- 카프카의 내부 토픽으로 컨슈머 그룹 정보를 저장한다.
- 정보란 즉 해당 그룹이 어디까지 읽었는지의 오프셋 커밋 정보다.
- 키(컨슈머 그룹명, 토픽명)와 벨류(오프셋 커밋) 형태로 메시지가 저장된다.
- 이 토픽에서 컴팩션이 일어나면 어떤 토픽에 대해 마지막으로 커밋된 오프셋 정보만 남게 된다. (과거 커밋 정보는 삭제되어도 무방)
- 즉 로그 컴팩션은 메시지 키값 기준 과거 정보는 중요하지 않고 마지막 값이 중요한 경우에 사용한다.
- ex) 현재의 구매 현황 상태를 보여주는 시스템에선 마지막 최종 상태만 사용자에게 노출하면 되기에 적합 (주문 완료 → 배송 준비 → 배송 중 → 배송 완료)
- 프로듀서가 카프카에 메시지를 전송할 때 컴팩션이 필요하다면 키와 벨류를 함께 보내면 된다.
- 벨류와 달리 키는 필숫값이 아니기에 필요하면 전송하면 된다.
- 로그 컴팩션의 장점
- 장애 복구 시 전체 로그가 아닌 메시지 키 기준 최신 상태만 복구하면 된다. (복구 시간 단축)
- 로그 컴팩션 작업 실행 중엔 브로커의 과도한 입출력 부하가 발생할 수 있으니 주의해야 한다.