天天看點

Apache Kafka源碼分析 - ReplicaStateMachine

startup

在oncontrollerfailover中被調用,

Apache Kafka源碼分析 - ReplicaStateMachine
Apache Kafka源碼分析 - ReplicaStateMachine

initializereplicastate

就是周遊所有topic,partition的replica,如果這個replica所在的broker活着,則将state置成online

Apache Kafka源碼分析 - ReplicaStateMachine
Apache Kafka源碼分析 - ReplicaStateMachine

registerlisteners

想想這partitionstate中,listen的是topic目錄和topic下面的partition目錄,而并沒有listen broker 

因為相對而言,partitoin隻不過是個邏輯概念,broker的狀況不會導緻partition的變化

而對于replicastate,broker的狀态會直接影響到replica的狀态,是以這裡需要listen broker

Apache Kafka源碼分析 - ReplicaStateMachine
Apache Kafka源碼分析 - ReplicaStateMachine

當發現有新的brokers或者有brokers fail的情況下,調用controller的callback來處理

kafkacontroller.onbrokerstartup

Apache Kafka源碼分析 - ReplicaStateMachine
Apache Kafka源碼分析 - ReplicaStateMachine

其實主要做的事,就是将新brokers上的所有replicas置為online,并且trigger所有的new或offline的partition到online

kafkacontroller.onbrokerfailure

Apache Kafka源碼分析 - ReplicaStateMachine
Apache Kafka源碼分析 - ReplicaStateMachine

也不複雜, 

1. 在dead brokers上的replica都設為offline 

2. 如果partition的leader在dead brokers上,那麼先把partition設為offline,再用triggeronlinepartitionstatechange試圖去重新elect leader,轉化成online

handlestatechange

Apache Kafka源碼分析 - ReplicaStateMachine
Apache Kafka源碼分析 - ReplicaStateMachine

雖然狀态很多,比partitionstate複雜,其實大部分也隻是單純的做下state設定,需要特别注意的,

1. 變成newreplica 

其實也是隻是将該partition的leaderandisr發送給replica所在的broker

但做了個判斷,如果該replica為leader的話會抛出異常,why?我的了解因為正常不應該存在這種case 

因為newreplica隻有兩種情況下會發生,一是,partition建立時,二是,partition reassignment時 

如果是partition剛建立,

Apache Kafka源碼分析 - ReplicaStateMachine
Apache Kafka源碼分析 - ReplicaStateMachine

可以看到,是先将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