kafka 都有哪些特點?
高吞吐量,低延遲
可以熱擴展
并發度高
具有容錯性(掛的只剩1臺也能正常跑)
可靠性高
在哪些場景下會選擇 kafka? kafka的一些應用
- 日志收集:一個公司可以用kafka可以收集各種服務的log,通過kafka以統一介面服務的方式開放給各種consumer,例如hadoop、HBase、Solr等,
- 訊息系統:解耦和生產者和消費者、快取訊息等,
- 用戶行為跟蹤:kafka經常被用來記錄web用戶或者app用戶的各種活動,如瀏覽網頁、搜索、點擊等活動,這些活動資訊被各個服務器發布到kafka的topic中,然后訂閱者通過訂閱這些topic來做實時的監控分析,或者裝載到hadoop、資料倉庫中做離線分析和挖掘,
- 運營指標:kafka也經常用來記錄運營監控資料,包括收集各種分布式應用的資料,生產各種操作的集中反饋,比如報警和報告,
- 作為流式處理的資料源:比如spark streaming和 Flink
kafka 磁區的目的?
磁區對于kafka集群的好處是:實作負載均衡,
磁區對于消費者和生產者來說,可以提高并行度,提高效率,--------提高消費者的并行度---》消費者組
kafka 是如何做到訊息的有序性?
kafka中的每個 partition 中的訊息在寫入時都是有序的(不斷追加),而且單獨一個 partition只能由一個消費者去消費,可以在里面保證訊息的順序性,但是磁區之間的訊息是不保證有序的,
kafka 的高可靠性是怎么實作的?
多副本存盤
Producer發送資料時可配置ack=all, 并且里面有hw 還有leader-epoch
kafka資料一致性原理
一致性指的是不論在什么情況下,Consumer都能讀到一致的資料,
HW 高水位線 在0.11版本之前,只用了高水位線來保證,但是這個里面其實是會出現一些問題的,比如資料丟失,即使是ack等于-1的情況下,也可能會丟資料
LEO等
在0.11版本之后,新加了一個角色叫leader的紀元號,根據高水位線和紀元號來處理,再配上ack=-1的時候,基本上就不會丟資料了,,,,
kafka 在什么情況下會出現訊息丟失?
- topic的副本如果只有1個,那么一旦這個副本所在broker服務器宕機,則有可能丟失;
- producer往kafka寫入資料時,如果確認機制引數acks !=all,也可能會造成資料丟失;
- 不清潔選舉機制如果開啟,也可能造成資料丟失(不清潔選舉就是說在所有ISR副本全部宕機的情況下,可以讓OSR副本成為Leader,而OSR中的資料顯然不全;那么,就算之前的Leader重新上線了,也會被進行日志截斷)
怎么盡可能保證 kafka 的可靠性
副本數>1
ack=all
min.insync.replicas >= 2
資料傳輸的語意有幾種?
資料傳輸的語意通常有以下三種級別:
設定消費者里面有enable.auto.commit = true/false
- 最多一次: 訊息不會被重復發送,最多被傳輸一次,但也有可能一次不傳輸
- 最少一次: 訊息不會被漏發送,最少被傳輸一次,但也有可能被重復傳輸
- 精確一次(Exactly once): 不會漏傳輸也不會重復傳輸
kafka 消費者是否可以消費指定磁區的訊息?
可以,通過assign的方式指定要消費的topic及磁區
如果我是subscribe 可以在在均衡監聽器的第二個重寫方法中使用
kafka 消費者是否從指定偏移量開始消費?
可以,通過seek指定偏移量后再開始消費
客戶端操作kafka訊息是采用poll模式,還是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不斷在回圈中輪詢,直到新訊息到達,為了避免這點,Kafka有個引數可以讓consumer阻塞直到新訊息到達(當然也可以阻塞直到訊息的數量達到某個特定的量這樣就可以批量拉取)
kafka 高效檔案存盤設計特點
Kafka把topic中一個parition大檔案分成多個小檔案段,通過多個小檔案段,就容易定期清除或洗掉已經消費完檔案,減少磁盤占用, 默認存盤時間7天
通過索引資訊可以快速定位message和確定response的最大大小,
通過index元資料全部映射到memory,可以避免segment file的IO磁盤操作,
通過索引檔案稀疏存盤,可以大幅降低index檔案元資料占用空間大小
kafka創建Topic時如何將磁區分配給各Broker
- 副本因子不能大于 Broker 的個數;
- 第1個磁區(partition_0)的第1個副本放置位置是隨機從brokerList選擇的;
- 其他磁區的第一個副本放置位置相對于partition_0依次往后移,
如果我們有5個 Broker,5個磁區,假設第1個磁區放在第四個 Broker 上,那么第2個磁區將會放在第五個 Broker 上;第3個磁區將會放在第一個 Broker 上;第4個磁區將會放在第二個 Broker 上,依次類推;
- 各磁區剩余的副本相對于第一個副本放置位置由一個亂數nextReplicaShift決定;
kafka的磁區分布策略是怎樣的?
磁區分布的計算策略如下
- 副本因子不能大于 Broker 的個數;
- 第一個磁區(編號為0)的第一個副本放置位置是隨機從 brokerList 選擇的;
- 其他磁區的第一個副本放置位置相對于第0個磁區依次往后移,也就是如果我們有5個 Broker,5個磁區,假設第1個磁區放在第四個 Broker 上,那么第2個磁區將會放在第五個 Broker 上;第3個磁區將會放在第一個 Broker 上;第4個磁區將會放在第二個 Broker 上,依次類推;
- 剩余副本相對于第1個副本放置位置是由一個亂數nextReplicaShift 決定
kafka磁區數可以增加或減少嗎?為什么?
kafka允許對topic動態增加磁區,但不支持減少磁區
Kafka 磁區資料不支持減少是由很多原因的,比如減少的磁區其資料放到哪里去?是洗掉,還是保留?洗掉的話,那么這些沒消費的訊息不就丟了,如果保留這些訊息如何放到其他磁區里面?追加到其他磁區后面的話那么就破壞了 Kafka 單個磁區的有序性,如果要保證洗掉磁區資料插入到其他磁區保證有序性,那么實作起來邏輯就會非常復雜,
kafka監控插件都有哪些?
kafka manager
kafka-offset-monitor :主要做消費者偏移量的監控
kafka-eagle:功能很強大!(現已改名為:EFAK —— eagle for apache kafka)
kafka 的消費者組磁區分配再均衡
在Kafka中,當有新消費者加入或者訂閱的topic數發生變化時,會觸發rebalance(再均衡:在同一個消費者組當中,磁區的所有權從一個消費者轉移到另外一個消費者)機制,Rebalance顧名思義就是重新均衡消費者消費,
Rebalance的程序如下:
- 第一步:所有成員都向coordinator發送請求,請求入組,一旦所有成員都發送了請求,coordinator會從中選擇一個consumer擔任leader的角色,并把組成員資訊以及訂閱資訊發給leader,
- 第二步:leader開始分配消費方案,指明具體哪個consumer負責消費哪些topic的哪些partition,一旦完成分配,leader會將這個方案發給coordinator,coordinator接收到分配方案之后會把方案發給各個consumer,這樣組內的所有成員就都知道自己應該消費哪些磁區了,
對于rebalance來說,group coordinator起著至關重要的作用
消費者和消費者組有什么關系?
每個消費者從屬于消費組,消費者通過一個引數:group.id 來指定所屬的組;
可以把多個消費者的group.id設定成同一個值,那么這幾個消費者就屬于同一個組;
比如,讓c-1,c-2,c-3的group.id=“g1",那么c-1,c-2,c-3這3個消費者都屬于g1消費組;
一個消費者,在本質上究竟如何定義:一個消費者可以是一個執行緒,也可以是一個行程,本質上就是一個consumer物件實體!
消費者組的意義:(可以讓多個消費者組成一個組,并共同協作來消費資料,提高消費并行度)一個消費組中的各消費者,在消費一個topic的資料時,互相不重復!如果topic的某磁區被組中的一個消費消費,那么,其他消費者就不會再消費這個磁區了;
kafka新建的磁區會在哪創建存盤目錄
log.dirs
引數,其值是 kafka 資料的存放目錄;
這個引數可以配置多個目錄,目錄之間使用逗號分隔,通常這些目錄是分布在不同的磁盤上用于提高讀寫性能,
如果log.dirs
引數只配置了一個目錄,那么分配到各個 broker 上的磁區肯定只能在這個目錄下創建檔案夾用于存放資料,
但是如果log.dirs
引數配置了多個目錄,那么 kafka 會在哪個檔案夾中創建磁區目錄呢?答案是:Kafka 會在含有磁區目錄最少的檔案夾中創建新的磁區目錄,磁區目錄名為 Topic名+磁區ID,
注意,是磁區檔案夾總數最少的目錄,而不是磁盤使用量最少的目錄!也就是說,如果你給 log.dirs 引數新增了一個新的磁盤,新的磁區目錄肯定是先在這個新的磁盤上創建直到這個新的磁盤目錄擁有的磁區目錄不是最少為止,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554879.html
標籤:大數據
上一篇:MySQL安裝
下一篇:返回列表