작성
·
610
0
KTable이 로컬 기반의 rocksDB에 기록된 데이터를 가져다 쓴다는 설명을 듣고 궁금증이 생깁니다.
카프카 스트림을 docker기반 컨테이너로 배포한다 치면 그때마다 rocksDB는 초기화 될 것으로 생각되는데요..
그렇다면 조인시에 데이터가 없어서 의도한 동작이 이루어지지 않을 수 있겠다는 생각이 드는데 맞는지요?
마찬가지로 windowing 프로세스도 집계중에 컨테이너가 갈아쳐지면 집계중이던 데이터는 소실될 수 있어보이는데 맞는지 모르겠습니다.
실무에서는 보통 카프카 스트림즈를 어떻게 쓰는지가 궁금합니다. rocksDB를 따로 두어서 모든 스트림이 공유하도록 설정하거나 컨테이너 배포는 사용하지 않는지.. 아니면 EC2같은곳에 배포해서 로컬 DB데이터를 훼손시키지 않도록 하는지 같은것이요.
감사합니다.
답변 2
2
카프카 스트림즈의 KTable의 경우 토픽의 모든 데이터를 Materiazlied View로 만들어서 사용됩니다. 그렇기 때문에 카프카 스트림즈를 기동할 때 local에 저장된 rocksDB가 존재하지 않을 경우 해당 토픽의 전체 레코드를 가져와서 새로 View를 만들게 됩니다. 그렇기 때문에 스트림즈를 사용할 때 항상 rocksDB의 상태가 stateful하게 있어야만 하는 것은 아닙니다.
반면, 말씀하신바와 같이 window 프로세싱에서 중간집계 결과가 유실되면 데이터 처리에 이슈가 발생할 가능성이 있는데 이런 경우에는 보통 k8s에서 statefulSet + pvc storage 같이 상태를 보존하고 애플리케이션을 운영할 수 있는 도구를 함께 사용하기도 합니다.
1
안녕하세요, 인프런 AI 인턴입니다.
김대호님, 카프카 스트림즈의 KTable과 관련한 질문에 답변 드리겠습니다.
Kafka Streams의 KTable은 실제로 로컬 상태 저장소, 예를 들어 RocksDB와 같은 내장 데이터베이스를 사용하여 상태를 유지합니다. 컨테이너 환경에서 Kafka Streams를 운영할 경우에는 볼륨(Volume)을 사용하여 로컬 저장소의 내용을 영속화할 수 있습니다. 이는 컨테이너가 재시작되거나 재배포될 때 RocksDB에서의 데이터를 유지하기 위한 일반적인 방법 중 하나입니다.
Kafka Streams 애플리케이션의 상태는 일반적으로 ‘state.dir’ 구성 옵션을 통해 관리되며, 컨테이너가 재시작될 경우 이를 마운트하여 이전 상태를 복원할 수 있습니다. 따라서, 올바른 볼륨 구성을 통해 조인이나 윈도잉 등의 작업 시 필요한 상태 데이터를 유실 없이 관리할 수 있습니다.
실무에서 Kafka Streams를 사용할 때는 데이터 유실 방지를 위해 주의 깊은 볼륨 및 데이터 관리 전략이 필요합니다. 또한, 스트림즈 애플리케이션을 여러 인스턴스로 구성하여 병렬 처리를 하면서도 각 인스턴스의 상태를 동기화할 수 있도록 설계하는 것이 중요합니다.
RocksDB 외에도 상태 저장에 다른 옵션을 사용할 수 있으며, 이는 경우에 따라 조정될 수 있습니다. EC2와 같은 VM을 사용할 때도 상태 저장소의 무결성을 보장하기 위한 방법을 적용할 수 있습니다.
자세한 내용은 카프카 스트림즈 문서의 Kafka Streams 섹션을 참고하시는 것을 추천드립니다.
도움이 되셨기를 바랍니다.