1. Kafka常見面試題解答

        共 3088字,需瀏覽 7分鐘

         ·

        2022-07-12 06:32

        1.Kafka中的ISR(InSyncRepli)、OSR(OutSyncRepli)、AR(AllRepli)代表什么?
        • ISR : 速率和leader相差低于10秒的follower的集合
        • OSR : 速率和leader相差大于10秒的follower
        • AR : 所有分區(qū)的follower
        2.Kafka中的HW、LEO等分別代表什么?
        • HW : 又名高水位,根據(jù)同一分區(qū)中,最低的LEO所決定
        • LEO : 每個(gè)分區(qū)的最高offset
        3.Kafka的用途有哪些?使用場(chǎng)景如何?
        1. 用戶追蹤:根據(jù)用戶在web或者app上的操作,將這些操作消息記錄到各個(gè)topic中,然后消費(fèi)者通過訂閱這些消息做實(shí)時(shí)的分析,或者記錄到HDFS,用于離線分析或數(shù)據(jù)挖掘
        2. 日志收集:通過kafka對(duì)各個(gè)服務(wù)的日志進(jìn)行收集,再開放給各個(gè)consumer
        3. 消息系統(tǒng):緩存消息
        4. 運(yùn)營(yíng)指標(biāo):記錄運(yùn)營(yíng)監(jiān)控?cái)?shù)據(jù),收集操作應(yīng)用數(shù)據(jù)的集中反饋,如報(bào)錯(cuò)和報(bào)告
        4.Kafka中是怎么體現(xiàn)消息順序性的?

        每個(gè)分區(qū)內(nèi),每條消息都有offset,所以只能在同一分區(qū)內(nèi)有序,但不同的分區(qū)無法做到消息順序性

        5.“消費(fèi)組中的消費(fèi)者個(gè)數(shù)如果超過topic的分區(qū),那么就會(huì)有消費(fèi)者消費(fèi)不到數(shù)據(jù)”這句話是否正確?

        對(duì)的,超過分區(qū)數(shù)的消費(fèi)者就不會(huì)再接收數(shù)據(jù)

        6.有哪些情形會(huì)造成重復(fù)消費(fèi)?或丟失信息?
        • 先處理后提交offset,會(huì)造成重讀消費(fèi)
        • 先提交offset后處理,會(huì)造成數(shù)據(jù)丟失
        7.Kafka 分區(qū)的目的?

        對(duì)于kafka集群來說,分區(qū)可以做到負(fù)載均衡,對(duì)于消費(fèi)者來說,可以提高并發(fā)度,提高讀取效率。

        8.Kafka 的高可靠性是怎么實(shí)現(xiàn)的?

        為了實(shí)現(xiàn)高可靠性,kafka使用了訂閱的模式,并使用isr和ack應(yīng)答機(jī)制,能進(jìn)入isr中的follower和leader之間的速率不會(huì)相差10秒

        • 當(dāng)ack=0時(shí),producer不等待broker的ack,不管數(shù)據(jù)有沒有寫入成功,都不再重復(fù)發(fā)該數(shù)據(jù)
        • 當(dāng)ack=1時(shí),broker會(huì)等到leader寫完數(shù)據(jù)后,就會(huì)向producer發(fā)送ack,但不會(huì)等follower同步數(shù)據(jù),如果這時(shí)leader掛掉,producer會(huì)對(duì)新的leader發(fā)送新的數(shù)據(jù),在old的leader中不同步的數(shù)據(jù)就會(huì)丟失
        • 當(dāng)ack=-1或者all時(shí),broker會(huì)等到leader和isr中的所有follower都同步完數(shù)據(jù),再向producer發(fā)送ack,有可能造成數(shù)據(jù)重復(fù)
        9.topic的分區(qū)數(shù)可不可以增加?如果可以怎么增加?如果不可以,那又是為什么?

        可以增加

        bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-config --partitions 3
        10.topic的分區(qū)數(shù)可不可以減少?如果可以怎么減少?如果不可以,那又是為什么?

        不可以,先有的分區(qū)數(shù)據(jù)難以處理

        11.簡(jiǎn)述Kafka的日志目錄結(jié)構(gòu)?

        每一個(gè)分區(qū)對(duì)應(yīng)一個(gè)文件夾,命名為topic-0,topic-1,每個(gè)文件夾內(nèi)有.index和.log文件

        12.如何解決消費(fèi)者速率低的問題?

        增加分區(qū)數(shù)和消費(fèi)者數(shù)

        13.Kafka的那些設(shè)計(jì)讓它有如此高的性能??
        1. kafka是分布式的消息隊(duì)列
        2. 對(duì)log文件進(jìn)行了segment,并對(duì)segment建立了索引
        3. (對(duì)于單節(jié)點(diǎn))使用了順序讀寫,速度可以達(dá)到600M/s
        4. 引用了zero拷貝,在os系統(tǒng)就完成了讀寫操作
        14.kafka啟動(dòng)不起來的原因?

        在關(guān)閉kafka時(shí),先關(guān)了zookeeper,就會(huì)導(dǎo)致kafka下一次啟動(dòng)時(shí),會(huì)報(bào)節(jié)點(diǎn)已存在的錯(cuò)誤

        只要把zookeeper中的zkdata/version-2的文件夾刪除即可

        15.聊一聊Kafka Controller的作用?

        負(fù)責(zé)kafka集群的上下線工作,所有topic的副本分區(qū)分配和選舉leader工作

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

        在ISR中需要選擇,選擇策略為先到先得

        17.失效副本是指什么?有那些應(yīng)對(duì)措施?
        • 失效副本為速率比leader相差大于10秒的follower
        • 將失效的follower先提出ISR
        • 等速率接近leader10秒內(nèi),再加進(jìn)ISR
        18.Kafka消息是采用Pull模式,還是Push模式?
        • 在producer階段,是向broker用Push模式
        • 在consumer階段,是向broker用Pull模式

        在Pull模式下,consumer可以根據(jù)自身速率選擇如何拉取數(shù)據(jù),避免了低速率的consumer發(fā)生崩潰的問題

        但缺點(diǎn)是,consumer要時(shí)不時(shí)的去詢問broker是否有新數(shù)據(jù),容易發(fā)生死循環(huán),內(nèi)存溢出。

        學(xué)習(xí)資料:Java進(jìn)階視頻資源

        19.Kafka創(chuàng)建Topic時(shí)如何將分區(qū)放置到不同的Broker中?

        首先副本數(shù)不能超過broker數(shù)

        • 第一分區(qū)是隨機(jī)從Broker中選擇一個(gè),然后其他分區(qū)相對(duì)于0號(hào)分區(qū)依次向后移
        • 第一個(gè)分區(qū)是從nextReplicaShift決定的,而這個(gè)數(shù)也是隨機(jī)產(chǎn)生的
        20.Kafka中的事務(wù)是怎么實(shí)現(xiàn)的?☆☆☆☆☆

        kafka事務(wù)有兩種:

        producer事務(wù)和consumer事務(wù)

        producer事務(wù)是為了解決kafka跨分區(qū)跨會(huì)話問題,kafka不能跨分區(qū)跨會(huì)話的主要問題是每次啟動(dòng)的producer的PID都是系統(tǒng)隨機(jī)給的

        所以為了解決這個(gè)問題,我們就要手動(dòng)給producer一個(gè)全局唯一的id,也就是transaction id 簡(jiǎn)稱TID

        我們將TID和PID進(jìn)行綁定,在producer帶著TID和PID第一次向broker注冊(cè)時(shí),broker就會(huì)記錄TID,并生成一個(gè)新的組件transaction_state用來保存TID的事務(wù)狀態(tài)信息。當(dāng)producer重啟后,就會(huì)帶著TID和新的PID向broker發(fā)起請(qǐng)求,當(dāng)發(fā)現(xiàn)TID一致時(shí),producer就會(huì)獲取之前的PID,將覆蓋掉新的PID,并獲取上一次的事務(wù)狀態(tài)信息,從而繼續(xù)上次工作

        consumer事務(wù)相對(duì)于producer事務(wù)就弱一點(diǎn),需要先確保consumer的消費(fèi)和提交位置為一致且具有事務(wù)功能,才能保證數(shù)據(jù)的完整,不然會(huì)造成數(shù)據(jù)的丟失或重復(fù)

        21.Kafka中的分區(qū)器、序列化器、攔截器是否了解?它們之間的處理順序是什么?

        攔截器>序列化器>分區(qū)器

        22.Kafka生產(chǎn)者客戶端的整體結(jié)構(gòu)是什么樣子的?使用了幾個(gè)線程來處理?分別是什么?

        使用兩個(gè)線程:

        main線程和sender線程

        main線程會(huì)依次經(jīng)過攔截器,序列化器,分區(qū)器將數(shù)據(jù)發(fā)送到RecourdAccumlator(線程共享變量)。再由sender線程從RecourdAccumlator中拉取數(shù)據(jù)發(fā)送到kafka broker

        相關(guān)參數(shù):

        • batch.size:只有數(shù)據(jù)積累到batch.size之后,sender才會(huì)發(fā)送數(shù)據(jù)。
        • linger.ms:如果數(shù)據(jù)遲遲未達(dá)到batch.size,sender等待linger.time之后就會(huì)發(fā)送數(shù)據(jù)。
        23.消費(fèi)者提交消費(fèi)位移時(shí)提交的是當(dāng)前消費(fèi)到的最新消息的offset還是offset+1?

        offset + 1

        圖示:

        生產(chǎn)者發(fā)送數(shù)據(jù)offset是從0開始的

        消費(fèi)者消費(fèi)的數(shù)據(jù)offset是從offset+1開始的

        來源:blog.csdn.net/C_Xiang_Falcon/

        article/details/100917145

        轉(zhuǎn)自:Java知音


        瀏覽 41
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 国产美女一区二区免费视频 | 91小仙女jK白丝袜呻吟 | 91p国产 | 影音先锋无码资源 | 亚洲黄色小说网站 |