一個副本就是一個備份日志,多個副本提供冗余保持系統(tǒng)高可用性,多個副本均勻分布在所有broker上,從這些副本中選一個leader出來對外提供服務(wù),其他的副本叫做follower,被動的向leader請求數(shù)據(jù),保持同步,如果leader沒問題,就用不到follower,如果leader崩潰了,就從follower中選舉一個新的leader出來,競選leader也是需要資格的,如果follower與leader的進度差距比較大,那就不能參加競選,哪些follower可以競選?這就引出了ISR概念。
ISR是一組follower,是一組同步副本集合。每個分區(qū)都有自己的一個ISR列表,ISR中的副本都與leader保持同步。leader就在ISR中。producer寫入一條消息時,只有被ISR成員都接收到,才是為寫入成功。
重要概念

- 起始位置(base offset):該副本第一條消息的 offset。
- 高水印值(HW,high watermark):高位水印,指該副本最新一條已提交消息的 offset。超過 HW 的消息都是“未完全備份的”,consumer 是看不到的。
- 末端位置(LEO,log end offset):結(jié)束位移,就是副本日志中下一條代寫入消息的 offset。
同步流程說明
假設(shè)一個 topic,只要一個分區(qū),有3個副本(1個leader, 2個follower),ISR中也是這3個副本,目前 topic 是空的,3個副本的 LEO 和 HW 的值都是 0。
現(xiàn)在 producer 向 leader 副本發(fā)送了一條消息,下面看一下消息的整個同步流程:
(1)leader 接收到消息,把自己的 LEO 值更新為 1。
(2)2個 follower 各自發(fā)請求給 leader。
(3)leader 把消息推送給 follower。
(4)follower 接收到消息后,更新自己的 LEO 為 1。
(5)leader 接收到 follower 的響應(yīng)之后,HW 值更新為 1,此時 offset 為 0 的這條消息可以被 consumer 消費了。
對于設(shè)置了 acks=-1 的 producer,只有這5步都完成了,producer 才能正常返回,標志著這條消息發(fā)送成功。