1.kafka 的設計時什麼樣的呢?
kafka 將訊息以 topic 為單位進行歸納
將向 kafka topic 發布訊息的程式成為 producers.
將預訂 topics 並消費訊息的程式成為 consumer.
kafka 以集群的方式執行,可以由乙個或多個服務組成,每個服務叫做乙個 broker.
producers 通過網路將訊息傳送到 kafka 集群,集群向消費者提供訊息
2.資料傳輸的事物定義有哪三種?
資料傳輸的事務定義通常有以下三種級別:
( 1)最多一次: 訊息不會被重**送,最多被傳輸一次,但也有可能一次不傳輸
( 2)最少一次: 訊息不會被漏傳送,最少被傳輸一次,但也有可能被重複傳輸.
( 3)精確的一次( exactly once) : 不會漏傳輸也不會重複傳輸,每個訊息都傳輸被一次而且僅僅被傳輸一次,這是大家所期望的
3.kafka 判斷乙個節點是否還活著有那兩個條件?
( 1)節點必須可以維護和 zookeeper 的連線, zookeeper 通過心跳機制檢查每個節點的連線
(2)如果節點是個 follower,他必須能及時的同步 leader 的寫操作,延時不能太久
4.producer 是否直接將資料傳送到 broker 的 leader(主節點)?
producer 直接將資料傳送到 broker 的 leader(主節點),不需要在多個節點進行分發,為了幫助 producer 做到這點,所有的 kafka 節點都可以及時的告知:哪些節點是活動的,目標topic 目標分割槽的 leader 在哪。這樣 producer 就可以直接將訊息傳送到目的地了
5、 kafa consumer 是否可以消費指定分割槽訊息?
kafa consumer 消費訊息時,向 broker 發出"fetch"請求去消費特定分割槽的訊息, consumer指定訊息在日誌中的偏移量( offset),就可以消費從這個位置開始的訊息, customer 擁有了 offset 的控制權,可以向後回滾去重新消費之前的訊息,這是很有意義的
6、 kafka 訊息是採用 pull 模式,還是 push 模式?
kafka 最初考慮的問題是, customer 應該從 brokes 拉取訊息還是 brokers 將訊息推送到consumer,也就是 pull 還 push。在這方面, kafka 遵循了一種大部分訊息系統共同的傳統的設計: producer 將訊息推送到 broker, consumer 從 broker 拉取訊息
一些訊息系統比如 scribe 和 apache flume 採用了 push 模式,將訊息推送到下游的consumer。這樣做有好處也有壞處:由 broker 決定訊息推送的速率,對於不同消費速率的consumer 就不太好處理了。訊息系統都致力於讓 consumer 以最大的速率最快速的消費訊息,但不幸的是, push 模式下,當 broker 推送的速率遠大於 consumer 消費的速率時,consumer 恐怕就要崩潰了。最終 kafka 還是選取了傳統的 pull 模式
pull 模式的另外乙個好處是 consumer 可以自主決定是否批量的從 broker 拉取資料。 push模式必須在不知道下游 consumer 消費能力和消費策略的情況下決定是立即推送每條訊息還是快取之後批量推送。如果為了避免 consumer 崩潰而採用較低的推送速率,將可能導致一次只推送較少的訊息而造成浪費。 pull 模式下, consumer 就可以根據自己的消費能力去決定這些策略
pull 有個缺點是,如果 broker 沒有可供消費的訊息,將導致 consumer 不斷在迴圈中輪詢,直到新訊息到 t 達。為了避免這點, kafka 有個引數可以讓 consumer 阻塞知道新訊息到達(當然也可以阻塞知道訊息的數量達到某個特定的量這樣就可以批量發)
7.kafka 儲存在硬碟上的訊息格式是什麼?
訊息由乙個固定長度的頭部和可變長度的位元組陣列組成。頭部包含了乙個版本號和 crc32校驗碼。
1.訊息長度: 4 bytes (value: 1+4+n)
2.版本號: 1 byte
3crc 校驗碼: 4 bytes
4.具體的訊息: n bytes
8.kafka 高效檔案儲存設計特點:
(1).kafka 把 topic 中乙個 parition 大檔案分成多個小檔案段,通過多個小檔案段,就容易定期清除或刪除已經消費完檔案,減少磁碟占用。
(2).通過索引資訊可以快速定位 message 和確定 response 的最大大小。
(3).通過 index 元資料全部對映到 memory,可以避免 segment file 的 io 磁碟操作。
(4).通過索引檔案稀疏儲存,可以大幅降低 index 檔案元資料占用空間大小。
9.kafka 與傳統訊息系統之間有三個關鍵區別
(1).kafka 持久化日誌,這些日誌可以被重複讀取和無限期保留
(2).kafka 是乙個分布式系統:它以集群的方式執行,可以靈活伸縮,在內部通過複製資料提公升容錯能力和高可用性
(3).kafka 支援實時的流式處理
10.kafka 建立 topic 時如何將分割槽放置到不同的 broker 中
副本因子不能大於 broker 的個數;
第乙個分割槽(編號為 0)的第乙個副本放置位置是隨機從 brokerlist 選擇的;
其他分割槽的第乙個副本放置位置相對於第 0 個分割槽依次往後移。也就是如果我們有 5 個broker, 5 個分割槽,假設第乙個分割槽放在第四個 broker 上,那麼第二個分割槽將會放在第五個 broker 上;第三個分割槽將會放在第乙個 broker 上;第四個分割槽將會放在第二個broker 上,依次類推;
剩餘的副本相對於第乙個副本放置位置其實是由 nextreplicashift 決定的,而這個數也是隨機產生的
11.kafka 新建的分割槽會在哪個目錄下建立
在啟動 kafka 集群之前,我們需要配置好 log.dirs 引數,其值是 kafka 資料的存放目錄,這個引數可以配置多個目錄,目錄之間使用逗號分隔,通常這些目錄是分布在不同的磁碟上用於提高讀寫效能。
當然我們也可以配置 log.dir 引數,含義一樣。只需要設定其中乙個即可。
如果 log.dirs 引數只配置了乙個目錄,那麼分配到各個 broker 上的分割槽肯定只能在這個目錄下建立資料夾用於存放資料。但是如果 log.dirs 引數配置了多個目錄,那麼 kafka 會在哪個資料夾中建立分割槽目錄呢?
答案是: kafka 會在含有分割槽目錄最少的資料夾中建立新的分割槽目錄,分割槽目錄名為 topic名+分割槽 id。注意,是分割槽資料夾總數最少的目錄,而不是磁碟使用量最少的目錄!也就是說,如果你給 log.dirs 引數新增了乙個新的磁碟,新的分割槽目錄肯定是先在這個新的磁碟上建立直到這個新的磁碟目錄擁有的分割槽目錄不是最少為止。
12.partition 的資料如何儲存到硬碟
topic 中的多個 partition 以資料夾的形式儲存到 broker,每個分割槽序號從 0 遞增,且訊息有序
partition 檔案下有多個 segment( ***.index, ***.log)
segment 檔案裡的 大小和配置檔案大小一致可以根據要求修改 預設為 1g
如果大小大於 1g 時,會滾動乙個新的 segment 並且以上乙個 segment 最後一條訊息的偏移量命名
13.kafka 的 ack 機制
request.required.acks 有三個值 0 1 -1
0:生產者不會等待 broker 的 ack,這個延遲最低但是儲存的保證最弱當 server 掛掉的時候就會丟資料
1:服務端會等待 ack 值 leader 副本確認接收到訊息後傳送 ack 但是如果 leader 掛掉後他不確保是否複製完成新 leader 也會導致資料丟失
-1:同樣在 1 的基礎上 服務端會等所有的 follower 的副本受到資料後才會受到 leader 發出的 ack,這樣資料不會丟失
14.kafka 的消費者如何消費資料
消費者每次消費資料的時候,消費者都會記錄消費的物理偏移量( offset)的位置等到下次消費時,他會接著上次位置繼續消費
15.消費者負載均衡策略
乙個消費者組中的乙個分片對應乙個消費者成員,他能保證每個消費者成員都能訪問,如果組中成員太多會有空閒的成員
16.資料有序
乙個消費者組裡它的內部是有序的
消費者組與消費者組之間是無序的
17.kafaka 生產資料時資料的分組策略
生產者決定資料產生到集群的哪個 partition 中
每一條訊息都是以( key, value)格式
key是由生產者傳送資料傳入
所以生產者( key)決定了資料產生到集群的哪個 partition
kafka常見面試題
ar 所有的分割槽副本 isr 所有與leader保持同步的副本集合 osr 被leader剔除isr的集合 當副本在一定時間未與leader進行同步就會被提出isr。leo 每個副本中最大的 offset hw 消費者能見到的最大的 offset,isr中最小的leo kafka的分割槽每次寫入訊...
kafka常見面試題
1 為什麼要使用 kafka,為什麼要使用訊息佇列 緩衝和削峰 解耦和擴充套件性 冗餘 健壯性 非同步通訊 2 kafka的acks引數對訊息持久化的影響 往kafka寫資料的時候,就可以來設定這個acks引數。然後這個引數實際上有三種常見的值可以設定,分別是 0 1 和 all 等價於 1 api...
常見面試題整理
題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 注意點 1.返回值是否為該型別的引用。如果為該型別引用則可連續賦值。如果返回void,則無法通過編譯 2.傳入引數是否宣告為常量引用。如果傳入引數不是常量引用,則會有一次非必要的拷貝構造函式呼叫 ...