- Kafka的用途有哪些枷踏?使用場景如何凿可?
總結(jié)下來就幾個(gè)字:異步處理、日常系統(tǒng)解耦涉馅、削峰归园、提速、廣播
如果再說具體一點(diǎn)例如:消息,網(wǎng)站活動(dòng)追蹤,監(jiān)測指標(biāo),日志聚合,流處理,事件采集,提交日志等
- Kafka中的ISR稚矿、AR又代表什么庸诱?ISR的伸縮又指什么
ISR:In-Sync Replicas 副本同步隊(duì)列
AR:Assigned Replicas 所有副本
ISR是由leader維護(hù),follower從leader同步數(shù)據(jù)有一些延遲(包括延遲時(shí)間replica.lag.time.max.ms和延遲條數(shù)replica.lag.max.messages兩個(gè)維度, 當(dāng)前最新的版本0.10.x中只支持replica.lag.time.max.ms這個(gè)維度)晤揣,任意一個(gè)超過閾值都會(huì)把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表桥爽,新加入的follower也會(huì)先存放在OSR中。AR=ISR+OSR昧识。
- Kafka中的HW聚谁、LEO、LSO滞诺、LW等分別代表什么形导?
HW:High Watermark 高水位,取一個(gè)partition對(duì)應(yīng)的ISR中最小的LEO作為HW习霹,consumer最多只能消費(fèi)到HW所在的位置上一條信息朵耕。
LEO:LogEndOffset 當(dāng)前日志文件中下一條待寫信息的offset
HW/LEO這兩個(gè)都是指最后一條的下一條的位置而不是指最后一條的位置。
LSO:Last Stable Offset 對(duì)未完成的事務(wù)而言淋叶,LSO 的值等于事務(wù)中第一條消息的位置(firstUnstableOffset)阎曹,對(duì)已完成的事務(wù)而言煞檩,它的值同 HW 相同
LW:Low Watermark 低水位, 代表 AR 集合中最小的 logStartOffset 值
Kafka中是怎么體現(xiàn)消息順序性的处嫌?
kafka每個(gè)partition中的消息在寫入時(shí)都是有序的,消費(fèi)時(shí)斟湃,每個(gè)partition只能被每一個(gè)group中的一個(gè)消費(fèi)者消費(fèi)注暗,保證了消費(fèi)時(shí)也是有序的。
整個(gè)topic不保證有序毙沾。如果為了保證topic整個(gè)有序乳愉,那么將partition調(diào)整為1.Kafka中的分區(qū)器、序列化器备闲、攔截器是否了解泻骤?它們之間的處理順序是什么?
攔截器->序列化器->分區(qū)器Kafka生產(chǎn)者客戶端中使用了幾個(gè)線程來處理希柿?分別是什么挤悉?
2個(gè),主線程和Sender線程。主線程負(fù)責(zé)創(chuàng)建消息装悲,然后通過分區(qū)器昏鹃、序列化器、攔截器作用之后緩存到累加器RecordAccumulator中诀诊。Sender線程負(fù)責(zé)將RecordAccumulator中消息發(fā)送到kafka中.“消費(fèi)組中的消費(fèi)者個(gè)數(shù)如果超過topic的分區(qū)洞渤,那么就會(huì)有消費(fèi)者消費(fèi)不到數(shù)據(jù)”這句話是否正確?如果不正確属瓣,那么有沒有什么hack的手段载迄?
不正確,通過自定義分區(qū)分配策略抡蛙,可以將一個(gè)consumer指定消費(fèi)所有partition护昧。消費(fèi)者提交消費(fèi)位移時(shí)提交的是當(dāng)前消費(fèi)到的最新消息的offset還是offset+1?
offset+1有哪些情形會(huì)造成重復(fù)消費(fèi)?
消費(fèi)者消費(fèi)后沒有commit offset(程序崩潰/強(qiáng)行kill/消費(fèi)耗時(shí)/自動(dòng)提交偏移情況下unscrible)那些情景下會(huì)造成消息漏消費(fèi)粗截?
消費(fèi)者沒有處理完消息 提交offset(自動(dòng)提交偏移 未處理情況下程序異常結(jié)束)KafkaConsumer是非線程安全的惋耙,那么怎么樣實(shí)現(xiàn)多線程消費(fèi)?
1.在每個(gè)線程中新建一個(gè)KafkaConsumer
2.單線程創(chuàng)建KafkaConsumer熊昌,多個(gè)處理線程處理消息(難點(diǎn)在于是否要考慮消息順序性绽榛,offset的提交方式)
簡述消費(fèi)者與消費(fèi)組之間的關(guān)系
消費(fèi)者從屬與消費(fèi)組,消費(fèi)偏移以消費(fèi)組為單位婿屹。每個(gè)消費(fèi)組可以獨(dú)立消費(fèi)主題的所有數(shù)據(jù)蒜田,同一消費(fèi)組內(nèi)消費(fèi)者共同消費(fèi)主題數(shù)據(jù),每個(gè)分區(qū)只能被同一消費(fèi)組內(nèi)一個(gè)消費(fèi)者消費(fèi)选泻。當(dāng)你使用kafka-topics.sh創(chuàng)建(刪除)了一個(gè)topic之后冲粤,Kafka背后會(huì)執(zhí)行什么邏輯?
創(chuàng)建:在zk上/brokers/topics/下節(jié)點(diǎn) kafkabroker會(huì)監(jiān)聽節(jié)點(diǎn)變化創(chuàng)建主題
刪除:調(diào)用腳本刪除topic會(huì)在zk上將topic設(shè)置待刪除標(biāo)志页眯,kafka后臺(tái)有定時(shí)的線程會(huì)掃描所有需要?jiǎng)h除的topic進(jìn)行刪除topic的分區(qū)數(shù)可不可以增加梯捕?如果可以怎么增加?如果不可以窝撵,那又是為什么傀顾?
可以topic的分區(qū)數(shù)可不可以減少?如果可以怎么減少碌奉?如果不可以短曾,那又是為什么?
不可以創(chuàng)建topic時(shí)如何選擇合適的分區(qū)數(shù)赐劣?
根據(jù)集群的機(jī)器數(shù)量和需要的吞吐量來決定適合的分區(qū)數(shù)Kafka目前有那些內(nèi)部topic嫉拐,它們都有什么特征?各自的作用又是什么魁兼?
__consumer_offsets 以下劃線開頭婉徘,保存消費(fèi)組的偏移優(yōu)先副本是什么?它有什么特殊的作用?
優(yōu)先副本 會(huì)是默認(rèn)的leader副本 發(fā)生leader變化時(shí)重選舉會(huì)優(yōu)先選擇優(yōu)先副本作為leaderKafka有哪幾處地方有分區(qū)分配的概念盖呼?簡述大致的過程及原理
創(chuàng)建主題時(shí)
如果不手動(dòng)指定分配方式 有兩種分配方式
消費(fèi)組內(nèi)分配
簡述Kafka的日志目錄結(jié)構(gòu)
每個(gè)partition一個(gè)文件夾儒鹿,包含四類文件.index .log .timeindex leader-epoch-checkpoint
.index .log .timeindex 三個(gè)文件成對(duì)出現(xiàn) 前綴為上一個(gè)segment的最后一個(gè)消息的偏移 log文件中保存了所有的消息 index文件中保存了稀疏的相對(duì)偏移的索引 timeindex保存的則是時(shí)間索引
leader-epoch-checkpoint中保存了每一任leader開始寫入消息時(shí)的offset 會(huì)定時(shí)更新
follower被選為leader時(shí)會(huì)根據(jù)這個(gè)確定哪些消息可用如果我指定了一個(gè)offset,Kafka怎么查找到對(duì)應(yīng)的消息几晤?
1.通過文件名前綴數(shù)字x找到該絕對(duì)offset 對(duì)應(yīng)消息所在文件
2.offset-x為在文件中的相對(duì)偏移
3.通過index文件中記錄的索引找到最近的消息的位置
4.從最近位置開始逐條尋找
如果我指定了一個(gè)timestamp约炎,Kafka怎么查找到對(duì)應(yīng)的消息?
原理同上 但是時(shí)間的因?yàn)橄Ⅲw中不帶有時(shí)間戳 所以不精確聊一聊你對(duì)Kafka的Log Retention的理解
kafka留存策略包括 刪除和壓縮兩種
刪除: 根據(jù)時(shí)間和大小兩個(gè)方式進(jìn)行刪除 大小是整個(gè)partition日志文件的大小
超過的會(huì)從老到新依次刪除 時(shí)間指日志文件中的最大時(shí)間戳而非文件的最后修改時(shí)間
壓縮: 相同key的value只保存一個(gè) 壓縮過的是clean 未壓縮的dirty 壓縮之后的偏移量不連續(xù) 未壓縮時(shí)連續(xù)