Kafka 46

Kafka Connect 구성요소

목차 [용어 정리] Connect: Connect가 공식명칭으로 카프카로 데이터를 전달하고 읽어오는 스트림 프레임워크를 지칭한다. connect는 connector(task) + transform + converter 형태로 구현된다. Connector: 데이터 스트리밍을 위한 상위 레벨의 추상화. 어디서 어디로 데이터를 내보내는가에 대한 정의 Worker: Connector와 Task가 실행되는 프로세스 Task: 실제로 외부 시스템에 데이터를 전달하기 위한 구현체 Converter: 데이터들을 Connector에서 변환하기 위해 사용하는 것. (Ex: Object → ByteArray) Transform: 각각의 메시지를 요구사항에 맞게 변환하는 단순 로직 Dead Letter Queue: Conne..

Kafka/Connect 2023.04.22

Performance Management

목차 [Client] Producer compression.type: lz4, zstd, gzip 등 제공. 헤더에 압축관련 정보를 함께 실어 전송하게 됨. Latency 최소화를 위한 Default Value batch.size: 16KB linger.ms: 0 buffer size: 32MB Throughput을 늘리고 싶을 때 고려할 만한 옵션 batch.size: 1000KB linger.ms: 100 buffer size: batch size * partition수 보다 크게 설정 Client 성능지표 io-wait-ratio: 이 값이 높다면 브로커에 문제가 있다고 판단 io-ratio: io가 많이 발생한다는 뜻 Producer: 메시지를 보내는 시간이 길다. -> batch size를 늘리..

Kafka 2023.04.16

Broker 내부 구조

Socker Receive Buffer: 네트워크 스레드로 가기전 머무는 버퍼. OS수준에서 제공 Network Thread: 네트워크 관련 처리를 하는 스레드 Request Queue: 네트워크 스레드의 요청이 저장되며 기본적으로 500개의 메시지가 저장된다 I/O Thread: 실제 메시지 처리 스레드. 실제 디스크에 쓰는것이 아니고 Page Cache에 쓴다. Purgatory Area: Page Cache에 쓴 후 잠시 대기하는 곳. 복제가 될 때 까지 대기한다. Response Queue: 처리가 된 메시지들이 머무는 곳. 네트워크 스레드를 거져 Socker Send Buffer로 결과값을 돌려주게 된다. 성능개선 포인트 Socker Buffer Size: 배치 사이즈를 고려하여 튜닝 Threa..

Kafka/Broker 2023.04.16

Log Compaction

목차 [Topic - cleanup.policy] Kafka는 데이터 리텐션 정책이 2가지 있다. Delete: retention.ms를 지나거나 retention.bytes를 초과하는 경우 오래된 세그먼트를 삭제한다. Compact: Key별로 가장 최근의 value값만 남겨두고 저장한다. [Log Compaction?] Log compaction ensures that Kafka will always retain at least the last known value for each message key within the log of data for a single topic partition.It addresses use cases and scenarios such as restoring state..

Kafka/Producer 2023.03.05

BuiltIn Partitioner

HTML 삽입 미리보기할 수 없는 소스 [BuiltIn Partitioner?] 문제 제기 : https://issues.apache.org/jira/browse/KAFKA-10888?focusedCommentId=17285383&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-17285383 업데이트 patch : https://cwiki.apache.org/confluence/display/KAFKA/KIP-794%3A+Strictly+Uniform+Sticky+Partitioner Apache Kafka 3.3 버전에 추가된 것으로 기존 StickyPartitioner를 사용할 때 Broker Networ..

Kafka/Producer 2023.03.05

Kafka Producer Basic Architecture

목차 [기본 동작 방식] [Producer 컴포넌트] PDF파일 (출처: 본인) Overview Record Accumulator Sender Thread [컴포넌트별 상세설명] Serializer 레코드로부터 전달된 Key, Value가 지정된 serializer에 의해 변환된다. Partitoner partitioner에 의해 어떤 파티션으로 보내질 지 결정된다. Key값이 있는 경우 Key의 Hash 값을 이용해서 파티션을 할당한다. Key값이 없는 경우 Stickey 방식으로 할당된다. Compression 전송하려는 레코드를 압축할 수 있다. 레코드는 배치에 채워진 후 그 배치가 압축되어 RecordAccumulator에 저장된다고 한다. Compression.type gzip snappy lz..

Kafka/Producer 2023.03.03

Kafka Simple Consumer

목차 [Simple Consumer?] offset과 같은 세부적인 부분을 직접 다루고 싶은 요구가 있는 경우 Consumer 관련항목을 직접 제어하기 위해 사용. 이름은 Simple 이지만 실제로는 전혀 Simple하지 않음 Consumer-Group이라는 개념이 Simple Consumer에서는 없다. [Simple Consumer를 사용하는 이유] SimpleConsumer 구현을 사용하는 주된 이유는 Consumer-group이 제공하는 것보다 파티션 소비를 더 잘 제어하기를 원하기 때문. 예: 메시지를 여러 번 읽기 토픽의 일부 파티션만 사용하도록 제어 메시지가 한 번만 처리되도록 트랜잭션을 관리합니다. [Simple Consumer의 단점] SimpleConsumer는 Consumer Grou..

