kafka入門必備知識(shí)

1. Kafka是一個(gè)分布式流處理平臺(tái):

  1. 可以讓你發(fā)布和訂閱流式的記錄。這一方面與消息隊(duì)列或者企業(yè)消息系統(tǒng)類似。
  2. 可以儲(chǔ)存流式的記錄,并且有較好的容錯(cuò)性。
  3. 可以在流式記錄產(chǎn)生時(shí)就進(jìn)行處理。

2. 消息系統(tǒng):

定義

  1. 將數(shù)據(jù)從一個(gè)應(yīng)用程序傳遞到另一個(gè)應(yīng)用程序,通過(guò)提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信。
  2. 分布式系統(tǒng)利用消息系統(tǒng),在多應(yīng)用之間進(jìn)行高效、穩(wěn)定、安全的數(shù)據(jù)傳遞。
  3. 應(yīng)用場(chǎng)景有跨系統(tǒng)數(shù)據(jù)傳遞、高并發(fā)流量削峰、數(shù)據(jù)異步處理。

兩種消息模式:

  1. 點(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)者模型)
  2. 發(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ā)布和訂閱的流程

  1. 生產(chǎn)者向topic當(dāng)中提交消息,Brokers將topic當(dāng)中的數(shù)據(jù)在對(duì)應(yīng)的分區(qū)當(dāng)中依次保存;
  2. 消費(fèi)者向Brokers請(qǐng)求獲取消息,Brokers向消費(fèi)者提供偏移量,消費(fèi)者根據(jù)偏移量要求獲取消息。
  3. 消費(fèi)者排隊(duì)的前提,消費(fèi)者數(shù)量大于分區(qū)數(shù)量
  4. 同一個(gè)消費(fèi)者組內(nèi)的消息不會(huì)重復(fù)消費(fèi)。

3. 生產(chǎn)者:

主要是消息提供者,根據(jù)業(yè)務(wù)需要往指定的topic推消息,一般也俗稱為消息的上游。

4. 消費(fèi)者:

  1. 要指定消費(fèi)者的分組:默認(rèn)情況下,分組是test
  2. 消費(fèi)者可以同時(shí)消費(fèi)若干個(gè)topic:
    1. 消息是已key-value格式進(jìn)行發(fā)送
    2. 每個(gè)key如果重復(fù)發(fā)送,其偏移量會(huì)遞增
    3. 新key的偏移量從0開始
  3. 消費(fèi)者要放在一個(gè)獨(dú)立的線程當(dāng)中,才能始終處于消費(fèi)狀態(tài)
  4. Spring是沒(méi)有辦法直接給線程當(dāng)中進(jìn)行依賴注入的
  5. 消費(fèi)者的線程如果要通知其他的任務(wù)執(zhí)行,需要從Spring的bean當(dāng)中獲取相關(guān)的業(yè)務(wù)對(duì)象

5. kafka寫消息的路由策略

  1. 如果指定分區(qū):直接使用分區(qū)進(jìn)行路由
  2. 指定了key,但是沒(méi)有指定分區(qū),那么會(huì)對(duì)key進(jìn)行hash運(yùn)算,通過(guò)運(yùn)算的值得到一個(gè)分區(qū)
  3. 如果都沒(méi)指定,那么會(huì)輪詢寫入一個(gè)分區(qū)

6. kafka寫硬盤:

  1. 傳統(tǒng)寫硬盤是隨機(jī)寫
  2. kafka是順序?qū)懹脖P,是隨機(jī)寫硬盤速度的6000倍
  3. 寫數(shù)據(jù)的流程
    1. 首先找到leader
    2. 將消息寫入leader的日志文件
    3. Followers(包含ISR中的成員,也包含不在ISR中的成員)會(huì)同步leader當(dāng)中的消息,同步完以后會(huì)向leader發(fā)送一個(gè)ACK確認(rèn)。
    4. leader在接收到isr所有成員的ACK確認(rèn)后,正式提交commit保存

7. kafka的消息安全策略:

  1. 默認(rèn)是保證一定成功(同步)
  2. 不重復(fù)發(fā)送,不保證成功(異步)

8. kafka的備份:

  1. 備份是由分區(qū)來(lái)創(chuàng)建的
  2. 一個(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:

  1. 同步備份:保證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
  2. 判定存活:配置延時(shí)replica.log.max.messages,replica.log.time.max.ms來(lái)判定是否宕機(jī)
  3. kafka如何解決zookeeper的壓力的
    1. Kafka有容器機(jī)制
    2. 每一個(gè)代理會(huì)創(chuàng)建一個(gè)新的容器
    3. 容器負(fù)責(zé)維護(hù)leader的讀寫,和選舉
  4. 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,并保持
  5. 如果所有的ISR成員都死亡:
    1. 等待ISR成員任意一個(gè)蘇醒,但是這個(gè)過(guò)程是不可控的
    2. 默認(rèn):只要有一個(gè)不是isr的成員存活,把這個(gè)作為新的leader。但是并不能保證這個(gè)成員是否數(shù)據(jù)和原本leader數(shù)據(jù)一致。

10. kafka的數(shù)據(jù)保存:

  1. Kafka的日志分為兩種,一種是運(yùn)行日志;還有一種是用于保存消息的日志;
  2. 一個(gè)分區(qū)對(duì)應(yīng)日志當(dāng)中的一個(gè)目錄
    1. 索引文件
    2. 數(shù)據(jù)文件
      1. 數(shù)據(jù)長(zhǎng)度
      2. 數(shù)據(jù)類型
      3. 時(shí)間戳
      4. 偏移量
      5. Key
      6. Value
      7. 頭信息
    3. 數(shù)據(jù)保留策略
      1. 時(shí)間:
      2. 大小:
      3. 注意:清理數(shù)據(jù)對(duì)kafka的讀寫沒(méi)有任何影響
      4. Kafka是在硬盤磁道上進(jìn)行順序讀寫,所以性能和文件大小沒(méi)有任何關(guān)系

11. topic的創(chuàng)建和刪除流程:

  1. 創(chuàng)建topic,是首先獲取代理的ids,然后將這些ids組成一個(gè)isr,作為一個(gè)新的容器
  2. 刪除topic:
  3. 默認(rèn)情況下delete.topic.enable=false;也就是被刪除的節(jié)點(diǎn)會(huì)被移入zk的這個(gè)節(jié)點(diǎn)/admin/delete_topics
  4. 要徹底刪除
    1. delete.topic.enable=true:一旦刪除,容器會(huì)清空在/admin/delete_topics節(jié)點(diǎn)上的監(jiān)聽
  5. auto.create.topics.enable=false:自動(dòng)創(chuàng)建主題,如果他為true,那么只要還有一個(gè)用戶在往這個(gè)主題當(dāng)中寫消息,這個(gè)主題就不會(huì)真正被刪除。即便是你已經(jīng)刪了,他依然還會(huì)創(chuàng)建一個(gè)出來(lái)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容