Obsidian/Recognition/Programing/Kafka(AMQP)/Kafka설정.md

6.6 KiB

Offset

  • 컨슈머가 poll()을 호출할때마다 읽지 않은 메시지 가져와 처리
  • 컨슈머 그룹이 메시지를 어디까지 읽었는지 저장
  • 파티션별로 독립적인 Offset값을 가지고 있음.
  • 컨슈머 그룹 내부 저장 + 카프카내 토픽에 저장(Commit)

Commit

  • 오프셋 정보를 카프카 내부의 토픽에 저장하는 것을 Commit이라 함.
  • 컨슈머가 내부 정보를 사용할 수 없는경우 리벨런싱 수행함
    • 컨수머 다운
    • 컨슈머 그룹에 새로운 컨슈머 조인할 경우
  • 리벨런스 수행하면 가장 최근에 커밋된 오프셋 값을 가져와 메시지를 다시 읽는 과정을 수행함.
자동동 커밋
  • 컨슈머 옵션 중 enable.auto.commit = true 로 설정
  • 커밋을 하기 위한 주기는 기본적으로는 5초마다 커밋
  • auto.commit.interval.ms 값을 조정해 변경이 가능
  • 오프셋 관리를 자동으로 하기 때문에 편리한 장점
  • 리밸런싱으로 인한 문제가 생길 수 있다는 단점
  • 중복으로 메시지를 수신하더라도 결과에 변동이 되지 않도록 어플리케이션의 설계를 잘 해야함.
수동 커밋
  • 자동 커밋 방식과 마찬가지로 메시지의 중복이 발생할 수 있다.(오류 부분부터 다시 읽어들여야 하는 경우)

Replication

  • Fault Tolerant 를 위해 Replication 을 지원
  • 메시지를 복제해 관리하고 이를 통해 특정 브로커에 장애가 발생해도 다른 브로커가 해당 브로커의 역할을 대신할 수 있도록

Replication Factor

  • 토픽의 파티션의 복제본을 몇 개를 생성할 지에 대한 설정
  • Replication Factor 를 임의로 지정해 토픽을 생성할 수 있음.
  • Factor 를 2 로 설정하면 복제본을 한 개 생성하고 3 으로 설정하면 두 개의 복제본을 생성한다는 의미
  • replication 이 많아지면 그만큼 데이터의 복제로 인한 성능 하락이 있을 수 있음.

Leader & Follower

  • Replication 을 표현
  • Topic 으로 통하는 모든 데이터의 Read/Write 는 오직 Leader 를 통해서 이루어진다.
  • 리더와 팔로워는 변경될 수 있다.(ISR)
  • Leader : 팔로워를 감시하고 팔로워들 중 자신보다 일정 기간 뒤쳐진 팔로워가 발생하면 해당 팔로워가 리더가 될 자격이 없다고 판단하고, 뒤쳐진 팔로워를 ISR 에서 제외한다.
  • Follower : 리더와 동일한 내용을 유지하기 위해 일정 주기마다 리더로부터 데이터를 가져온다.

ISR (In-Sync Replication)

  • Replication Group
  • 여러개의 토픽의 Replication 들의 Leader & Follower를 하나의 그룹으로 묶은것을 ISR 이라 칭한다
  • ISR 내의 모든 Follower 들은 Leader 가 될 수 있다.
  • 장애시 일시적으로 Read/Write 의 Timeout 이 발생할 수 있지만 Retry가 일어나면 새로운 리더를 통해 Read/Write할 수 있음.
  • ISR 이 존재하는 목적은, Replica 들이 느려지거나 죽은 경우에도 Fault Tolerant 한 시스템을 유지하는 것(Acks참고)

All Down Situation

  • 장애 발생하여 모든 브로커가 중단되었고 브로커마다 최종 가지고 있는 메시지가 상이한경우
    • 마지막까지 리더였던 브로커1이 다시 Up 되고 리더가 될 때까지 기다린다. (손실 최소화, 브로커1이 빨리 up되어야 함)
    • 리더 / 팔로워 상관없이 가장 빨리 Up 이 되는 브로커의 파티션이 리더가 된다. (효율적, 일부 메시지 손실 감수)

Partitions

  • 카프카의 토픽들은 여러 파티션으로 나눌수 있음.
  • 토픽이 카프카에서 일종의 논리적인 개념이라면, 파티션은 토픽에 속한 레코드를 실제 저장소에 저장하는 가장 작은 단위
  • 파티션의 레코드는 각각이 Offset 이라 불리는, 파티션 내에서 고유한 레코드의 순서를 의미하는 식별자 정보를 가진다.
  • 파티션 간에는 순서가 보장되지 않음.
  • 토픽의 파티션들을 여러 브로커에 배포.
  • 파티션을 여러개로 나눠 병렬처리할 수 있음(하나의 파티션에 하나의 컨슈머 그룹이 지정됨)

Using a Partition Key

  • Producer 는 파티션 키를 사용해서 특정한 파티션에 메시지를 전달할 수 있다.
  • 동일한 키를 갖는 모든 레코드들이 동일한 파티션에 도착하는 것을 보장한다.
  • 키가 제대로 분산되지 않는 경우 특정 브로커만 메시지를 받는 단점도 존재한다.

Reading records from partitions

  • Consumer 가 카프카의 파티션으로부터 메시지를 읽어 (pull) 가야함.
  • 파티션 내의 메시지는 그룹 내의 Consumer 중 하나에 의해서만 소비되는 것을 보장

Consumer Group : 어떤 토픽을 소비하는 Consumer 들을 그룹으로 묶은 것

하나의 파티션에 하나의 그룹이 지정된경우(순서보장, 하나의 컨슈만 가져감, 하나의 컨슈머가 장애시 다른 컨슈머가 처리함)
하나의 파티션에 여러컨슈머 그룹이 지정된경우
여러개의 파티션에 여러게의 그룹이 지정됨경우 (순서보장x, 병렬처리)

!Pasted image 20230417164940.png

파티션의 개수가 병렬성의 정도를 결정함


ACKS (프로듀서, 데이터 유실 방)

  • Acks 옵션으로 [1, 0, -1(all)] 값으로 설정할 수 있다.
acks = 0
  • 브로커에게 메시지 전달이 정상적으로 되었는 지를 확인하지 않는다
  • 성능 면에서는 세 가지 옵션 중 가장 월등
  • 메시지 전달이 정상적으로 되고 있는 지를 보장하지 않는다.
acks = 1
  • 리더에게 메시지가 제대로 전달되었는 지를 확인
  • 리더는 팔로워들이 메시지를 복제하는 것을 기다리지 않고 잘 전달되었다고 프로듀서에게 알린다.
  • 복제가 되었는 지를 확인하지 않기 때문에 리더가 메시지를 받고 바로 장애가 발생할 경우 메시지가 유실될 수 있다
acks = all (-1)
  • 리더와 ISR 팔로워들이 메시지를 모두 전달받았는 지를 확인
  • 메시지의 전달에 있어 상대적으로 매우 긴 시간이 필요하지만, 다른 옵션들에 비해 월등한 안정성을 제공
기타
  • min.insync.replicas : 이 옵션값이 2로 설정되면, ISR 내에 하나의 replica 만 존재할 경우 전달받는 메시지를 거절 (replica 가 최소 몇 개 존재해야 하는 지를 의미)
  • ex) 노드가 3개 존재할 때 min.insync.replicas 를 3으로 설정하면, 하나의 노드만 장애가 발생해도 어떤 메시지도 받을 수 없게 된다

https://data-engineer-tech.tistory.com/11