Kafka/Consumer 2023.03.03

Consumer Assignment Strategies

목차 [Range] Consumer를 브로커가 할당한 member_id 를 사용하여 사전순으로 배치하고, 이를 파티션 숫자 순서대로 할당. ex) consumer 3개가 있고, 2개 토픽이 각각 파티션 2개,2개를 갖고 있다면 아래처럼 할당된다. Consumer Assigned Topic Partitions C0 T0P0, T1P0 C1 T0P1, T1P1 C2 유휴 만약 토픽별로 파티션 개수의 편차가 크다면 뒤에 있는 Consumer들은 유휴상태로 남아있는다. [Round-Robin] 참조: https://kafka.apache.org/24/javadoc/org/apache/kafka/clients/consumer/RoundRobinAssignor.html#:~:text=The%20round%20rob..

Kafka/Consumer 2023.02.04

Auto Commit 사용시 메시지 유실 테스트

목차 [목표] Auto-Commit을 할 때 방금 가져온 메시지 오프셋을 커밋하는지 마지막에 처리한 오프셋을 커밋하는지 확인. Consumer에서 Auto-Commit 을 사용할 때 메시지 유실 가능성이 있는지 확인. [메시지 유실될 가능성?] 구글링을 해보면 아래같은 케이스에서 메시지 유실 가능성이 있다고 한다. 이러한 상황이 발생하려면 auto commit을 켰을 때 방금 읽어온 메시지 오프셋을 커밋해야 한다. [테스트 환경] Java - zulu JDK11 Apache Kafka Client - 2.8.1 Spring Kafka - 2.6.13 [테스트 방법] Consumer Properties enable.auto.commit = true max.poll.records = 10 auto.commi..

Kafka/Consumer 2023.02.04

Kafka Fundamental Hands On

목차 [Phase 1 : 기본 커맨드 (토픽 생성, 수정, 삭제, Producer, Consumer 구동하기)] # 토픽 리스트 조회 $ sudo kafka-topics --bootstrap-server localhost:9092 --list # 토픽 생성 $ sudo kafka-topics --create --bootstrap-server localhost:9092 --topic hands-on-jaeshim --partitions 5 --replication-factor 4 --config min.insync.replicas=2 Created topic hands-on-jaeshim. # 토픽 확인 $ sudo kafka-topics --describe --bootstrap-server localho..

Kafka 2023.02.04

StickyPartitioner를 사용할 때 메시지가 골고루 배분되지 못하는 현상

[Overview] Apache Kafka Client 2.4 ~ 3.2 버전에서는 크게 3가지의 파티셔너가 제공된다. - RoundRobin (Key 해싱 X) - Sticky (Key 해싱 X) - Default (Sticky + Key 기반 해싱 보장) StickyPartitioner: https://jaemni.tistory.com/entry/Sticky-Partitioner 이 때 Sticky 파티셔너를 사용했을 때 특정 파티션에 메시지가 몰리는 현상이 있다고 한다. 이에 대해 확인해보고, 직접 재현해본 내용을 다룸. (이 문제로 인해 Apache Kafka 3.3 버전에서는 기존 파티셔너들이 Deprecated되고, BuiltInPartitioner가 신규로 등장하였다) [이슈] 문제 제기: ..

Kafka 2023.01.04

Kafka Topic Naming Convention에 대해..

카프카에서의 화두 중 하나는 카프카 토픽의 이름을 어떻게 짓는것이냐이다. 보통 많은 회사들이 기존의 토픽명의 관습에 따라 많이 짓는다고 한다. 아래와 같은 네이밍 규칙이 권장된다. .. -- ... 그리고 chris riccomini는 아래와 같은 네이밍 규칙을 사용하기도 했다고 한다. .. [카프카에서 유효한 토픽명] 카프카에서는 '_', '-', '.' 이며 아래 정규식이 카프카에서 사용할 수 있는 토픽명이다. 하지만 '_','-' 등을 혼용해서 사용할 경우 충돌이 날 수 있기 때문에 혼용하지 않도록 해야한다. legalChars = "[a-zA-Z0-9\\._\\-]" 또한 토픽명은 대소문자를 구분한다. [카프카에서 토픽명을 정할 때 몇가지 지침들] 토픽명의 포맷을 정해라 가장 중요한 것은 포맷을 ..

Kafka 2022.12.13

Apache Kafka Client 2.4 이상 버전의 RoundRobin Partitioner에서 메시지가 골고루 분배되지 못하는 현상

