kafka 知識點彙總

1 什麼是kafka

Kafka是分佈式發佈-訂閱消息系統,它最初是由LinkedIn公司開發的,以後成爲Apache項目的一部分,Kafka是一個分佈式,可劃分的,冗餘備份的持久性的日誌服務,它主要用於處理流式數據。html

2 爲何要使用 kafka,爲何要使用消息隊列

緩衝和削峯:上游數據時有突發流量,下游可能扛不住,或者下游沒有足夠多的機器來保證冗餘,kafka在中間能夠起到一個緩衝的做用,把消息暫存在kafka中,下游服務就能夠按照本身的節奏進行慢慢處理。java

解耦和擴展性:項目開始的時候,並不能肯定具體需求。消息隊列能夠做爲一個接口層,解耦重要的業務流程。只須要遵照約定,針對數據編程便可獲取擴展能力。編程

冗餘:能夠採用一對多的方式,一個生產者發佈消息,能夠被多個訂閱topic的服務消費到,供多個毫無關聯的業務使用。數組

健壯性:消息隊列能夠堆積請求,因此消費端業務即便短期死掉,也不會影響主要業務的正常進行。緩存

異步通訊:不少時候,用戶不想也不須要當即處理消息。消息隊列提供了異步處理機制,容許用戶把一個消息放入隊列,但並不當即處理它。想向隊列中放入多少消息就放多少,而後在須要的時候再去處理它們。網絡

3.Kafka中的ISR、AR又表明什麼?ISR的伸縮又指什麼

ISR:In-Sync Replicas 副本同步隊列
AR:Assigned Replicas 全部副本
ISR是由leader維護,follower從leader同步數據有一些延遲(包括延遲時間replica.lag.time.max.ms和延遲條數replica.lag.max.messages兩個維度, 當前最新的版本0.10.x中只支持replica.lag.time.max.ms這個維度),任意一個超過閾值都會把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也會先存放在OSR中。AR=ISR+OSR。多線程

4.kafka中的broker 是幹什麼的

broker 是消息的代理,Producers往Brokers裏面的指定Topic中寫消息,Consumers從Brokers裏面拉取指定Topic的消息,而後進行業務處理,broker在中間起到一個代理保存消息的中轉站。架構

5.kafka中的 zookeeper 起到什麼做用,能夠不用zookeeper麼異步

zookeeper 是一個分佈式的協調組件,早期版本的kafka用zk作meta信息存儲,consumer的消費狀態,group的管理以及 offset的值。考慮到zk自己的一些因素以及整個架構較大機率存在單點問題,新版本中逐漸弱化了zookeeper的做用。新的consumer使用了kafka內部的group coordination協議,也減小了對zookeeper的依賴,socket

可是broker依然依賴於ZK,zookeeper 在kafka中還用來選舉controller 和 檢測broker是否存活等等。

6.kafka follower如何與leader同步數據

Kafka的複製機制既不是徹底的同步複製,也不是單純的異步複製。徹底同步複製要求All Alive Follower都複製完,這條消息纔會被認爲commit,這種複製方式極大的影響了吞吐率。而異步複製方式下,Follower異步的從Leader複製數據,數據只要被Leader寫入log就被認爲已經commit,這種狀況下,若是leader掛掉,會丟失數據,kafka使用ISR的方式很好的均衡了確保數據不丟失以及吞吐率。Follower能夠批量的從Leader複製數據,並且Leader充分利用磁盤順序讀以及send file(zero copy)機制,這樣極大的提升複製性能,內部批量寫磁盤,大幅減小了Follower與Leader的消息量差。

7.什麼狀況下一個 broker 會從 isr中踢出去

leader會維護一個與其基本保持同步的Replica列表,該列表稱爲ISR(in-sync Replica),每一個Partition都會有一個ISR,並且是由leader動態維護 ,若是一個follower比一個leader落後太多,或者超過必定時間未發起數據複製請求,則leader將其重ISR中移除 。

8.kafka 爲何那麼快

Cache Filesystem Cache PageCache緩存

順序寫 因爲現代的操做系統提供了預讀和寫技術,磁盤的順序寫大多數狀況下比隨機寫內存還要快。

Zero-copy 零拷技術減小拷貝次數

Batching of Messages 批量量處理。合併小的請求,而後以流的方式進行交互,直頂網絡上限。

Pull 拉模式 使用拉模式進行消息的獲取消費,與消費端處理能力相符。

9.kafka producer如何優化打入速度

增長線程

提升 batch.size

增長更多 producer 實例

增長 partition 數

