작성
·
46
0
안녕하세요, 좋은 강의를 통해 카프카에 대해 학습하고 있어 우선 감사 인사 드립니다.
kafka retention을 시간 단위로 설정한 경우 액티브 세그먼트가 아닌 세그먼트에 대해 생성일 기준으로 설정한 시간이 지났을 때 삭제된다고 설명해주셨는데, retention이 레코드 단위가 아닌 세그먼트 단위로 발생하다보니 세그먼트의 마지막 레코드의 경우 특정 상황에서 저장되자마자 삭제되는 상황도 발생할 수 있을 것 같은데 맞는지 궁금합니다.
위의 케이스가 발생할 수 있는 케이스라면 해당 상황에서 장애가 발생하였을 때 메시지를 확인하지 못하는 문제가 있을 것 같아요. 이럴 때는 어떻게 대처할 수 있을까요?
추가로 레코드 단위로 retention을 처리할 수 있는 방법도 있을까요?
답변 2
0
안녕하세요!
문의주신 내용 답변드립니다.
세그먼트의 마지막 레코드가 전송된 이후, 말씀하신 바와 같이 저장되지 마자 삭제되는 상황이 발생할 가능성은 적습니다. 왜냐면, 액티브 세그먼트가 아닌 세그먼트로 변경된 시점을 기준으로 retention.ms가 지나면 삭제되기 때문입니다.
retention.ms가 극도로 작다면 말씀하신바와 같이 적재와 함께 삭제될 수 있지만, 일반적으로 24hour 이상으로 설정되는 이상 적재와 함께 삭제되지는 않습니다. 그리고 말씀하신바와 같이 장애가 발생했을 때 메시지를 확인하고 싶은 니즈가 있다면 retention.ms를 충분히 길게 설정하시는 것을 추천드립니다.
추가로 레코드 단위로 retention은 일반적인 스트림 상황에서 적용할 수 없습니다. kafka-streams에서 materialized view로 활용할 경우에만 key에 null을 넣는 경우도 있지만, 특수하게 사용하는 부분입니다.
0
안녕하세요, 인프런 AI 인턴입니다.
clllickme님, 카프카의 retention
설정에 대해 질문 주셨군요. 카프카의 retention
설정은 주로 세그먼트 단위로 관리됩니다. 따라서, 전체 삭제 정책은 세그먼트 단위로 이루어지기 때문에 세그먼트의 생성 시점 기준으로 시간이 지난 경우 해당 세그먼트 전체가 삭제됩니다. 이로 인해 세그먼트의 마지막에 추가된 레코드가 저장된 지 얼마 되지 않았더라도 세그먼트 전체가 삭제될 수 있습니다.
이러한 상황에서 데이터 손실 없이 메시지를 수신하기 위해 일반적으로 사용하는 방법 중 하나는 카프카의 Replication 기능을 통해 데이터를 중복 저장하여 장애 시에도 데이터가 안전하게 유지되도록 하는 것입니다. 또한, 컨슈머 그룹을 관리하여 메시지가 적절히 처리되었는지 확인하거나, 데이터 손실 방지 정책을 명확히 세우는 등의 방법도 활용할 수 있습니다.
레코드 단위로 retention
을 관리하는 것은 카프카의 기본적인 구조에서는 지원되기 어렵습니다. 그러나 로그 컴팩션(Log Compaction)을 통해 키 기준으로 오래된 레코드를 삭제하는 방법을 활용할 수 있지만, 이는 모든 메시지를 보존하는 것이 아닌 키를 기준으로 특정 조건에 맞는 메시지를 보존하는 방식이므로 사용하는데 주의를 기울여야 합니다.
다음 항목들을 통해 관련 정보를 더욱 자세히 확인하실 수 있습니다:
1. 카프카의 다중테넌시와 로그 삭제 설정
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.