目錄:
- Kafka存儲機制
- Kafka分區規則
- Kafka分區策略
- Kafka日志
Kafka存儲機制
再說Kafka存儲機制之前我們先了解下分區和副本的作用:
- 分區:為了提高性能(也就是分而治之,它是高並發分布式中心思想)。
- 副本:為了高可用(保證數據安全)。
如何設置副本數量:
- 最低一個,最大不超過broker的數量(不在范圍內的首先會報錯;其次沒有意義,超過broker數量時,首先broker宕機時不管你有多少個副本都是一起掛掉,拿不到數據)。
- 就經驗來說,參考Hadoop副本數量分配(Hadoop默認3個)。
——————————————————————————————————————————————————————
Kafka數據分為索引數據和數據,xxx.index、xxx.log。
存儲機制同樣采用分而治之的方式,首先消息根據topic(主題)分區,每個topic又有多個partition(分區),每個partition下又有多個segment(數據片)。
每一個partition就相當於一個巨大的文件,它被segment拆分成多個小文件,這邊是分而治之的思想。
你也可以理解成是公司,每個老板都是topic;為了提高管理效率增加了部門領導(partition),領導又管理職工(segment)。
.index存儲元數據,.log存儲大量的消息。如果我們要找獲取消息,首先會通過二分法找到對應的index文件,再從index文件的偏移量找到對應的log文件。
如果是找偏移量為348的數據(上圖左側黃色編號為3),即對應log文件170410+3=170413,也就是消息為message170413的。
Kafka分區規則
假如我們有3個分區,3個副本(L代表leader,F代表follow)。
故機器配置如下:
T1L T2L T3L
T1F1 T2F1 T3F1
T1F2 T2F2 T3F2
1、先從所有broker選一個存儲第一個leader分區(選出broker1為T1L)。
2、按照broker順序分配第二、第三個leader分區(所以T2L、T3L分別被分在broker2、broker3上)。
3、依次分配follow分區(如:第T1L被分配到broker1上,那么T1F1、T1F2就會被分配到broker2和broker3上;依次類推,T2L的兩個follow會被依次分在broker3、broker0上)。
Kafka分區策略
- 輪詢策略:若鍵值為null,並使用默認分區器,Kafka會根據輪詢策略將消息均勻的分到各個分區上。
- 散列策略:若鍵值不為null,並使用了默認分區器,Kafka會對鍵進行散列,然后根據散列值將消息映射到對應的分區上。
- 自定義策略:用戶可根據需要對數據使用不一樣的分區策略。
Kafka日志
ISR、HW、LEO同步流程:
- ISR(In-sync replica): 副本同步隊列,當有一條新的消息提交后,副本同步消息成功后才會出現在此隊列中。若某個follow副本落后太多或宕機,leader會將它從ISR中刪除。
- HW(high watemark): 高水位,指ISR中所有節點都已經復制完的消息的offset,也是消費者能獲取到的最大的offset。
- LEO(LogEndOffset): 最后一條消息的偏移量。
假如有3個副本。
一開始消息的狀態是這樣的:
L F1 F2
1 1 1
2 2 2
HW & LEO 3 3 3
現發送一條消息,此時消息會先到leader副本,然后再通知其它兩個follow副本復制。若此時僅有F1復制成功,此時便是這樣的。
L F1 F2
1 1 1
2 2 2
HW 3 3 3
LEO 4 4
那么HW便是在4之上的3的位置,LEO是4的位置,LSR是L、F1。
當所有副本都同步完之后,HW與LEO便回到一個位置上。
L F1 F2 1 1 1 2 2 2 HW & LEO 3 3 3
4 4 4
——————————————————————————————————————————————————————
查看日志命令:./kafka-dumplog.sh --files --file /home/hadoop/kafka/broker-0/xxxx.index