startup
在oncontrollerfailover中被調用,
initializereplicastate
就是周遊所有topic,partition的replica,如果這個replica所在的broker活着,則将state置成online
registerlisteners
想想這partitionstate中,listen的是topic目錄和topic下面的partition目錄,而并沒有listen broker
因為相對而言,partitoin隻不過是個邏輯概念,broker的狀況不會導緻partition的變化
而對于replicastate,broker的狀态會直接影響到replica的狀态,是以這裡需要listen broker
當發現有新的brokers或者有brokers fail的情況下,調用controller的callback來處理
kafkacontroller.onbrokerstartup
其實主要做的事,就是将新brokers上的所有replicas置為online,并且trigger所有的new或offline的partition到online
kafkacontroller.onbrokerfailure
也不複雜,
1. 在dead brokers上的replica都設為offline
2. 如果partition的leader在dead brokers上,那麼先把partition設為offline,再用triggeronlinepartitionstatechange試圖去重新elect leader,轉化成online
handlestatechange
雖然狀态很多,比partitionstate複雜,其實大部分也隻是單純的做下state設定,需要特别注意的,
1. 變成newreplica
其實也是隻是将該partition的leaderandisr發送給replica所在的broker
但做了個判斷,如果該replica為leader的話會抛出異常,why?我的了解因為正常不應該存在這種case
因為newreplica隻有兩種情況下會發生,一是,partition建立時,二是,partition reassignment時
如果是partition剛建立,
可以看到,是先将replica置為new,再去把partition置online,是以在把replica設為new的時候,應該還沒有leader
如果partition是reassignment,那麼目前是partition的leader一定不是新的這個replica
2. 變成onlinereplica
在建立partition或發現新的broker上線時,replica會變成online
replica變成online沒什麼特别需要做的,
當newreplica--》online時,需要把replica加入ar,這是在建立partition的時候做的
當其他case --》online時,這個一般是在onbrokerstartup時做的,隻需要把leaderandisr發過去就ok
為什麼從newreplica --》online時,不需要發送leaderandisr,我的了解因為在--》newreplica 時,就已經發過了,這就不用重複發了
3. 變成offlinereplica
在onbrokerfailure中被調用,
對offlinereplica所在brokers,發送stopreplica request;将這些replicas從isr中remove掉;通過leaderandisr request通知其他的brokers;
本文章摘自部落格園,原文釋出日期:2015-11-05