- 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 |