[Kafka 이해] 카프카 기본 개념 2

donghyeok·2022년 7월 28일
0

Kafka

목록 보기
2/6

1. Broker, Zookeeper 개념

Kafka Broker

  • Topic과 Partition을 유지 및 관리
  • Partition에 대한 Read Write를 관리하는 소프트웨어
  • Topic 내의 Partition들을 분산, 유지 및 관리
  • 각각의 Broker들은 ID로 식별됨
  • Topic의 일부 Partition들을 포함 (Partition을 가질 뿐 전체를 갖고 있지 않음)
  • Client는 특정 Broker에 연결하면 전체 클러스터에 연결됨
  • 최소 3대 이상의 Broker를 하나의 클러스터로 구성해야함 (4대 권장)

  • Topic을 구성하는 Partition들은 여러 Broker 상에 분산됨
  • Topic 생성시 Kafka가 자동으로 Topic을 구성하는 전체 Partition들을 모든 Broker에게 할당하고 분배해 줌
  • 모든 Kafka Broker는 Bootstrap 서버라고 부름

Zookeeper

  • Broker를 관리하는 소프트웨어

  • 변경사항에 대해 Kafka에 알림 (Topic 생성/제거, Broker 추가/제거)

  • Zookeeper 없이는 Kafka가 작동할 수 없음 (하지만 점점 제거되는 추세)

  • Zookeeper는 홀수의 서버로 작동하게 설계되어 있음 (최소3 권장 5)

  • Leader(Writes)가 있고 나머지는 Followe(reads)

  • 분산형 Configuration 정보 유지, 분산 동기화 서비스를 제공하고 대용량 분산 시스템을 위한 네이밍 레지스트리를 제공하는 소프트웨어

  • 분산 작업을 위한 Tree 형태의 데이터 저장소 (브로커 간의 정보공유, 동기화 등을 수행)

  • Quorum 알고리즘 기반으로 동작함

    • 쿼럼은 "정족수"이며 합의체가 의사를 진행시키거나 의결을 하는데 필요한 최소 인원을 뜻함
    • 분산 코디네이션 환경에서 예상치 못한 장애가 발생해도 분산 시스템의 일관성을 유지함
    • ensemble이 3대라면 쿼럼은 2, 즉 zookeeper 1대가 장애 발생해도 정상 동작

2. Producer 개념

Producer의 Record 구조

  • key, value는 Avro, JSON 등 다양한 형태가 가능

Serializer / Deserializer

  • Kafka는 Record를 Byte Array로 저장
  • Key와 Value 용 Serializer를 각각 설정함

High-Level Architecture

  1. 사용자가 Record를 만들어 send() 함수 수행 (사용자는 설정을 정하고 Record를 만들어 Send()만 수행시켜주면 된다 )
  2. Serializer에서 record를 직렬화 수행
  3. Partitioner에서 메시지의 Topic을 어떤 Partition으로 보낼지 결정
  4. 결과에 따라 분기

Partitioner의 역할

  • Partition = Hash(Key) % Number Of Partitions
  • 위 식을 이용하여 어떤 파티션으로 보낼지 결정함. (Key != null이어야 함)
  • Kafka2.4 이전의 디폴트파티셔너는 Round Robin 정책으로 동작
  • Kafka2.4 이후의 디폴트파티셔너는 Sticky 정책으로 동작
    - 하나의 Batch가 닫힐 때까지 하나의 partition에게 record를 보내고 랜덤으로 파티션 선택

3. Consumer 개념

Consumer Offset

Consumer Group이 읽은 위치를 표시

  • Consumer가 자동이나 수동으로 데이터를 읽은 위치를 commit하여 다시 읽음을 방지
  • __consumer_offsets 라는 Internal Topic에서 Consumer Offset을 저장하여 관리

파티션과 컨슈머

  • 여러개 파티션, 하나의 컨슈머가 있는 경우 해당 컨슈머는 모든 파티션에서 Record를 consume함.
  • 동일한 group.id로 구성된 Consumer들은 하나의 Consumer Group을 형성
    - 그룹 내에서 Consumer들은 파티션을 분배하여 Consume함.
    • 특정 파티션은 항상 Consumer group 내의 하나의 Consumer에 의해서만 사용됨
    • Consumer는 주어진 Topic에서 0개 이상의 많은 파티션을 사용할 수 있음

Message Ordering (메시지 순서)

  • Partition이 2개 이상인 경우 모든 메시지에 대한 전체 순서 보장 불가능
  • Partition을 1개로 구성하면 모든 메시지 전체 순서 보장 가능 -> 처리량 저하
  • Partition을 1개로 구성해서 모든 메시에서 전체 순서를 보장하는 경우가 많을까????
    - 대부분은 동일 Key 내부에서 순서 보장이 필요함.
  • 동일한 Key를 가진 메시지는 동일한 Partition에만 전달되어 Key레벨의 순서 보장 가능

Key Cardinality

  • Key Cardinality는 Consumer Group의 Consumer가 수행하는 작업의 양의 영향
  • Key 선택이 잘못되면 작업 부하가 고르지 않음
  • Key는 Integer, String 등과 같은 단순한 유형일 필요가 없음
  • Key 역시 Value와 마찬가지로 Avro, JSON등 여러 필드가 있는 복잡한 객체일 수 있음.
  • 따라서 Partition 전체에 Record를 고르게 배포하는 Key를 만드는 것이 중요.

Consumer 장애 상황

  • 컨슈머에서 장애가 발생하면 그룹 내의 다른 멀쩡한 컨슈머가 해당 로드를 가져가는 Rebalancing이 일어남
  • Partition은 항상 Consumer Group 내의 하나의 Consumer에 의해서만 사용된다는 룰 위배하지 않음

0개의 댓글

관련 채용 정보