Upgrade to Pro — share decks privately, control downloads, hide ads and more …

카프카, 대규모 클러스터 운영 후기

kakao
December 08, 2022

카프카, 대규모 클러스터 운영 후기

#Kafka #Infrastructure

카프카는 데이터 흐름을 모아주는 실시간 분산 스트리밍 플랫폼으로 이제는 대다수 기업이 필수적으로 활용하는 오픈소스가 되었습니다.
카카오 전반적인 업무서비스에서 이용하는 카프카 공용 대규모 클러스터를 운영하면서 고려하고 진행했던 것에 대해 공유하고자 합니다.

발표자 : davis.s
카카오에서 시스템엔지니어링 업무를 담당하고 있으며, 전사 Kafka 클러스터를 관리하고 있는 데이비스입니다.

kakao

December 08, 2022
Tweet

More Decks by kakao

Other Decks in Programming

Transcript

  1. Kafka를 더 잘 관리하고 싶으신 분들에게 Copyright 2022. Kakao Corp.

    All rights reserved. Redistribution or public display is not permitted without written permission from Kakao. 카프카, 대규모 클러스터 운영 후기 심현준 davis.s 카카오 if(kakao)2022
  2. Cluster Spec Version CPU Broker Disk Mem 과거 0.11.X 6Core

    X 2 20EA Raid 1+0 X 4EA 32GB 현재 1.1.1 or 2.7.x ↑ 8 or 10Core X 2 50EA+(1EA) N - Raid X 12EA 128GB
  3. User Broker #1 Disk Disk #1 Disk #2 If-0 kakao-2

    developer-4 If-1 kakao-3 developer-5 If-3 kakao-5 developer-1 If-4 kakao-0 developer-2 If-5 kakao-1 developer-3 If-2 kakao-4 developer-0 Ifkakao cluster Topic
  4. User Broker #1 Disk Disk #1 Disk #2 If-0 kakao-2

    If-1 kakao-3 developer-5 If-3 kakao-5 developer-1 If-4 kakao-0 developer-2 If-5 kakao-1 developer-3 If-2 kakao-4 developer-0 Ifkakao cluster Topic developer-6 developer-7 developer-4 developer-8 developer-9 developer-10 developer-11
  5. Provider User Disk Disk #1 Disk #2 Disk #3 Disk

    #4 Disk #5 Disk #6 If-0 kakao-2 developer-4 If-1 kakao-3 developer-5 If-2 kakao-4 developer-0 If-3 kakao-5 developer-1 If-4 kakao-0 developer-2 If-5 kakao-1 developer-3 User Ifkakao cluster Topic Broker #1 developer-6 developer-10 developer-11 developer-7 developer-8 developer-9
  6. Provider User Disk Disk #1 Disk #2 Disk #3 Disk

    #4 Disk #5 Disk #6 If-0 kakao-2 developer-4 If-1 kakao-3 developer-5 If-2 kakao-4 developer-0 If-3 kakao-5 developer-1 If-4 kakao-0 developer-2 If-5 kakao-1 developer-3 User Ifkakao cluster Topic Broker #1 developer-6 developer-10 developer-11 developer-7 developer-8 developer-9
  7. Disk 통상적인 방식 Kafka (zero - copy) Read Buffer Socket

    Buffer User CPU Copy DMA Copy Application Buffer NIC Buffer Application Context Kernel Context Read Buffer Socket Buffer NIC Buffer Application Context Kernel Context TransferTo()
  8. Disk User Broker #1 Disk #1 If-0 kakao-2 developer-4 developer-2

    If-5 kakao-1 developer-3 If-2 kakao-4 Ifkakao cluster Message 더 나은 세상을 만드는 카카오 Apache Kafka is an open - source distributed event streaming platform ... 00000000000.log kakao-1 Directory kakao-1 Message Segment 00000000001.log 00000000002.log ... 00000008593.log 00000008594.log 1GB (default) Sequential R/W 가능
  9. Memory Java App Kafka (32GB↑) Sys Sys Java Java Page

    Cache Page Cache Etc Etc Heap Heap (6GB)
  10. Kafka Request Flow User Kafka Web Kafka API API Browse

    Prod Admin Dev Reject Accept Result
  11. Kafka Cluster Parameter - log.retention.hours, retention.ms - 우선도 : hour

    < minutes < ms - log.retention.hours - 클러스터 전반의 보관 주기 (브로커 단위 설정) - Default : 168 시간 (7일) - Kakao : 72시간 (3일) 구분 파라미터 Cluster log.retention.hours unclean.leader.election.enable num.replica.fetchers num.network.threads num.io.threads Topic retention.ms
  12. Kafka Cluster Parameter - log.retention.hours, retention.ms - retention.ms - 용량이

    과다한 경우 파티션 증설과 함께 고려 - 24시간, 12시간 은 물론 3시간, 1시간 운영중 - 신속한 장애 복구와 디스크 용량 (비용) 관리 구분 파라미터 Cluster log.retention.hours unclean.leader.election.enable num.replica.fetchers num.network.threads num.io.threads Topic retention.ms
  13. Kafka Cluster Parameter - unclean.leader.election.enable - 동기화되지 않은 복제본이 리더가

    되도록 허용하 는 옵션 - Default : false -> 데이터 정합성 - 카카오 : true -> 서비스 영속성 - 처음 적용하는 경우 테스트 이후 적용을 권고 구분 파라미터 Cluster log.retention.hours unclean.leader.election.enable num.replica.fetchers num.network.threads num.io.threads Topic retention.ms
  14. Kafka Cluster Parameter - 기타 성능 관련 파라미터 - num.replica.fetchers

    - num.network.threads - num.io.threads - 그 외 기본값과 다른 파라미터 - auto.create.topics.enable - 의미없는 토픽이 생성되지 않도록 False - log.dirs - Sticky bit, 자동 삭제의 /tmp 외 지정 구분 파라미터 Cluster log.retention.hours unclean.leader.election.enable num.replica.fetchers num.network.threads num.io.threads Topic retention.ms
  15. Kafka Cluster Life Cycle - 클러스터별 동시 Topic 생성 후

    Migration - 소규모의 경우 Rolling Upgrade - 사전에 Producer, Consumer 환경에 대한 대 비 필요 - 노후화된 H/W, OS EOL 임박한 환경이라면 신 규 환경 구축 후 Migration 분류 Kafka Version Life Cycle Deprecated <0.11.X ~2020/11 AS - IS 1.1.1 ~2023/11 (예정) 2.7.X, 2.8.X 제공 중 TO - BE >3.4.X 2022/12 ~
  16. Metric Jmx / Kminion / Burrow Log Stat Prometheus Grafana

    Store Visualize Filebeat NiFi Elasticsearch Kibana Store Transform Visualize Metric Stat Log
  17. Broker #1 트러블슈팅 사례 #1 Disk #1 If-0 Ifkakao cluster

    Broker #2 Broker #3 Disk #1 Disk #1 kakao-0 If-1 If-0 developer-0 kakao-0 developer-0 If-1 User Topic ISR default.replication.factor=2, min.insync.replicas=2
  18. Broker #1 트러블슈팅 사례 #1 Disk #1 If-0 Ifkakao cluster

    Broker #2 Broker #3 Disk #1 Disk #1 kakao-0 If-1 If-0 developer-0 kakao-0 developer-0 If-1 User Topic ISR [ReplicaManager broker=3] Error processing append operation on partition if-1
  19. Broker #1 트러블슈팅 사례 #1 Disk #1 If-0 Ifkakao cluster

    Broker #2 Broker #3 Disk #1 Disk #1 kakao-0 If-1 If-0 developer-0 kakao-0 developer-0 If-1 User Topic ISR If-0 kakao-0 developer-0 If-1 default.replication.factor=3, min.insync.replicas=2
  20. Broker #1 트러블슈팅 사례 #1 Disk #1 If-0 Ifkakao cluster

    Broker #2 Broker #3 Disk #1 Disk #1 kakao-0 If-1 If-0 developer-0 kakao-0 developer-0 If-1 User Topic ISR If-0 kakao-0 developer-0 If-1
  21. 트러블슈팅 사례 #1 - 보통은 파티션 증설 즉시 또는 디스크나

    컨트롤러 장애로 잠시 발생 - 대부분 default.replication.factor 와 min.insync.replicas 값이 같을 때 ack=ALL (-1) 이면 발생 - ack=1이 default 값이자 부하가 적으므로 꼭 필요한 경우가 아니면 기본값인 ack=1 사용 - 기본값은 1이나, 다중화를 위해 2 이상의 값으로 지정 - default.replication.factor=3, min.insync.replicas=2 를 권고 - fl uentd 등의 프로그램에서 default ack 값을 -1 (ALL)로 지정하고 있으니 확인이 필요 - RF 값이 올라간 대신 Follower 복제만큼 부하가 커지니 대비 필요 [ReplicaManager broker=3] Error processing append operation on partition if-1
  22. 트러블슈팅 사례 #1 # default.replication.factor=2, min.insync.replicas=2 ੤അ $ cat ifkakao.json

    {"version":1,"partitions":[{"topic":"if","partition":1,"replicas":[1,3]}, {"topic":"if","partition":0,"replicas":[1,2]}]} # default.replication.factor=3, min.insync.replicas=2 ߸҃ $ vim ifkakao.json {"version":1,"partitions":[{"topic":"if","partition":1,"replicas":[1,2,3]}, {"topic":"if","partition":0,"replicas":[1,2,3]}]} # ੸ਊ (--excute ੹ --verify ࣻ೯ ӂ੢) $ bin/kafka-reassign-partitions.sh --bootstrap-server ifkakao.foo.bar:9092 -- reassignment-json-file ifkakao.json --execute Current partition replica assignment ... Successfully started reassignment of partitions
  23. 트러블슈팅 사례 #2 - retention을 조정하였으나, 용량 변화가 없는 케이스

    - segment size도 일정 수치 이상이었고, 6개월 넘게 로그가 삭제되지 않는 버그 - TB 단위 이상으로 파티션 사이즈가 커서 장애 복구에도 지나치게 오래 걸리고 - retention.ms를 조정하였고, 브로커 재시작을 해도 소용이 없는 상태 # 4ߣ૩ ౵ੌदझమ੄ ਊ۝੉ ਬդ൤ ௾ ࢚క $ df -Th | grep data /dev/sdb1 xfs 13T 298G 13T 3% /data1 /dev/sdc1 xfs 13T 565G 13T 5% /data2 /dev/sdd1 xfs 13T 661G 13T 6% /data3 /dev/sde1 xfs 13T 3.3T 12T 24% /data4 ...
  24. 트러블슈팅 사례 #2 # kakao ష೗ ౠ੿ ౵౭࣌ (0ߣ) ੄

    ܻబ࣌ (3ੌ) ੉ղ੄ log ౵ੌ੄ ࢎ੉ૉ ҅࢑ $ find /data*/kafka/kakao-0 -type f -name "*.log" -mtime -3 -exec ls -s {} \; | awk '{sum+=$1} END {print sum}' 1073741824 # 1GB # пп੄ ౵౭࣌ীࢲ աৡ о੢ ௾ Ѿҗࠁ׮ ৈਬ ੓ѱ ҅࢑ೞৈ retention.bytes ੸ਊ $ bin/kafka-configs.sh --bootstrap-server ifkakao.foo.bar:9092 --entity-type topics --entity-name kakao --alter --add-config retention.bytes=2000000000 # ࢎ੉ૉо хࣗೞݶࢲ दр ױਤ retention ੸ਊػ kakao ష೗੄ log ౵ੌ ߂ ੌ੗ ੤ഛੋ $ ls -lrt /data*/kafka/kakao-0/*.log - 간단한 방법 (권장) - retention.bytes 조정 (bytes 단위로 계산) - fi le을 확인하여 리텐션 보다 높은 수치로 변경
  25. 트러블슈팅 사례 #2 # kakao ష೗੄ log ౵ੌ ߂ ੌ੗

    ഛੋೞৈ offset ҅࢑ $ ls -lrt /data*/kafka/kakao-0/*.log -rw-r—r— 1 kakao kakao 504728 9ਘ 18 16:18 00000000000000189315.log # ࢏ઁ -rw-r—r— 1 kakao kakao 512648 9ਘ 18 16:18 00000000000000200099.log -rw-r—r— 1 kakao kakao 498474 9ਘ 18 16:19 00000000000000211038.log # offset 210000 ੉੹੄ ؘ੉ఠ ࢏ઁ $ cat offsetfile.json {"partitions": [{"topic": "kakao", "partition": 0, "offset": 210000}], "version":1 } $ bin/kafka-delete-records.sh --bootstrap-server ifkakao.foo.bar:9092 --offset- json-file offsetfile.json - 디테일한 방법 - kafka - delete - records.sh 적용하여 지정한 offset 이전의 파일들을 삭제 - 도저히 retention을 줄이기 어려울 때 사용
  26. Kraft Mode - Kafka 구성 필수요소인 Zookeeper의 의존성을 제거하기 위한

    신규 모드 (KIP-500) - Kafka Raft metadata mode - 현재는 확장성, 성능, 효율성, 보안, 운영의 어려움, 위험성 등의 다양한 문제가 내재함 - controller.quorum.node (홀수), process.roles (broker, controller) - https:/ /cwiki.apache.org/con fl uence/display/KAFKA/ KIP-833%3A+Mark+KRaft+as+Production+Ready