Pasted image 20230920011955.png

Kafka?

Pub-Sub 구조의 메시지 큐 Framework

3개의 큰 요소로 구성

  1. Brocker
  2. Producer
  3. Consuker

Kafka는 Disk에 적재된다

  • Disk는 Non-Flash 이기 때문에 영속성을 보장한다.
    • 문제 발생 시 Rewind(재사용) 이 가능하다
  • 사용자가 지정한 기간 동안 데이터를 보관하기 때문에 실시간 / 배치성 모두 지원한다
  • HA / 분산처리를 지원하기 때문에 Scale-Out에 용이하다.
  • Kakfa는 Sequential Scan/write를 기반으로 처리한다
    • 즉, Random Access를 기반으로 처리하지 않기 때문에 SSD보다는 HDD를 권장한다.
    • SSD와 HDD의 1:1비교는 SSD가 성능이 좋을 수 있지만, HDD를 RAID 구성하여 사용한다면 좋은 성능을 야기할 수 있다.
      • 2023-09-20기준 1TB의 SSD의 및 4TB의 HDD의 가격이 동일함
      • 1개만 mount 시키는 것이 아닌 여러개를 mount시킨다면, HDD를 이용하는 것이 더 많은 용양을 확보하고, RAID구성시 성능 또한 보장할 수 있다.
        • Confulent 를 확인하면 상세 정보를 볼 수 있다.
        • 이분의 지금은 운영안 하시는 것 같지만 벤치마크를 잘 정리하신 것이 있어 링크를 걸어둔다.
        • kakao Tech 이것도 보면 설명 잘해주신다.
  • 고성능 데이터 파이프라인, 스트리밍 분석, 데이터 통합 ​​및 미션 크리티컬 애플리케이션을 위해 사용하는 오픈 소스 분산 이벤트 스트리밍 플랫폼
    • 미션 크리티컬 애플리케이션 : 사소한 실수에도 민감한 어플리케이션
  • 고성능 TCP 네트워크 프로토콜을 통해 통신하는 서버 와 클라이언트로 구성된 분산 시스템
  • 높은 처리량, 확장 가능, 영구 저장, 고가용성
  • 사례
    • 메시징, 웹사이트 활동 추적, 측정 항목, 로그 집계, 스트림 처리, 이벤트 소싱, 커밋 로그

요소

Producer

Kafka에 Publish하는 Application으로써 Kafka의 Topic에 메시지를 생성 후 Brokcer에게 전달.

  • 여러 종류의 Producer가 존재한다
    • REST, SparkStream…

Brocker

  • Producer가 Publish한 Topic별 Message를 해당 Topic에 적재
  • Load Balancing / HA를 위해 Cluster를 이루어 동작
    • Failover을 위해 Quorum으로 구성해야한다.
      • Quorum : 홀수로 구성하는 것
  • Kafka Server라고 생각하면 된다.

Consummer

  • Topic에 있는 데이터를 Pull하여 데이터 수집
    • Brocker이 직접 데이터를 제공하는 것이 아닌, 주소 값을 받아 해당 주소에 있는 데이터를 접근하여 가져간다.

Topic

  • Producer가 Brocker에게 전달한 Message를 적재하고 Consumer가 Message를 Pull하는 데이터 저장소
    • 다르긴 하지만, RDB의 Table개념이라고 생각하면된다.
  • Topic은 1+N개의 Partition으로 구성되어 있다.

Partition

  • Topic당 분산되어 적재되는 저장소
    • Partition 개수만큼 분산 처리할 수 있다.
      • Partition 개수만큼 ConsumerConnection을 맺을 수 있다.
    • 분산 처리 하는 만큼 성능 향상을 야기할 수 있다.
      • 너무 많아지면 File Handler 개수 증가, Failover 시간이 증가할 수 있다.
        • File Handler 개수 증가 : 메모리 낭비 야기
        • Failover 시간이 증가 : 말 그대로 장애 복구 시간이 늘어 서버 장애 발생 시 복구 시간이 늘어난다.
          • e.g partition 1개당 1ms가 걸림. 10000개 partition존재 1ms * 10000 : 10초 소요
      • 제한
        • broker당 최대 4000개의 파티션(총계, 여러 topic에 분산)
        • Kafka 클러스터당 최대 200,000개의 파티션(총계, 여러 topic에 분산)
      • 적절한 topic의 partition 개수는?
        • topic에 파티션이 있는 만큼의 소비자를 가질 수 있습니다.
        • 소비자의 배수 : 이를 통해 소비자 그룹의 소비자 간에 파티션을 균등하게 배포
        • 브로커의 배수 : 이 방법을 사용하면 파티션(및 리더!)을 모든 브로커에 균등하게 배포
      • 간단 Partition 수 공식
        • Throughput 기준 : Max(Np, Nc)
          • Np : 시스템 처리량 / partition당 producer 처리량
          • Nc : 시스템 처리량 / partition당 client 처리량
        • Latency 기준
          • 100 * Broker 수 * Replication Factor 수
  • N개의 Replica를 생성하여 데이터 안정성을 유지한다.
    • Replica가 3개 상단의 그림처럼 복제본을 서로 나눠 갖게 된다.
    • Replica를 생성하면 Leader / Follwer로 구성된다.
      • Leader : 데이터 처리를 하는 역할
      • Follwer : Leader를 복제하여 Failover 대비
      • ISR(in-Sync replication)
        • Producer의 옵션 중 Acks가 all일 때 무결성을 위해 복제 여부를 검증하는 Replication
        • Follwer중 ISR로 설정 된 Replica만 Leader가 될 자격을 갖는다
        • replica.lag.time.max.ms 로 설정한 주기마다 데이터 검증하고, 이상 감지시 자격 박탈

zookeeper

  • Cordinator로써 Kafka가 HA구성 할 수 있게 만들어준다.
    1. 서버의 상태를 감지한다
    2. Topic의 생성/소비 상태를 저장
    3. Kafka Cluser(Broker,partition…)의 Leader 선출

KRaft

  • Kafka에서 Zookeeper을 사용하지 않고 자체적으로 구동하기 위한 모드
  • 설정 방법
    • Zookeeper을 미설정하면된다.
    • Zookeeper의 역할을 Controller가 수행한다
  • 최근 버전에는 HA 구성을 위한 자체 Cordinator인 Kraft를 지원하는 것을 볼 수 있는데, 2023-09-23일 기준으로는 공식 홈페이지에도 TEST용도로는 좋지만, 배포는 하지 말라고 적혀있다
    • 결합 모드에서는 브로커와 별도로 컨트롤러를 롤링하거나 확장할 수 없음
    • 배포 환경에서는 결합 모드가 권장되지 않음

기본 설정

zookeeper.connect=[list of ZooKeeper servers]

# Log configuration
num.partitions=8
default.replication.factor=3
log.dir=[List of directories. Kafka should have its own dedicated disk(s) or SSD(s).]

# Other configurations
broker.id=[An integer. Start with 0 and increment by 1 for each new broker.]
listeners=[list of listeners]
auto.create.topics.enable=false
min.insync.replicas=2
queued.max.requests=[number of concurrent requests]
  • java 설정
    -Xmx6g -Xms6g -XX:MetaspaceSize=96m -XX:+UseG1GC
    -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M
    -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80 -XX:+ExplicitGCInvokesConcurrent
  • 하드웨어 ( 권장 사항 )
    • 24GB Memory, 8 cores 이상

개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

+ Recent posts