ABOUT ME

-

Total
-
  • [#3] Kafka 이론 (Producer, Consumer, Zookeeper)
    컴퓨터/Kafka 2020. 11. 29. 21:49
    728x90
    반응형

    Kafka

    3번째 튜토리얼

     

    Apache Kafka

    Apache Kafka: A Distributed Streaming Platform.

    kafka.apache.org

    이전 글: Kafa 이론 (topic, broker)


     

    1. Producer (프로듀서)

    Producer [prə|duːsə(r)]
    (명사) 생산자, 생산 회사[국가]

     

    • 데이터를 토픽에게 전송하는 역할을 한다.
    • 어떤 브로커(서버), 파티션에 데이터를 저장할지 알아서 결정한다.
    • 키 값을 지정하지 않으면 Round-Robin 형식으로 브로커에 데이터를 전송한다.
    • 데이터를 쓸 때 어떤 확인(acknowledgment)을 받을 지 선택할 수 있다.
    1. acks = 0, 데이터 전송 후 확인이 필요, (데이터 손실 가능, ex. 서버에 보냈는데 서버가 다운됐을 시)
    2. acks = 1, 데이터 전송 후 리더의 확인이 필요. (서버가 다운됐고 복제가 안됐으면 제한된 손실 가능, 프로듀서 -> 서버, 리더 -> 프로듀서) 
    3. acks = all, 데이터 전송 후 리더와 복제들의 확인이 필요 (손실 없음, 딜레이가 생김)

    acks = all 과 min.insync.replicas를 섞어서 사용하면 replica 모두가 데이터를 리더에게 보낸 후

    리더가 프로듀서에게 반응을 보내야만 ack가 이루어짐

     

    아래는 CLI에서 "first-topic"이란 토픽에 간단한 데이터를 전송하는 방법이다.

    kafka-console-producer --broker-list localhost:9092 --topic first-topic

     

    메시지 키

    • 프로듀서는 키 값을 설정 후 데이터를 보낼 수 있다. (string, number, 아무 형식이나 가능)
    • 키 값이 null이면, round-robin 형식으로 데이터가 보내진다. (서버1, 서버2, 서버3... 조금씩 나눠서)
    • 키 값과 함께 데이터를 보내면, 그 키는 항상 같은 파티션으로 데이터가 전송된다.

     

    아래는 Java로 topic, key, value를 지정하는 방법이다.

    // Kafka Producer record
    ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, value);

     

    2. Consumer (컨슈머)

    Consumer [kən|suːmə(r)]
    (명사) 소비자

     

    프로듀서로 데이터를 보내면, 데이터를 읽는 것이 컨슈머이다.

     

    특징

    • 컨슈머는 어떤 브로커(서버)에서 데이터를 읽을지 알고 있다.
    • 브로커가 죽어도, 컨슈머는 알아서 복구한다.
    • 각 파티션에서 데이터를 순서대로 읽는다.

     

    Consumer Groups

    컨슈머가 어떻게 모든 파티션에 있는 데이터를 읽을 수 있을까? 또는 병렬로 동시에 읽을 수 있을까? parallelism

    • 컨슈머는 컨슈머 그룹 안에서 데이터를 읽는다.
    • 각 컨슈머는 그룹 안에서 독점적으로(exclusive) 파티션을 갖고 데이터를 읽는다.
    • 파티션보다 컨슈머가 많으면, 초과된 만큼 컨슈머는 비활성화된다.
    • (파티션 3개, 컨슈머 4개면, 각 컨슈머마다 파티션 하나씩 갖는데, 컨슈머 4번은 놀게 된다.)

     

    Consumer offsets

    각 컨슈머는 매번 데이터를 읽을 때마다 처음부터 읽을까?

    아니다, offset이란 개념을 통해서 읽은 곳까지 북마크 해두었다가 다음엔 북마크 해둔 곳부터 읽기 시작한다.

    (강제로 처음부터 읽기나, 초기화 가능)

     

    컨슈머는 언제 offset을 남길지 결정할 수 있다.

    1. 최대 한 번: 메시지 받자마자 오프셋이 정해짐, 프로세스가 죽으면 메시지는 사라짐
    2. 최소 한 번 (보통): 메시지를 받은 후에 오프셋을 정함, 프로세스가 죽으면, 메시지 다시 읽음, 따라서 idempotent(멱등) 프로세스여야함, (멱등 = 여러 번 연산해도 값이 같은 것)
    3. 딱 한 번: Kafka <-> Kafka는 streams API로, Kafka -> 다른 시스템은 idempotent 프로세스

     

    아래는 CLI에서 lag이 없더라도 모든 데이터를 읽는 방법이다.

    kafka-console-consumer --bootstrap-server localhost:9092 --topic first-topic --from-beginning

    아래는 CLI에서 offset을 초기화하는 방법이다.

    kafka-consumer-groups --bootstrap-server localhost:9092 --topic first-topic --group group-one --reset-offsets --to-earliest --execute
    
    
    @ 결과
    GROUP                          TOPIC                          PARTITION  NEW-OFFSET
    group-one                      first-topic                    0          0
    group-one                      first-topic                    1          0
    group-one                      first-topic                    2          0

     

    3. Zookeeper (주키퍼)

    Zookeeper [ˈzuːkiːpə(r)]
    (명사) 동물원 사육사[관리인]

     

    아직은 Kafka를 실행하기 위해선, Zookeeper가 항상 선행되어야 한다.

     

    아래는 CLI에서 zookeeper 서버를 실행하는 방법이다.

    zookeeper-server-start config/zookeeper.properties

     

    특징

    • 브로커(서버)를 관리한다.
    • 파티션의 리더를 결정해준다.
    • Kafka 시스템에게 이벤트 발생 시 알림을 전송한다. (ex. 새 토픽, 브로커 다운, 토픽 삭제...)
    • 홀수 개수의 Zookeeper가 필요하다. (3, 5, 7)
    • 컨슈머의 오프셋 값을 저장하지 않는다. (>= kafka v0.10)

     

     

    Kafka 공부 Github (Java)

    다음 글: [#4] Kafka: CLI

     

     

    728x90

    '컴퓨터 > Kafka' 카테고리의 다른 글

    Kafka Slack API Consumer 만들기 (Python)  (0) 2020.12.01
    [#2] Kafka 이론 (topic, broker)  (0) 2020.11.28
    [#1] Kafka 소개  (0) 2020.11.28

    댓글