Kafka

Kafka - 최종 정리 ( 추가 중 )

개발 일기92 2024. 6. 28. 12:43

  • Broker
    • 최소 3대, 권장 4대 이상의 Broker로 Kafka Cluster 구성
    • Topic 내의 Partition을 분산, 유지, 관리
    • Broker 장애 시? - Broker는 partition을 미리 다른 Broker에 Replication(복제)하여 대비한다. Leader/Follower구조
    • Replication Factor 3 ? - Leader 1, Follower 2 (복제2), Follower는 leader에 Fetch Request를 요청하며 commit Log 데이터 요
    • Producer와 Consumer는 Broker Leader하고 통신한다. 
    • Leader 장애 시 Kafka Cluster에서 follower중 Leader선출
    • Leader선출 하는 방법? - ISR, In Sync Replicas
      • High Water Mark라고 하는 Follower중 Leader의 commit log와 가장 근접하게 복제한 Follower를 Leader선출
      • replica.lag.max.messages 5 옵션? : Leader와 Follower가 5개이상 메세지 차이가 나면 지연으로 판단. 
      • replica.lag.time.max.ms = 1000 옵션? : Follower가 Leader로 Fetch요청 보내는 interval을 체크. 해당 옵션 사용을 권장함.
      • 장애 복구된 Broker가 다시 시작할 때 Committed 메시지 목록을 유지하도록 하기 위해, Broker의 모든 Partition에 대한 마지막 Committed Offset은 replication-offset-checkpoint라는 파일에 기록됨
    • Broker Controller? - Kafka Cluster중 하나의 Broker가 컨트롤러가된다. 컨트롤러는 Zookeeper를 통해 Broker Liveness 모니터링을 한다.
    • Partition Leader가 한 Broker에 집중되지 않도록 하는 옵션
      • auto.leader.rebalance.enable : 기본값 enable
      • leader.imbalance.check.interval.seconds : 기본값 300 sec  
      • leader.imbalance.per.broker.percentage : 기본값 10
    • Follower는 최대한 Rack 간에 균형을 유지하여 Rack 장애 대비하는 Rack Awareness 기능이 있음 (Rack간 분산)

    • n개의 Replica가 있는 경우 n-1개의 장애를 허용할 수 있음
    • Follower가 너무 느리면 Leader는 ISR에서 Follower 제거 후 Zookeeper에 ISR을 유지
      • replica.lag.time.max.ms 옵션 : 정해진 ms내에 follower가 fetch하지 않으면 ISR에서 제거.
    •  
