본문 바로가기

Kafka

[Kafka] Replication (1)

  • Broker에 장애가 발생할 경우, 장애가 발생한 Broker의 Partition들은 모두 사용할 수 없게 되는 문제가 발생하여 Producer는 데이터를 전송할 수 없고, Consumer는 데이터를 받아서 처리할 수 없다.
  • 또한, 장애가 발생하면 CURRENT-OFFSET, LOG-END-OFFSET, Consumer Lag 등의 정보들도 사라지게 된다.
    -> 다른 Broker에서 장애가 발생한 Partition을 대신해서 새로운 Partition을 만들어도 장애가 해결되지 않는 이유(OFFSET 정보, 기존 정보들은 복수할 수 없다)

 

Replication

  • 위 상황을 대비하기 위한 기술로, Partition을 복제하여 다른 Broker 상에 복제물(Replicas)을 만들어서 장애를 미리 대비한다.
  • 메인 Partition을 Leader Partition, 복제본을 Follower Partition라고 한다.
  • Replication Factor = 3은 Leader Partition + Follower Partition의 총합이다.
  • Producer는 Leader Partition에만 Write 하고, Apache Kafka 2.4부터 Leader + Follower Partition에서 Read 할 수 있다.
  • Follower Partition은 장애 시 복구하기 위한 용도로만 존재하지 Service를 위해 존재하지는 않는다.
  • Follower Partition은 Leader Partition에서 데이터 가져오기(Fetch Request)를 요청하고 이를 통해 복제한다.

* Leader Partition에서 장애가 발생하면 Follower Partition 중에서 새로운 Leader를 선출한다.
* Producer는 바뀐 Leader Partition으로 데이터를 전송하고, Consumer는 새로운 Leader Partition에서 데이터를 읽어간다.
* 하나의 Broker에만 Leader Partition이 몰리면, 해당 Broker는 핫스팟이 된다. 이를 방지하기 위해 Leader Partition을 분산시켜주는auto.leader.rebalance.enable,leader.imbalance.check.interval.seconds,leader.imbalance.per.broker.
percentage 옵션을 제공한다.


In-Sync Replica(ISR)

  • 잘 복제하고 있는지 판단하는 지표 -> High Water Mark라고 하는 지점 이상의 Replicas의 목록
  • Leader Partition 장애 시 Leader를 선출하는데 사용한다.

  • replica.lag.max.messages=4 => High Water Mark 설정
  • Broker 3은 High Water Mark를 넘었기 때문에 ISR이라고 불린다.
  • 나머지 Broker들은 Out-of-Sync Follower(OSR)이라고 불린다.
  • Leader Partition 장애 시 Broker 3번의 Follower Partition이 Leader Partition으로 선출된다.

** replica.lag.max.messages를 사용하여 OSR을 분리했을 때 문제점: 메시지 유입량이 갑자기 늘어나면, 지연이라고 판단하고 OSR로 상태를 변경시킨다.
따라서, replica.lag.time.max.ms로 판단한다.

* replica.lag.time.max.ms

  • Follower가 Leader로 Fetch 요청을 보내는 Interval을 체크한다.
  • replica.lag.time.max.ms=10000이라면, Follower가 Leader로 Fetch 요청을 10000ms 이내로 요청하면 정상이라고 판단한다.


** IRS는 Leader Partition을 가지고 있는 Broker가 관리한다. -> Zookeeper에 ISR 업데이트

* Replica 동기화

  • High Water Mark: 가장 최근에 Commit된 메시지의 Offset을 추적한다.
    -> Follower Partition이 Fetch를 요청했을 때, Leader Partition은 새로 write된 데이터가 없어 null을 리턴하게 되면 High Water Mark를 가장 최근에 Commit된 Message까지 옮기고 다음 Fetch 요청 시 Follower Partition에게 알려준다. replication-offset-checkpoint 파일에 체크포인트를 기록
  • Leader Epoch: 새 Leader Partition이 선출된 시점을 Offset으로 표시 -> Broker 복구 중에 메시지를 체크포인트로 자른 다음에 현재 Leader Partition을 따르기 위해 사용되고 leader-epoch-checkpoint 파일에 체크 포인트를 기록한다.

'Kafka' 카테고리의 다른 글

[Kafka] Partition Assignment Strategy  (0) 2022.10.14
[Kafka] Replication (2)  (1) 2022.10.13
[Kafka] Consumer (2)  (0) 2022.10.11
[Kafka] Consumer (1)  (0) 2022.10.10
[Kafka] Producer (2)  (0) 2022.10.09