Kafka-分區分配規則
kafka的基本存儲單元是分區。分區無法在多個broker間進行再細分,也無法在同一個broker的多個磁盤上進行再細分。所以,分區的大小受到單個掛載點可用空間的限制。
在配置kafka的時候,使用log.dirs參數來配置用於存儲分區的目錄清單。
分區分配
在創建主題時,kafka首先會決定如何在broker間分配分區。假設我們有6個broker,打算創建一個包含10個分區的主題,並且復制系數為3.那么kafka就會有30個分區副本,他們可以被分配給6個broker。
在進行分區分配時,要達到如下的目標:
1.在broker間平均地分布分區副本。上述例子中,也就是要保證每個broker可以分到5個副本。
2.確保每個分區的每個副本分布在不同的broker上。假設分區0的首領副本在broker2上,那么可以把跟隨者副本放在broker3和broker4上,但不能放在broker2上,也不能兩個都放在broker3上。
3.如果為broker指定了機架信息,那么盡可能把每個分區的副本分配到不同機架的broker上。這樣做是為了保證一個機架的不可用不會導致整體的分區不可用。
為了實現這一目標,我們先隨機選擇一個broker(假設是broker4),然后使用輪訓的方式給每個broker分配分區來確定首領分區的位置。於是,首領分區0會在broker4上,首領分區1會在broker5上,首領分區2會在broker0上,並以此類推。接下來是分配跟隨者副本。如果分區0的首領在broker4上,那么它的第一個跟隨者副本會在broker5上,第二個跟隨者副本會在broker0上。分區1的首領在broker5上,那么它的第一個跟隨者副本在broker0上,第二個跟隨者副本在broker1上。
如果配置了機架信息,那么就不是按照數字順序來選擇broker了,而是按照交替機架的方式來選擇broker。假設broker0、broker1和broker2放置在同一個機架上,broker3、broker4、broker5分別放置在其它不同的機架上。我們不是按照0-5的順序來選擇broker,而是按照0,3,1,4,2,5的順序來選擇,這樣每個相鄰的broker都在不同的機架上。於是,如果分區0的首領在broker4上,那么第一個跟隨者副本會在broker2上,這兩個broker在不同的機架上。如果第一個機架下線,還有其他副本仍然活躍着,所以分區仍然可用。
為分區和副本選好合適的broker之后,接下來要決定這些分區應該使用哪個目錄。我們單獨為每個分區分配目錄,規則很簡單:計算每個目錄里的分區數量,新的分區總是被添加到數量最小的那個目錄里。