Follower가 너무 느리면 Leader는 ISR에서 Follower을 제거하고 ZooKeeper에 ISR 유지
Controller는 Partition Metadata에 대한 변경 사항에 대해서 ZooKeeper로부터 수신
Controller란
Kafka Cluster 내의 Broker 중 하나가 Controller가 됨.
Controller는 ZooKeeper를 통해 Broker Liveness를 모니터링
Controller는 Leader와 Replica 정보를 CLuster내의 다른 Broker들에게 전달
Controller는 ZooKeeper에 Relicas 정보의 복사본을 유지한 다음 더 빠른 엑세스를 위해 클러스터의 모든 Broker들에게 동일한 정보를 캐시함.
Controller의 Leader 장애시 Leader Election을 수행
Controller가 장애가 나면 다른 Active Broker들 중에서 재선출됨.
Consumer 관련 포지션들
Last Commited Offset(Current Offset) : Consumer가 최종 Commit한 OffSet
Current Position : Consumer가 읽어간 위치(처리중, Commit전)
High water mark(Commited) : ISR 간에 복제된 Offset
Log End Offset : Producer가 메시지를 보내서 저장된, 로그의 맨 끝 Offset
Consumer lag : Last Commited Offset <--> Log End Offset 간의 차이
Commited란
ISR 목록의 모든 Replicas가 메시지를 받으면 Commited
Consumer는 Commited 메시지만 읽을 수 있음
Leader는 메시지를 Commit할 시기를 결정
Committed 메시지는 모든 Follower에서 동일한 Offset을 갖도록 보장
즉, 어떤 Replic가 Leader인지에 관계없이 모든 Consumer는 해당 Offset에서 같은 데이터를 볼 수 있음.
Broker가 다시 시작할 때 Commited 메시지 목록을 유지하도록 하기 위해, Broker의 모든 Partition에 대한 마지막 Committed Offset은 replication-Offset-checkPoint라는 파일에 기록됨.
Replicas 동기화
High Water Mark - 가장 최근의 Committed메시지의 Offset 추적 - replication-offset-checkpoint 파일에 체크포인트를 기록
Leader Epoch - 새 Leader가 선출된 시점을 Offset으로 표시 - Broker 복구 중에 메시지를 체크포인트로 자른 다음 현재 Leader를 따르기 위해 사용됨 - Controller가 새 Leader를 선택하면 Leader Epoch를 업데이트하고 해당 정보를 ISR 목록의 모든 구성원에게 보냄 - Leader-epoch-checkpoint 파일에 체크포인트를 기록
Message Commit 과정
Offset5 까지 복제가 완료되어 있는 상황에서, Producer가 메시지를 보내면 Leader가 Offset6에 새 메시지를 추가
각 Follower 들의 Fetcher Thread가 독립적으로 fetch를 수행하고, 가져온 메시지를 Offset6에 메시지 write
각 Follower 들의 Fetcher Thread가 독립적으로 다시 fetch를 수행하고 null을 받음. Leader는 High Water Mark 이동
각 Follower 들의 Fetcher Thread가 독립적으로 다시 fetch를 수행하고 High Water Mark를 받음, 업데이트