1. Kafka是一個(gè)分布式流處理平臺(tái):
- 可以讓你發(fā)布和訂閱流式的記錄。這一方面與消息隊(duì)列或者企業(yè)消息系統(tǒng)類似。
- 可以儲(chǔ)存流式的記錄,并且有較好的容錯(cuò)性。
- 可以在流式記錄產(chǎn)生時(shí)就進(jìn)行處理。
2. 消息系統(tǒng):
定義
- 將數(shù)據(jù)從一個(gè)應(yīng)用程序傳遞到另一個(gè)應(yīng)用程序,通過(guò)提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信。
- 分布式系統(tǒng)利用消息系統(tǒng),在多應(yīng)用之間進(jìn)行高效、穩(wěn)定、安全的數(shù)據(jù)傳遞。
- 應(yīng)用場(chǎng)景有跨系統(tǒng)數(shù)據(jù)傳遞、高并發(fā)流量削峰、數(shù)據(jù)異步處理。
兩種消息模式:
- 點(diǎn)對(duì)點(diǎn):若干個(gè)生產(chǎn)和消費(fèi)者,處理隊(duì)列當(dāng)中的數(shù)據(jù),一旦該數(shù)據(jù)被消費(fèi),則從隊(duì)列當(dāng)中被移除。(多線程:生產(chǎn)消費(fèi)者模型)
- 發(fā)布-訂閱:消息是被保留在主題當(dāng)中,消費(fèi)者一個(gè)消費(fèi)一個(gè)或者若干個(gè)主題當(dāng)中的消息
3. kafka的一些概念
1. 術(shù)語(yǔ):
| 術(shù)語(yǔ) | 術(shù)語(yǔ) |
|---|---|
| Topics(主題) | Kafka Cluster(Kafka集群) |
| Partition(分區(qū)) | Producers(生產(chǎn)者) |
| Partition offset(分區(qū)偏移) | Consumers(消費(fèi)者) |
| Replicas of partition(分區(qū)備份) | Leader(領(lǐng)導(dǎo)者) |
| Brokers | Follower(追隨者) |
2. 發(fā)布和訂閱的流程
- 生產(chǎn)者向topic當(dāng)中提交消息,Brokers將topic當(dāng)中的數(shù)據(jù)在對(duì)應(yīng)的分區(qū)當(dāng)中依次保存;
- 消費(fèi)者向Brokers請(qǐng)求獲取消息,Brokers向消費(fèi)者提供偏移量,消費(fèi)者根據(jù)偏移量要求獲取消息。
- 消費(fèi)者排隊(duì)的前提,消費(fèi)者數(shù)量大于分區(qū)數(shù)量
- 同一個(gè)消費(fèi)者組內(nèi)的消息不會(huì)重復(fù)消費(fèi)。
3. 生產(chǎn)者:
主要是消息提供者,根據(jù)業(yè)務(wù)需要往指定的topic推消息,一般也俗稱為消息的上游。
4. 消費(fèi)者:
- 要指定消費(fèi)者的分組:默認(rèn)情況下,分組是test
- 消費(fèi)者可以同時(shí)消費(fèi)若干個(gè)topic:
- 消息是已key-value格式進(jìn)行發(fā)送
- 每個(gè)key如果重復(fù)發(fā)送,其偏移量會(huì)遞增
- 新key的偏移量從0開始
- 消費(fèi)者要放在一個(gè)獨(dú)立的線程當(dāng)中,才能始終處于消費(fèi)狀態(tài)
- Spring是沒(méi)有辦法直接給線程當(dāng)中進(jìn)行依賴注入的
- 消費(fèi)者的線程如果要通知其他的任務(wù)執(zhí)行,需要從Spring的bean當(dāng)中獲取相關(guān)的業(yè)務(wù)對(duì)象
5. kafka寫消息的路由策略
- 如果指定分區(qū):直接使用分區(qū)進(jìn)行路由
- 指定了key,但是沒(méi)有指定分區(qū),那么會(huì)對(duì)key進(jìn)行hash運(yùn)算,通過(guò)運(yùn)算的值得到一個(gè)分區(qū)
- 如果都沒(méi)指定,那么會(huì)輪詢寫入一個(gè)分區(qū)
6. kafka寫硬盤:
- 傳統(tǒng)寫硬盤是隨機(jī)寫
- kafka是順序?qū)懹脖P,是隨機(jī)寫硬盤速度的6000倍
- 寫數(shù)據(jù)的流程
- 首先找到leader
- 將消息寫入leader的日志文件
- Followers(包含ISR中的成員,也包含不在ISR中的成員)會(huì)同步leader當(dāng)中的消息,同步完以后會(huì)向leader發(fā)送一個(gè)ACK確認(rèn)。
- leader在接收到isr所有成員的ACK確認(rèn)后,正式提交commit保存
7. kafka的消息安全策略:
- 默認(rèn)是保證一定成功(同步)
- 不重復(fù)發(fā)送,不保證成功(異步)
8. kafka的備份:
- 備份是由分區(qū)來(lái)創(chuàng)建的
- 一個(gè)分區(qū)有1個(gè)leader和0-n個(gè)follower,只要leader不宕機(jī),所有的follower都宕機(jī)了也不影響讀寫。follower只負(fù)責(zé)數(shù)據(jù)備份,不負(fù)責(zé)數(shù)據(jù)讀寫。
9. Kafka的isr:
- 同步備份:保證isr集合當(dāng)中至少存活一個(gè),如果leader不掛,正常提供服務(wù),如果leader掛了,重新選leader然后提供服務(wù);每個(gè)分區(qū)都有自己的isr
1. 備份的算法:
1. 分區(qū):分區(qū)編號(hào),取余代理數(shù)量 (p_i mod b_num)
2. 備份:分區(qū)編號(hào) + 備份編號(hào)之和, 取余 代理數(shù)量(p_i+r_j) mod b_num- 判定存活:配置延時(shí)replica.log.max.messages,replica.log.time.max.ms來(lái)判定是否宕機(jī)
- kafka如何解決zookeeper的壓力的
- Kafka有容器機(jī)制
- 每一個(gè)代理會(huì)創(chuàng)建一個(gè)新的容器
- 容器負(fù)責(zé)維護(hù)leader的讀寫,和選舉
- leader是在zk上競(jìng)爭(zhēng)創(chuàng)建節(jié)點(diǎn)來(lái)獲取leader資格,如果leader宕機(jī),選舉策略是所有的follower(ISR當(dāng)中保存的成員)重新競(jìng)爭(zhēng)創(chuàng)建節(jié)點(diǎn),獲取leader資格;容器會(huì)記錄新的leader,并保持
- 如果所有的ISR成員都死亡:
- 等待ISR成員任意一個(gè)蘇醒,但是這個(gè)過(guò)程是不可控的
- 默認(rèn):只要有一個(gè)不是isr的成員存活,把這個(gè)作為新的leader。但是并不能保證這個(gè)成員是否數(shù)據(jù)和原本leader數(shù)據(jù)一致。
10. kafka的數(shù)據(jù)保存:
- Kafka的日志分為兩種,一種是運(yùn)行日志;還有一種是用于保存消息的日志;
- 一個(gè)分區(qū)對(duì)應(yīng)日志當(dāng)中的一個(gè)目錄
- 索引文件
- 數(shù)據(jù)文件
- 數(shù)據(jù)長(zhǎng)度
- 數(shù)據(jù)類型
- 時(shí)間戳
- 偏移量
- Key
- Value
- 頭信息
- 數(shù)據(jù)保留策略
- 時(shí)間:
- 大小:
- 注意:清理數(shù)據(jù)對(duì)kafka的讀寫沒(méi)有任何影響
- Kafka是在硬盤磁道上進(jìn)行順序讀寫,所以性能和文件大小沒(méi)有任何關(guān)系
11. topic的創(chuàng)建和刪除流程:
- 創(chuàng)建topic,是首先獲取代理的ids,然后將這些ids組成一個(gè)isr,作為一個(gè)新的容器
- 刪除topic:
- 默認(rèn)情況下delete.topic.enable=false;也就是被刪除的節(jié)點(diǎn)會(huì)被移入zk的這個(gè)節(jié)點(diǎn)/admin/delete_topics
- 要徹底刪除
- delete.topic.enable=true:一旦刪除,容器會(huì)清空在/admin/delete_topics節(jié)點(diǎn)上的監(jiān)聽
- auto.create.topics.enable=false:自動(dòng)創(chuàng)建主題,如果他為true,那么只要還有一個(gè)用戶在往這個(gè)主題當(dāng)中寫消息,這個(gè)主題就不會(huì)真正被刪除。即便是你已經(jīng)刪了,他依然還會(huì)創(chuàng)建一個(gè)出來(lái)。