Kafka?
Pub-Sub 구조의 메시지 큐 Framework
3개의 큰 요소로 구성
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 : 홀수로 구성하는 것
- Failover을 위해 Quorum으로 구성해야한다.
- Kafka Server라고 생각하면 된다.
Consummer
- Topic에 있는 데이터를 Pull하여 데이터 수집
- Brocker이 직접 데이터를 제공하는 것이 아닌, 주소 값을 받아 해당 주소에 있는 데이터를 접근하여 가져간다.
Topic
- Producer가 Brocker에게 전달한 Message를 적재하고 Consumer가 Message를 Pull하는 데이터 저장소
- 다르긴 하지만, RDB의 Table개념이라고 생각하면된다.
- Topic은 1+N개의 Partition으로 구성되어 있다.
Partition
- Topic당 분산되어 적재되는 저장소
- Partition 개수만큼 분산 처리할 수 있다.
- Partition 개수만큼
Consumer
와Connection
을 맺을 수 있다.
- Partition 개수만큼
- 분산 처리 하는 만큼 성능 향상을 야기할 수 있다.
- 너무 많아지면 File Handler 개수 증가, Failover 시간이 증가할 수 있다.
- File Handler 개수 증가 : 메모리 낭비 야기
- Failover 시간이 증가 : 말 그대로 장애 복구 시간이 늘어 서버 장애 발생 시 복구 시간이 늘어난다.
- e.g partition 1개당 1ms가 걸림.
10000개 partition존재 1ms * 10000 : 10초 소요
- e.g partition 1개당 1ms가 걸림.
- 제한
- 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 수
- Throughput 기준 : Max(Np, Nc)
- 너무 많아지면 File Handler 개수 증가, Failover 시간이 증가할 수 있다.
- Partition 개수만큼 분산 처리할 수 있다.
- 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구성 할 수 있게 만들어준다.
- 서버의 상태를 감지한다
- Topic의 생성/소비 상태를 저장
- 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 이상
개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!