Follower 장애 Leader 장애
Leader에 의해 ISR 리스트에서 삭제됨 Controller는 Follower중 새로운 Leader 선출
Leader는 새로운 ISR을 사용하여 Commit Controller는 새 Leader와 ISR정보를 zookeeper에 보낸 후
클라이언트 메타데이터 업데이트 정보를 모든 broker에 전달

  • Zookeeper
    • Broker 관리. 
    • Topic 생성, 제거/ Broker 추가/제거 등의 변경 사항을 Kafka Cluster에 알림
    • 최소 3대, 권장 5대의 홀수로 구성. -> ( Quorum(쿼럼). 정족수로 장애 판단 )
    • Leader(Writer), Follower(reads)로 구성되어 있다.
    • Master/Slave 아키텍처. 
    • Tree형태로 각 Zookeeper마다 broker들을 맡아 관리, 모니터링

  • Consumer Group
    • 다른 Consumer Group에 속한 Consumer들은 서로 관련이 없다.
    • 하나의 Consumer는 한 Topic의 Partition에서의 Consumer Offset을 별도로 기록하며 Consume함. (ex GroupB:MyTopic:P0:7 / GroupB:MyTopic:P1:3)
    • Partition은 항상 Consumer Group내의 하나의 Consumer에 의해서만 사용됨
    • Partition이 2 개 이상인 경우? - 모든 메시지에 대한 전체 순서 보장 불가능
    • Partition을 1 개로 구성하면? - 모든 메시지에서 전체 순서 보장 가능(처리량 저하)
    • partition 4개 <-> Counsumer group A의 Consumer 4개 중 consumer 4번이 장애가 나면 Consumer 1~3번 중 하나에서 추가로 데이터를 consume한다.

  • Commit Log
    • Commit Log에 있는 Event를 동시에 다른 Consumer가 Read할 수 있음
    • Commit Log : 추가만 가능, 변경 불가. 데이터(Event)는 항상 로그 끝에 추가되고 변경되지 않음
    • Consumer Lag : Producer가 Write한 LOG-END-OFFSET과 Consumer가 Read하는 CURRENT-OFFSET과의 차이

  • Offset
    • Offset : Commit Log 에서 Event의 위치.  (0번 부터 순차적으로 consume해감.)
    • 한 partition에서 Offset값은 계속 증가하고 0으로 돌아가지 않음.

  • Segment
    • Segment의 default 용량 - 1GB, 시간 - 168 hour
    • Segment는 partition당 하나만 Active(write중)
    • Page Cache/ Flush
      • segment는 OS Page Cahe에 기록됨.(성능을 향상시키기 위해 세그먼트는 OS가 데이터를 디스크에 쓰기 전에 임시로 저장하는 데 사용하는 인메모리 캐시인 OS 페이지 캐시에 기록됨.)
      • Zero-copy 전송 : 세그먼트에서 데이터를 읽어 소비자에게 보낼 때 Kafka는 제로 카피 전송을 사용한다. 데이터가 사용자 공간에 복사되지 않고 페이지 캐시에서 네트워크 버퍼로 직접 전송되어 CPU 및 메모리 사용량을 줄이고 처리량을 높임.
      • 디스크로 Flush되는 상황(IF ! Flush 되기 전에 broker장애 시? - Replication(follower)가 있음.) 
        • Broker 완전히 종료될 경우.
        • OS background "Flusher Thread" 실행. ( fsync는 기본적으로 비활성화를 권장함. kafka성능을 더 우선시 하기 때문.)

  • Partition
    • Partition개수는 Topic생성 시 지정한다. (운영중 개수 변경은 권장하지 않음.)
    • Topic내의 Partition들은 서로 독립적.
    • Partition 에 저장된 데이터(Message)는 변경이 불가능. Immutable
    • 동일한 Key를 가진 메시지는 동일한 Partition에만 전달되어 Key 레벨의 순서 보장 가능 (why? - kafka는 key를 hash알고리즘을 사용해 partition을 배정하기 때문. 즉 같은 key면 같은hash가 나오기 때문./ but? - Key 선택이 잘 못되면 작업 부하가 고르지 않을 수 있다)
    • 파티션 리더가 있는 Broker 장애 시 리더 선출까지 해당 파티션 사용불가. 

  • Producer
    • Json, String, Avro, Protobuf등의 데이터를 Kafka Cluster에 전달. (Kafka Cluster는 Byte Array(0101010....)형으로 데이터를 받고 Consumer에게 Json, String, Avro, Protobuf 등의 형태로 전달)
    • Producer가 Event전달이 잘되었는지 아는 방법?(옵션) - acks, retry
      • acks=0 : broker가 producer에 수신완료 신호를 보내지 않음.
        • 단점 : 메세지 손실이 있을 수 있다.
        • 장점 : 메세지 전송 속도가 빠르다. 
      • acks=1 : 수신완료 신호 1번
      • acks=-1, acks=all : Broker Leader와 Follower 전부 commit되고 신호를 보냄.
        • 단점 : 전송 속도 느림, 특정 실패 사례에서 반복수행 할 수 있음
        • 장점 : Leader 장애 시에도 데이터 손실 가능성이 낮음
      • retry : 오류 시 메세지 전송 재시도 옵션(acks=0 에서는 무의미한 옵션)
        • 옵션 설명 Default
          retries 메세지 send 재시도 횟수 MAX_INT
          retry.backoff.ms 재시도 사이에 추가되는 대기시간 100(0.1초)
          request.timeout.ms producer가 응답을 기다리는 최대시간 30,000(30초)
          delivery.timeout.ms 성공/실패의 신호를 보고하는 최대시 120,000(2분)
      • Producer Batch? : RPC(Remote Procedure Call)수를 줄여 Broker의 처리작업이 줄어 더 나은 처리량 제공.
        • linger.ms(default 0) : 메세지 batch처리될 때 까지 대기 시간
        • batch.size(default 16KB) : Batch 메세지 최대 크기
        • 일반적인 옵션 설정 : lingerms=100, batch.size =1,000,000KB (약 1gb)


        • max.in.flight.requests.per.connection=5(default) : 최대 동시 요청 수. 한 번에 최대 5개의 메세지를 동시에 비동기 적으로 전달할 수 있음
          • 동시 요청 수가 많을수록 성능은 향상될 수 있지만, 특정 조건에서는 메시지 순서가 꼬일 수 있다.
          • 너무 많은 요청 수를 지정할 경우 성능 저하.
        • enable.idempotence=true : 재시도에도 메세지 순서를 보장하는 옵션
          • 하나의 batch가 실패하면 후속 batch도 OutOfOrderSequenceException에러로 실패함.

 

  • Message / Event / Data ....등
    • Header, Key, Value로 구성.

'Kafka' 카테고리의 다른 글

Kafka - __consumer_offsets TOPIC  (0) 2024.06.07
Kafka 실행  (0) 2024.06.07
Kafka 설치  (0) 2024.06.07
Kafka - Apache Kafka and Confluent Reference Architecture  (0) 2024.06.05
Kafka - Exactly Once Semantics(EOS) 2  (0) 2024.06.04