[문제점] Apache Kafka Client 2.4 버전이상에서 RoundRobin Partitioner를 사용할 경우 partition 메소드가 두 번 호출되면서 메시지가 파티션에 골고루 분배되지 못하는 현상이 있다. [버그 재현: 메시지 4개를 생성하기] //RR 파티셔너 사용 props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, RoundRobinPartitioner.class); ... KafkaTemplate kafkaTemplate = new KafkaTemplate(new DefaultKafkaProducerFactory(props)); ObjectMapper obj = new ObjectMapper(); //forloop를 통해 메시지 4개를 생성 f..

Kafka/Producer 2022.12.03

Sticky Partitioner

[개요] Apache Kafka 2.4 버전 이후부터 사용가능한 파티셔너이다. 기존에는 RR방식으로 동작했는데, 이 방식에 대한 단점이 있어 이를 보완한 방법 [파티셔닝?] Kafka의 메시지는 key/value 의 형태로 구성된다. 이 때 key값이 있을 수도 있고, null값으로 존재할 수도 있다. 그리고 producer는 batch.size, linger.ms 옵션을 통해 메시지를 바로 보내지 않고 배치에 일정기간 저장했다가 보내는 특성을 가진다. Key값이 있는 경우 modular 연산을 통해 어떤 파티션에 메시지가 적재될지 결정한다. Key값이 없는 경우 기존에는 RR 방식을 사용하여 메시지를 파티션에 배분했다. 아래 그림은 1~9 까지의 메시지를 생성했을 때 RR정책에 의해 파티셔닝 된 모습 ..

Kafka/Producer 2022.12.03

Kafka Local One Node로 구성하기

로컬 머신에 Confluent Platform들을 구동하려고 한다. Kafka, Zookeeper.. Control-center까지 로컬머신에서 구동하기 위한 환경을 갖춰보는 것. [필요한 것] confluent-CLI confluent-platform (tar로 다운받아서 압축풀어서 사용하기) [순서] Confluent-CLI 설치 #confluent-cli 조회 $ curl -sL --http1.1 https://cnfl.io/cli | sh -s -- -l 0.100.0 0.101.0 0.102.0 0.103.0 0.104.0 0.105.0 0.106.0 ... 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 latest #현재 클러스터에 맞는 버전을 확인해서 설치하라고 하는데,위 링크보고 버..

Kafka Performance Tuning

퍼포먼스에 대해서 상세히 설명해주고 있음. (각 수치에 대한 설명과 내부적인 구조를 잘 알려주고 있다) https://www.slideshare.net/JiangjieQin/producer-performance-tuning-for-apache-kafka-63147600 Producer Performance Tuning for Apache Kafka Kafka is well known for high throughput ingestion. However, to get the best latency characteristics without compromising on throughput and durability, we need … www.slideshare.net

Kafka 2022.11.02

Data Mount 경로가 여러 개 일때 용량많은 파티션 이동 시키기

고승범님 자료에 매우 잘나와있어 참조 https://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-tip/ Kafka 운영자가 말하는 TIP | Popit kafka에서는 각 broker의 리소스를 최대한 활용하기 위해 각 토픽들을 균등하게 broker들에게 분산하도록 설계되어 있습니다. 그래서 각 파티션들은 broker들에게 비교적 균등하게 분산되어 있습니다. www.popit.kr

Kafka/Broker 2022.11.02

Zookeeper 구성에 관한 팁

[zookeeper 홀수개를 권장하는 이유] 클러스터를 구성할 때 적절한 노드 수: (n/2+1) → 5개의 노드로 zookeeper quorum을 구성하고자 한다면, (5/2+1) = 3개의 노드가 quorum으로 구성되어야 한다. 아래가 예제 만약 quorum 크기가 2라고 가정한 상태에서.. 두 DC간 단절상황인 Split Brain이 발생한다면 각 DC에서는 각자 자신들이 Primary라고 인식하게 되서 중복으로 서비스가 실행되게된다. 이후에 장애가 복구되었을 때 정상적인 운영이 불가해지는 상태에 빠질 수 있다고 한다. 즉 Split Brain을 방지하기 위해 (n/2+1) = 3개를 quorum으로 구성할 필요가 있다. 참조: https://paulsmooth.tistory.com/156 [zo..

Kafka 2022.11.02

Schema-Registry Compatibility

목차 [Compatibility] 호환성은 Schema Evolution이 발생할 때 어떻게 변화할 수 있는가에 대한 것이다. 기본적으로 3가지 전략이 있다. Backward Forward Full Backward Compatibility Consumer V2가 V1을 문제없이 처리가능한 호환성. Consumer 업데이트 → Producer 업데이트 순서로 배포해야한다. 필드추가 (기본값이 있을 때 가능) Consumer가 V2일 때 V1을 처리할 수 있다. #V1 { "Name": "String", "Age": "Int" } #V2 { "Name": "String", "Age": "Int", "Sex": "Char" (Default: M) } 필드 삭제 가능. Consumer가 V2일 때 V1을 문제없..