設置 acks=-1 時,若是延遲增大:能夠增大 num.replica.fetchers(follower 同步數據的線程數)來調解;

跨數據中心的傳輸:增長 socket 緩衝區設置以及 OS tcp 緩衝區設置。

10.kafka producer 打數據,ack  爲 0, 1, -1 的時候表明啥, 設置 -1 的時候,什麼狀況下,leader 會認爲一條消息 commit了

1(默認)  數據發送到Kafka後,通過leader成功接收消息的的確認,就算是發送成功了。在這種狀況下,若是leader宕機了,則會丟失數據。
0 生產者將數據發送出去就無論了,不去等待任何返回。這種狀況下數據傳輸效率最高,可是數據可靠性確是最低的。
-1 producer須要等待ISR中的全部follower都確認接收到數據後纔算一次發送完成,可靠性最高。當ISR中全部Replica都向Leader發送ACK時,leader才commit,這時候producer才能認爲一個請求中的消息都commit了。
11.kafka  unclean 配置表明啥,會對 spark streaming 消費有什麼影響

unclean.leader.election.enable 爲true的話,意味着非ISR集合的broker 也能夠參與選舉,這樣有可能就會丟數據,spark streaming在消費過程當中拿到的 end offset 會忽然變小,致使 spark streaming job掛掉。若是unclean.leader.election.enable參數設置爲true,就有可能發生數據丟失和數據不一致的狀況,Kafka的可靠性就會下降;而若是unclean.leader.election.enable參數設置爲false,Kafka的可用性就會下降。

12.若是leader crash時,ISR爲空怎麼辦

kafka在Broker端提供了一個配置參數:unclean.leader.election,這個參數有兩個值:
true(默認):容許不一樣步副本成爲leader,因爲不一樣步副本的消息較爲滯後,此時成爲leader,可能會出現消息不一致的狀況。
false:不容許不一樣步副本成爲leader,此時若是發生ISR列表爲空,會一直等待舊leader恢復,下降了可用性。

13.kafka的message格式是什麼樣的

一個Kafka的Message由一個固定長度的header和一個變長的消息體body組成

header部分由一個字節的magic(文件格式)和四個字節的CRC32(用於判斷body消息體是否正常)構成。

當magic的值爲1的時候,會在magic和crc32之間多一個字節的數據:attributes(保存一些相關屬性,

好比是否壓縮、壓縮格式等等);若是magic的值爲0,那麼不存在attributes屬性

body是由N個字節構成的一個消息體,包含了具體的key/value消息

14.kafka中consumer group 是什麼概念

一樣是邏輯上的概念,是Kafka實現單播和廣播兩種消息模型的手段。同一個topic的數據,會廣播給不一樣的group;同一個group中的worker,只有一個worker能拿到這個數據。換句話說,對於同一個topic,每一個group均可以拿到一樣的全部數據,可是數據進入group後只能被其中的一個worker消費。group內的worker可使用多線程或多進程來實現,也能夠將進程分散在多臺機器上,worker的數量一般不超過partition的數量,且兩者最好保持整數倍關係,由於Kafka在設計時假定了一個partition只能被一個worker消費(同一group內)。

15.Kafka中的消息是否會丟失和重複消費?

要肯定Kafka的消息是否丟失或重複,從兩個方面分析入手:消息發送和消息消費。

一、消息發送

         Kafka消息發送有兩種方式:同步(sync)和異步(async),默認是同步方式,可經過producer.type屬性進行配置。Kafka經過配置request.required.acks屬性來確認消息的生產:

0---表示不進行消息接收是否成功的確認;
1---表示當Leader接收成功時確認;
-1---表示Leader和Follower都接收成功時確認;
綜上所述,有6種消息生產的狀況,下面分狀況來分析消息丟失的場景:

(1)acks=0,不和Kafka集羣進行消息接收確認,則當網絡異常、緩衝區滿了等狀況時,消息可能丟失;

(2)acks=一、同步模式下,只有Leader確認接收成功後但掛掉了,副本沒有同步,數據可能丟失;

二、消息消費

Kafka消息消費有兩個consumer接口,Low-level API和High-level API:

Low-level API:消費者本身維護offset等值,能夠實現對Kafka的徹底控制;

High-level API:封裝了對parition和offset的管理,使用簡單;

若是使用高級接口High-level API,可能存在一個問題就是當消息消費者從集羣中把消息取出來、並提交了新的消息offset值後,還沒來得及消費就掛掉了,那麼下次再消費時以前沒消費成功的消息就「詭異」的消失了;

