kafka的ISR機制被成為“不丟消息”機制。在說ISR機制前,先講一下kafka的副本(replica)。
kafka的Replica
1.kafka的topic可以設置有N個副本(replica),副本數最好要小於broker的數量,也就是要保證一個broker上的replica最多有一個,所以可以用broker id指定Partition replica。
2.創建副本的單位是topic的分區,每個分區有1個leader和0到多個follower,我們把多個replica分為Lerder replica和follower replica。
3.當producer在向partition中寫數據時,根據ack機制,默認ack=1,只會向leader中寫入數據,然后leader中的數據會復制到其他的replica中,follower會周期性的從leader中pull數據,但是對於數據的讀寫操作都在leader replica中,follower副本只是當leader副本掛了后才重新選取leader,follower並不向外提供服務。
kafka的“同步”
kafka不是完全同步,也不是完全異步,是一種特殊的ISR(In Sync Replica)
1.leader會維持一個與其保持同步的replica集合,該集合就是ISR,每一個partition都有一個ISR,它時有leader動態維護。
2.我們要保證kafka不丟失message,就要保證ISR這組集合存活(至少有一個存活),並且消息commit成功。
所以我們判定存活的概念時什么呢?分布式消息系統對一個節點是否存活有這樣兩個條件判斷:第一個,節點必須維護和zookeeper的連接,zookeeper通過心跳機制檢查每個節點的連接;第二個,如果節點時follower,它必要能及時同步與leader的寫操作,不是延時太久。
如果滿足上面2個條件,就可以說節點時“in-sync“(同步中的)。leader會追蹤”同步中的“節點,如果有節點掛了,卡了,或延時太久,那么leader會它移除,延時的時間由參數replica.log.max.messages決定,判斷是不是卡住了,由參數replica.log.time.max.ms決定。
kafka的commit是由ack機制決定的,下一節再講ack機制。
