개발자 라이프/카프카
-
[KRaft 파헤치기] Raft 알고리즘 톺아보기개발자 라이프/카프카 2023. 2. 25. 12:19
들어가며 KIP-500을 통해 제안된 카프카의 주키퍼 독립 선언(?)에는 카프카의 메타데이터가 앞으로 Raft 알고리즘을 통해 관리될 것으로 나와있습니다. Raft 알고리즘은 쿠버네티스의 etcd에서 사용되는, 분산 합의 알고리즘인데요. 이번 글은 Raft 알고리즘이 어떤 방식으로 분산 환경에서 합의를 만드는지 살펴봅니다. Raft 알고리즘 톺아보기 분산 합의? 분산 시스템은 2개 이상의 컴퓨팅 노드에서 동일한 목적을 위해 구성된 시스템을 말합니다. 그렇기 때문에 분산 시스템의 모든 노드는 동일한 상태(State)를 가져야 합니다. 그리고 이렇게 동일한 상태를 가지는 것을 합의(Consensus;컨센서스)라고 합니다. 예를 들어, 카프카도 컨트롤러가 몇 번 브로커인지 혹은 어떤 토픽의 몇 번 파티션이 어..
-
레플리카의 상태와 세가지 궁금증개발자 라이프/카프카 2022. 10. 29. 13:44
들어가며 파티션의 레플리카는 그 상황에 따라 특정한 상태가 됩니다. 이번 글은 레플리카의 상태들에 대해 살펴봅니다. 나아가 3가지 궁금증에 대해 살펴보겠습니다. 레플리카의 상태 레플리카는 그 생애 주기에 따라 아래와 같이 7가지 상태를 가집니다. NewReplica : 컨트롤러가 파티션 재할당 과정에서 레플리카를 생성했을 때, 이 상태가 됩니다. 이 상태에선 팔로워 레플리카가 되라는 요청만 받을 수 있습니다. OnlineReplica : 할당된 레플리카(assign replicas)에 속하게 되면 이 상태가 됩니다. 이 상태에선 리더, 팔로워 레플리카가 되라는 요청을 받을 수 있습니다. OfflineReplica : 레플리카가 불능이면 이 상태가 됩니다. 일반적으로 레플리카가 속해있는 브로커가 종료되었을..
-
파티션 재할당(Reassignment) 로직 찍먹하기개발자 라이프/카프카 2022. 10. 24. 23:38
들어가며 이번엔 KafkaController 클래스에서 onPartitionReassignment 메서드 주석을 통해 파티션 재할당하는 로직을 알아봅니다. 대상 버전은 현재 가장 최신 버전인 3.3.0 버전입니다. 본문 중 Reassignment은 파티션 재할당 작업과 동일한 의미입니다. 파티션 재할당 로직 찍먹하기 onPartitionReassignment 메서드가 실행되는 시점 AlterPartitionReassignments API 가 호출되었을 때, Reassignment 정보를 저장하는 주키퍼 znode 경로에 znode가 생성되었을 때, 진행 중이던 reassignment 작업이 종료되었을 때, (파티션의 ISR znode 변경으로 감지됨) 진행 중이던 reassignment 작업의 대상 브로..
-
[카프카 프로토콜 이해하기] 1. 네트워크개발자 라이프/카프카 2021. 9. 12. 23:13
들어가며 카프카의 브로커는 중앙에서 수많은 클라이언트와 네트워크 요청/응답을 주고받습니다. 예를 들어, 프로듀싱/컨슈밍 할 파티션 찾기, 메시지 프로듀싱과 컨슈밍, 컨슈머 그룹 Join과 Sync 등이 있습니다. 그럼에도 불구하고 카프카는 매우 빠른 처리량으로 유명합니다. 이렇게 카프카의 브로커와 클라이언트가 빠른 네트워크 요청/응답을 주고받을 수 있는 것은 카프카의 요청/응답에 대한 네트워크 구성 방식 때문일 텐데요. 이번 글은 이러한 카프카의 네트워크 특징을 살펴봅니다. 참고로 이번 글은 카프카 프로토콜 공식문서의 Network 단락을 기반으로 합니다. 틀린 부분이 있다면 댓글 부탁드립니다. 네트워크 카프카의 네트워크는 아래와 같은 특징을 가집니다. Binary Protocol (바이너리 프로토콜) ..
-
[Spring Kafka] 컨슈밍과 관련된 구성 요소 살펴보기개발자 라이프/카프카 2021. 8. 1. 23:49
들어가며 스프링 카프카 프로젝트는 스프링 프레임워크 내에서 카프카를 더욱 손쉽게 사용할 수 있도록 지원하는 프로젝트입니다. 그래서 기존 카프카의 프로듀서, 컨슈머, 스트림 어플리케이션 구성을 스프링 프레임워크 내에서 간단하게 정의하고, 구현할 수 있도록 합니다. 이번 글은 스프링 카프카에서 컨슈밍과 관련된 구성 요소들을 간단히 살펴봅니다. 컨슈밍과 관련된 구성 요소 살펴보기 MessageListenerContainer Spring Kafka에선 MessageListenerContainer를 설정하여 컨슈머를 구성합니다. 그리고 실제 동작은 MessageListener 구현체를 MessageListenerContainer 설정에 제공하거나, 처리와 관련된 함수에 @KafkaListener 어노테이션을 붙여..
-
[Kafka] kafka api - LeaderAndIsr 에 관하여개발자 라이프/카프카 2021. 4. 23. 17:22
들어가며 카프카 클러스터의 브로커들 중에는 파티션 레플리카들의 리더와 팔로워 상태를 관리하는 컨트롤러 브로커가 있습니다. 컨트롤러 브로커는 브로커들의 partition reassign 등으로 리더-팔로워 상태가 변경된 경우, 변경된 상태를 클러스터의 브로커들에게 전달하여 적용할 수 있도록 합니다. 이번 글은 컨트롤러 브로커가 다른 브로커에 레플리카 정보를 전달하는 과정에 대해 알아봅니다. LeaderAndIsr 카프카는 브로커 간 통신에 관한 protocol과 api 스펙을 정의해서 사용합니다. 그중 파티션의 리더-팔로워 역할 정보와 ISR(In Sync Replicas) 정보를 통신하기 위해 LeaderAndIsr 스펙(api key)를 사용합니다. LeaderAndIsr Request LeaderAn..
-
[Kafka Connect] Confluent S3 Sink Connector 의 설정과 Heap memory개발자 라이프/카프카 2021. 4. 5. 18:24
들어가며 앞선 Confluent S3 Sink Connector는 왜 OOM에 취약한가?를 통해 Confluent S3 Sink Connector(이하 s3 커넥터)가 OOM에 취약한 이유에 대해 알아봤습니다. 그렇다면 s3 커넥터를 배포 함에 있어 OOM이 안나기 위해 어떤 설정들을 고려해야 하는지, 또 그 설정들에 따라 어떤 케이스가 발생할 수 있는지 이번 글을 통해 알아봅니다. S3 Sink Connector 가 메모리를 점유하는 흐름 S3 커넥터가 어떤 설정을 통해 Heap memory가 결정되는지 알아보기 전에, 먼저 S3 커넥터가 주로 Heap memory를 점유하는 흐름을 알아봅니다. 위 그림은 하나의 S3SinkTask가 특정 Topic에서 레코드를 컨슘 한 뒤 S3로 적재하는 과정을 나타..
-
[Kafka 운영] 컨슈머 그룹 정보는 언제 사라질까?개발자 라이프/카프카 2021. 3. 29. 01:21
들어가며 카프카를 운영하다 보면 다양한 컨슈머가 붙었다(active) 떨어지곤(inactive) 합니다. 특히, 운영 과정에서 자주 사용하는 콘솔 컨슈머의 경우, 사용할 때마다 새로운 컨슈머 그룹 정보를 생성하게 됩니다. 그런데 운영하다 보면 어느샌가 이전에 사용했던 컨슈머 그룹 정보가 남아있지 않다는 것을 볼 수 있습니다. 그렇다면 카프카는 컨슈머 그룹 정보를 언제 청소(clean up)하게 될까요? 이번 글은 로그 정보를 이용하여 컨슈머 그룹 정보가 언제 어떤 설정과 연관되어 사라지는지 알아봅니다. __consumer_offsets를 찍어보자 각 컨슈머 그룹은 컨슈밍 하는 토픽 파티션에 대하여 어디까지 컨슈밍 했는지를 __consumer_offsets 토픽에 저장합니다. 그렇다면 컨슈머 그룹은 이 토..