解決辦法:

        針對消息丟失:同步模式下,確認機制設置爲-1,即讓消息寫入Leader和Follower以後再確認消息發送成功;異步模式下,爲防止緩衝區滿,能夠在配置文件設置不限制阻塞超時時間,當緩衝區滿時讓生產者一直處於阻塞狀態;

        針對消息重複:將消息的惟一標識保存到外部介質中,每次消費時判斷是否處理過便可。

消息重複消費及解決參考:https://www.javazhiyin.com/22910.html

16.爲何Kafka不支持讀寫分離?

在 Kafka 中,生產者寫入消息、消費者讀取消息的操做都是與 leader 副本進行交互的,從 而實現的是一種主寫主讀的生產消費模型。

Kafka 並不支持主寫從讀,由於主寫從讀有 2 個很明 顯的缺點:

(1)數據一致性問題。數據從主節點轉到從節點必然會有一個延時的時間窗口,這個時間 窗口會致使主從節點之間的數據不一致。某一時刻,在主節點和從節點中 A 數據的值都爲 X, 以後將主節點中 A 的值修改成 Y,那麼在這個變動通知到從節點以前,應用讀取從節點中的 A 數據的值並不爲最新的 Y,由此便產生了數據不一致的問題。

(2)延時問題。相似 Redis 這種組件,數據從寫入主節點到同步至從節點中的過程須要經 歷網絡→主節點內存→網絡→從節點內存這幾個階段,整個過程會耗費必定的時間。而在 Kafka 中,主從同步會比 Redis 更加耗時,它須要經歷網絡→主節點內存→主節點磁盤→網絡→從節 點內存→從節點磁盤這幾個階段。對延時敏感的應用而言,主寫從讀的功能並不太適用。

17.Kafka中是怎麼體現消息順序性的?

kafka每一個partition中的消息在寫入時都是有序的,消費時,每一個partition只能被每個group中的一個消費者消費,保證了消費時也是有序的。
整個topic不保證有序。若是爲了保證topic整個有序,那麼將partition調整爲1.

18.消費者提交消費位移時提交的是當前消費到的最新消息的offset仍是offset+1?

offset+1

19.kafka如何實現延遲隊列?

Kafka並無使用JDK自帶的Timer或者DelayQueue來實現延遲的功能,而是基於時間輪自定義了一個用於實現延遲功能的定時器(SystemTimer)。JDK的Timer和DelayQueue插入和刪除操做的平均時間複雜度爲O(nlog(n)),並不能知足Kafka的高性能要求,而基於時間輪能夠將插入和刪除操做的時間複雜度都降爲O(1)。時間輪的應用並不是Kafka獨有,其應用場景還有不少,在Netty、Akka、Quartz、Zookeeper等組件中都存在時間輪的蹤跡。

底層使用數組實現,數組中的每一個元素能夠存放一個TimerTaskList對象。TimerTaskList是一個環形雙向鏈表,在其中的鏈表項TimerTaskEntry中封裝了真正的定時任務TimerTask.

Kafka中究竟是怎麼推動時間的呢?Kafka中的定時器藉助了JDK中的DelayQueue來協助推動時間輪。具體作法是對於每一個使用到的TimerTaskList都會加入到DelayQueue中。Kafka中的TimingWheel專門用來執行插入和刪除TimerTaskEntry的操做,而DelayQueue專門負責時間推動的任務。再試想一下,DelayQueue中的第一個超時任務列表的expiration爲200ms,第二個超時任務爲840ms,這裏獲取DelayQueue的隊頭只須要O(1)的時間複雜度。若是採用每秒定時推動,那麼獲取到第一個超時的任務列表時執行的200次推動中有199次屬於「空推動」,而獲取到第二個超時任務時有須要執行639次「空推動」,這樣會無端空耗機器的性能資源,這裏採用DelayQueue來輔助以少許空間換時間,從而作到了「精準推動」。Kafka中的定時器真可謂是「知人善用」,用TimingWheel作最擅長的任務添加和刪除操做,而用DelayQueue作最擅長的時間推動工做,相輔相成。

參考:https://blog.csdn.net/u013256816/article/details/80697456

20.Kafka中的事務是怎麼實現的?

參考:https://blog.csdn.net/u013256816/article/details/89135417

21.Kafka中有那些地方須要選舉?這些地方的選舉策略又有哪些?

https://blog.csdn.net/yanshu2012/article/details/54894629
————————————————
版權聲明:本文爲CSDN博主「徐周」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/qq_28900249/article/details/90346599

相關文章
相關標籤/搜索