一.kafka如何確保高可用(High Availability):
Kafka在0.8版本之前是沒有HA機(jī)制來確保高可用的雁社,當(dāng)某一個(gè)broker掛掉惹恃,partition就掛了启具。即存在單點(diǎn)故障筹吐。0.8之后提供了副本機(jī)制学密,副本機(jī)制會將 一個(gè)broker下某個(gè)topic的一個(gè)partition放入到另外一個(gè)broker里爽航,這個(gè)備份的分區(qū)和原分區(qū)都叫做副本(replica)其监。在所有的副本里萌腿,只能有一個(gè)leader,其余的副本都作為follower抖苦,同一時(shí)間內(nèi)只有l(wèi)eader負(fù)責(zé)讀寫毁菱,follower不起任何作用。這樣做的原因是為了確保消費(fèi)者單調(diào)讀 且 確保能立即讀取寫入的信息(Read-your-writes)锌历。其他所有的follower會異步的拉去leader消息贮庞,拉的快的會進(jìn)入ISR里,拉的慢得超過replica.lag.time.max.ms 配置的超時(shí)值的究西,會被踢進(jìn)OSR里窗慎,這個(gè)過程是動態(tài)的,如果一個(gè)follower開始沒跟上leader的消息寫入速度卤材,被踢出了ISR遮斥,等到跟上后又會重新進(jìn)入ISR。當(dāng)leader掛掉之后扇丛,為了保證高可用性术吗,從ISR中獲取一個(gè)副本,升格為leader帆精。如果ISR全掛了较屿,有兩種策略,一是等待ISR第一個(gè)恢復(fù)的副本卓练,二是開啟unclean從OSR中選擇一個(gè)副本作為leader隘蝎。為保證高可用 可以選擇第二種犧牲一致性的方式。
二.kafka如何保證高性能:
1.分區(qū):
kafka將topic分區(qū)昆庇,每一個(gè)broker里面會保存topic的不同分區(qū)末贾,這樣就可以讓一個(gè)消費(fèi)者組同時(shí)消費(fèi)不同的分區(qū),提高吞吐整吆。一個(gè)消費(fèi)組下只應(yīng)有一個(gè)消費(fèi)者去消費(fèi)一個(gè)分區(qū)拱撵。理想情況下辉川,一個(gè)消費(fèi)者對應(yīng)一個(gè)partition性能最佳。
2.頁緩存:
kafka重度依賴頁緩存技術(shù)拴测,kafka只是將數(shù)據(jù)寫入頁緩存(內(nèi)存)中而不直接操作磁盤乓旗,由操作系統(tǒng)決定什么時(shí)候把頁緩存中數(shù)據(jù)刷到磁盤上。同時(shí)寫入頁緩存的數(shù)據(jù)是按照磁盤順序去寫入的集索,因此刷到磁盤上的速度也較快屿愚。當(dāng)讀操作發(fā)生時(shí),先從頁緩存中查詢是否有所需信息务荆,若沒有才會調(diào)度磁盤妆距。
3. Sendfile:
若頁緩存中沒有所需信息,需要去調(diào)度磁盤函匕。原本網(wǎng)絡(luò)io操作需要四個(gè)步驟 : 硬盤 -> 內(nèi)核態(tài) PageCache -> 用戶態(tài)程序讀取 -> 內(nèi)核態(tài)socket寫入 -> 拷貝至網(wǎng)卡娱据。Sendfile優(yōu)化后,使用零拷貝可以將buffer從內(nèi)核態(tài)和用戶態(tài)間任意切換盅惜。PageCache僅會傳遞一個(gè)文件描述符給socket中剩,就等效于直接從PageCache中拷貝至網(wǎng)卡。少兩步IO操作抒寂。
三.controller選舉機(jī)制
Broker選舉:第一個(gè)啟動的broker會在zk中創(chuàng)建臨時(shí)節(jié)點(diǎn)/controller结啼,利用zk的強(qiáng)一致性,成為唯一的控制器節(jié)點(diǎn)屈芜,而其余的broker會監(jiān)聽該節(jié)點(diǎn)郊愧。隨后由controller決定每個(gè)broker的master,每當(dāng)broker掛掉沸伏,controller會檢測其副本糕珊,重新決定出master。當(dāng)控制器broker斷開時(shí)毅糟,/controller臨時(shí)節(jié)點(diǎn)會刪除,其余連接的broker將收到事件通知澜公,搶占式注冊為新的controller