학습 자료
unclean leader election
- 파티션 리더 브로커가 불능 상태에 있을 때 ISR(In-Sync Replica)이 없다면 out-of-sync 상태에 있는 리플리카를 리더로 선출할 수도 있다. 이를 unclean leader election 이라고 한다.
- unclean leader election 은 메세지 처리의 일관성을 어느정도 포기하는 대신에 가용성을 유지하려고 할 때 사용하며,
unclean.leader.election.enable
옵션을 true 으로 설정하면 된다.
- 기본적으로 unclean leader election 은 불가능하게 되어 있다.
unclean leader election 을 허용할 경우 불능에 빠진 리더를 다시 복구할 때 까지의 다운타임을 줄이는 효과를 얻을 수 있지만, 새로 선출된 리더가 out-of-sync 상태에 있던 기간 동안에 예전 리더로부터 동기화 받지 못한 메세지들은 유실되는 문제가 있다. (컨수머 입장에서는 비즈니스 처리에 일관성이 깨진다.)
예)
replica.factor = 3
으로 되어있는데 2개 리플리카가 out-of-sync 인 상황에서 (offset = 100) 리더 (offset = 200) 가 불능에 빠짐.unclean leader election 이후 out-of-sync 였던 리플리카가 리더가 되면 오프셋을 101 부터 기록하기 시작한다. → 예전 리더에서 메세지를 읽고 커밋했던 컨수머 입장에서는 오프셋 기록에 혼란이 생긴다.
예전 리더였던 리플리카가 복구 되고나면 현 리더의 팔로워가 되는데, 예전 리더는 자기가 가지고 있는 메세지 중에서 현 리더가 가지고 있지 않은 메세지들은 삭제한다. → 삭제된 메세지는 아무 컨수머들도 읽지 못한 채 사라진다.
min.insync.replicas
replica.factor
를 설정했더라도 리더를 제외하고 ISR이 하나도 없는 상황이 생길 수 있다. 이런 상황에서 리더가 불능에 빠질 경우 일관성과 가용성 둘 중 하나를 포기해야만 한다.이건 프로듀서의
acks=all
설정이 보장하는 영역 밖에 있는 문제다. 이를 해결하려면 min.insync.replica
를 높게 설정해줘야 한다.예)
replica.factor = 3
, min.insync.replica = 2
으로 설정한 상황에서 2개 리플리카가 out-of-sync 가 된다면 프로듀서는 min.insync.replica
에 설정된 숫자보다 ISR 갯수가 더 적기 때문에 리더에 새 메세지를 기록할 수 없고, NOT_ENOUGH_REPLICAS
오류를 받게 되며 리더는 읽기 전용이 된다. (컨수머는 메세지를 계속 읽을 수 있다.)읽기 전용이 된 리더가 불능 상태에 빠져 unclean leader election 이 발생하더라도 컨수머가 아직 읽지 않은 메세지가 영구적으로 사라지는 상황을 방지하거나 줄일 수 있다.