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

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

kakao
PRO
December 08, 2022

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

#Kafka #Infrastructure

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

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

kakao
PRO

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

    View Slide

  2. 시작하기 전에


    구성 방법론


    운영 방안


    모니터링


    트러블슈팅


    향후 계획

    View Slide

  3. 시작하기 전에

    View Slide

  4. If(kakao) 2018

    View Slide

  5. View Slide

  6. 2.1PB+
    1.5T+ 3.8PB+
    Message per day Bytes In per day Bytes out per day

    View Slide

  7. How?
    점점 커지는 시스템에 대한 대비가 필요

    View Slide

  8. 구성 방법론

    View Slide

  9. For Fault
    ...
    5EA
    50EA
    Cluster

    View Slide

  10. 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

    View Slide

  11. Disk
    Server
    Disk
    X 12
    Server
    Raid 1+0 (권고) Non
    -
    Raid
    Disk

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. Disk
    Failure
    95%
    5%
    Disk
    Other
    Automation

    View Slide

  17. 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()

    View Slide

  18. 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 가능

    View Slide

  19. Memory
    Java App
    Kafka (32GB↑)
    Sys
    Sys
    Java
    Java
    Page Cache
    Page Cache
    Etc
    Etc
    Heap
    Heap


    (6GB)

    View Slide

  20. 운영 방안

    View Slide

  21. Kafka Request Flow
    User Kafka Web Kafka API
    API
    Browse Prod
    Admin
    Dev
    Reject
    Accept
    Result

    View Slide

  22. 토픽 리스트 관리 생성/수정 화면
    Kafka Web

    View Slide

  23. 요청 관리
    토픽 신청 승인 파티션 증설
    토픽 신청 거절

    View Slide

  24. Kafka Cluster Parameter
    구분 파라미터
    Cluster
    log.retention.hours
    unclean.leader.election.enable
    num.replica.fetchers
    num.network.threads
    num.io.threads
    Topic retention.ms

    View Slide

  25. 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

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide

  29. 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 ~

    View Slide

  30. 모니터링

    View Slide

  31. Metric
    Jmx / Kminion / Burrow
    Log
    Stat
    Prometheus Grafana
    Store Visualize
    Filebeat NiFi Elasticsearch Kibana
    Store Transform Visualize
    Metric
    Stat
    Log

    View Slide

  32. Topic Monitoring Cluster Monitoring
    Consumer Offset Cluster Statistics

    View Slide

  33. 트러블슈팅

    View Slide

  34. 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

    View Slide

  35. 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

    View Slide

  36. 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

    View Slide

  37. 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

    View Slide

  38. 트러블슈팅 사례 #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

    View Slide

  39. 트러블슈팅 사례 #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

    View Slide

  40. 트러블슈팅 사례 #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


    ...

    View Slide

  41. 트러블슈팅 사례 #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을 확인하여 리텐션 보다 높은 수치로 변경

    View Slide

  42. 트러블슈팅 사례 #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을 줄이기 어려울 때 사용

    View Slide

  43. 향후 계획

    View Slide

  44. 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


    View Slide

  45. E.O.D

    View Slide