Kafka的用途有哪些符匾?使用場景如何蕴潦?
Kafka具有吞吐量大 簡單的優(yōu)點净薛,適用于日志收集 大數(shù)據(jù)實時計算等場景Kafka中的ISR汪榔、AR又代表什么?ISR的伸縮又指什么
AR:Assigned Replicas 所有副本列表
ISR:InSync Replicas 同步副本列表
ISR expand : 有副本恢復(fù)同步狀態(tài)
ISR shrink : 有副本脫離同步狀態(tài)Kafka中的HW、LEO痴腌、LSO雌团、LW等分別代表什么?
HW: High Watermark/高水位士聪。 是已備份消息位置锦援,HW之前的消息均可被consumer消費 leader.HW=min(ISR.LEO) follower.HW=min(follower.LEO,leader.HW)
LEO: Log End Offset/日志末端偏移。是下一條消息寫入位置(LEO=10 有9條消息)
LSO:last stable offset/穩(wěn)定偏移 剥悟。 LSO之前的消息狀態(tài)都已確認(commit/aborted)主要用于事務(wù)
LW:Kafka中是怎么體現(xiàn)消息順序性的灵寺?
kafka每個partition中的消息在寫入時都是有序的,消費時区岗,每個partition只能被每一個group中的一個消費者消費略板,保證了消費時也是有序的。
整個topic不保證有序Kafka中的分區(qū)器慈缔、序列化器叮称、攔截器是否了解?它們之間的處理順序是什么藐鹤?
分區(qū)器:根據(jù)鍵值確定消息應(yīng)該處于哪個分區(qū)中瓤檐,默認情況下使用輪詢分區(qū),可以自行實現(xiàn)分區(qū)器接口自定義分區(qū)邏輯
序列化器:鍵序列化器和值序列化器娱节,將鍵和值都轉(zhuǎn)為二進制流 還有反序列化器 將二進制流轉(zhuǎn)為指定類型數(shù)據(jù)
攔截器:兩個方法 doSend()方法會在序列化之前完成 onAcknowledgement()方法在消息確認或失敗時調(diào)用 可以添加多個攔截器按順序執(zhí)行
調(diào)用順序: 攔截器doSend() -> 序列化器 -> 分區(qū)器Kafka生產(chǎn)者客戶端的整體結(jié)構(gòu)是什么樣子的距帅?
“消費組中的消費者個數(shù)如果超過topic的分區(qū),那么就會有消費者消費不到數(shù)據(jù)”這句話是否正確括堤?如果不正確碌秸,那么有沒有什么hack的手段?
正確消費者提交消費位移時提交的是當前消費到的最新消息的offset還是offset+1?
offset+1有哪些情形會造成重復(fù)消費悄窃?
消費者消費后沒有commit offset(程序崩潰/強行kill/消費耗時/自動提交偏移情況下unscrible)那些情景下會造成消息漏消費讥电?
消費者沒有處理完消息 提交offset(自動提交偏移 未處理情況下程序異常結(jié)束)KafkaConsumer是非線程安全的,那么怎么樣實現(xiàn)多線程消費轧抗?
每個線程一個消費者簡述消費者與消費組之間的關(guān)系
消費者從屬與消費組恩敌,消費偏移以消費組為單位。每個消費組可以獨立消費主題的所有數(shù)據(jù)横媚,同一消費組內(nèi)消費者共同消費主題數(shù)據(jù)纠炮,每個分區(qū)只能被同一消費組內(nèi)一個消費者消費。當你使用kafka-topics.sh創(chuàng)建(刪除)了一個topic之后灯蝴,Kafka背后會執(zhí)行什么邏輯恢口?
創(chuàng)建:在zk上/brokers/topics/下節(jié)點 kafkabroker會監(jiān)聽節(jié)點變化創(chuàng)建主題
刪除:調(diào)用腳本刪除topic會在zk上將topic設(shè)置待刪除標志,kafka后臺有定時的線程會掃描所有需要刪除的topic進行刪除topic的分區(qū)數(shù)可不可以增加穷躁?如果可以怎么增加耕肩?如果不可以,那又是為什么?
可以增加topic的分區(qū)數(shù)可不可以減少猿诸?如果可以怎么減少婚被?如果不可以,那又是為什么梳虽?
不能減少 會丟失數(shù)據(jù)創(chuàng)建topic時如何選擇合適的分區(qū)數(shù)址芯?
根據(jù)集群的機器數(shù)量和需要的吞吐量來決定適合的分區(qū)數(shù)Kafka目前有那些內(nèi)部topic,它們都有什么特征窜觉?各自的作用又是什么谷炸?
__consumer_offsets 以雙下劃線開頭,保存消費組的偏移優(yōu)先副本是什么竖螃?它有什么特殊的作用淑廊?
優(yōu)先副本 會是默認的leader副本 發(fā)生leader變化時重選舉會優(yōu)先選擇優(yōu)先副本作為leaderKafka有哪幾處地方有分區(qū)分配的概念逗余?簡述大致的過程及原理
創(chuàng)建主題時
如果不手動指定分配方式 有兩種分配方式消費組內(nèi)分配
簡述Kafka的日志目錄結(jié)構(gòu)
每個partition一個文件夾特咆,包含四類文件.index .log .timeindex leader-epoch-checkpoint
.index .log .timeindex 三個文件成對出現(xiàn) 前綴為上一個segment的最后一個消息的偏移 log文件中保存了所有的消息 index文件中保存了稀疏的相對偏移的索引 timeindex保存的則是時間索引
leader-epoch-checkpoint中保存了每一任leader開始寫入消息時的offset 會定時更新
follower被選為leader時會根據(jù)這個確定哪些消息可用Kafka中有那些索引文件?
如上如果我指定了一個offset录粱,Kafka怎么查找到對應(yīng)的消息腻格?
- 通過文件名前綴數(shù)字x找到該絕對offset 對應(yīng)消息所在文件
- offset-x為在文件中的相對偏移
3.通過index文件中記錄的索引找到最近的消息的位置
4.從最近位置開始逐條尋找
如果我指定了一個timestamp,Kafka怎么查找到對應(yīng)的消息啥繁?
原理同上 但是時間的因為消息體中不帶有時間戳 所以不精確聊一聊你對Kafka的Log Retention的理解
kafka留存策略包括 刪除和壓縮兩種
刪除: 根據(jù)時間和大小兩個方式進行刪除 大小是整個partition日志文件的大小
超過的會從老到新依次刪除 時間指日志文件中的最大時間戳而非文件的最后修改時間
壓縮: 相同key的value只保存一個 壓縮過的是clean 未壓縮的dirty 壓縮之后的偏移量不連續(xù) 未壓縮時連續(xù)聊一聊你對Kafka的Log Compaction的理解
如上