kafka数据不丢失不重复_如何配置 KAFKA 使其消息不会丢失
不可靠的KAFKA
這里的不可靠是指代KAFKA其設計之初就為高性能而設計,其是允許消息丟失的,但經過多個版本的升級之后,通過KAFKA的相關配置,我們可以將其作為可靠的隊列(不丟消息的隊列)。
在本文里,不會具體列出要改哪個參數,需要改的參數請大家自行翻文檔找出來,這樣理解會更為深刻。
發送消息到KAFKA時產生的消息丟失
在一些比較舊的版本,KAFKA客戶端發送消息到KAFKA服務器時,由于客戶端不等待服務器回應,直接返回,等待發送異步進行。因此其在發送環節就可能存在消息丟失。
為了避免消息丟失,我們需要用新版客戶端,并配置客戶端發送消息時同步等待返回結果
KAFKA服務器宕機導致的消息丟失(磁盤緩存丟失)
KAFKA自身不管理LOG寫入磁盤的緩存,將其交由操作系統處理。因此在默認配置下,如果KAFKA宕機,則會因為數據沒有FLUSH到磁盤而丟失數據。
為了保證數據不丟失,KAFKA提供的現成方法有兩個,
每條消息都Flush一次; 每條都Flush一遍,必然不可行,因為其速度會變得很慢。官方也不建議這么做。(如果其有類似Group Commit的優化機制的話,我覺得可以使用,但是貌似曾經有人提過這個PR,沒有被采納,其認為用集群就可解決這個可靠性問題)
構建集群,以提高可用性。 官方推薦的方法。只要掛的機器不要超過強制寫入的機器,那么就可以保證數據不丟失。但需要注意的是,KAFKA組成的集群必須在不同機房。不然機房一斷電,集群內的KAFKA就會出現消息丟失。
KAFKA復制模式導致的丟失
KAFKA的副本模式為主備復制模式,這個模式下有兩種形式 同步復制模式 以及 異步復制模式。
異步復制模式: 客戶端將信息發送到主副本,主副本收到信息寫到本地緩存后即返回ACK給客戶端。然后異步地將數據發送給備份。本配置為默認配置,其高效,但主掛掉,則消息丟失。 同步復制模式: 客戶端將信息發送到主副本,主副本收到信息,寫到本地緩存,并發送給所有從機,從機都寫到緩存后給主機反饋,主機都收到反饋后再反饋給客戶端
需要修改復制模式為同步復制
KAFKA選舉導致的消息丟失
KAFKA有一個配置,是否允許在不得已的情況下,允許在非同步狀態下的副本成為主副本。其默認是打開的,結果就導致存在丟失消息的可能性。需要將其關閉
未被確認的消息不會被消費
KAFKA使用主從同步復制的時候,沒有被完全復制(完全復制的消息會在HW(High water Mark之下))的信息不會被消費。 一個Broker若需要從非ISR狀態進入到ISR狀態前,會將其在HW之前的消息記錄給truncate掉,并嘗試跟上Master里的記錄。跟上后,將會恢復ISR狀態。
KAFKA的主節點選舉通過ZK中登記的序號決定,更細節可查看KAFKA同步復制模式選舉過程,以上為默認實現,不需修改,也無法修改
已確認的消息如果存在ISR狀態的副本的話,就不會丟失記錄
原Master掛掉后,新選出的Master不會丟棄HW之后的消息,新Master會將這些HW之后的副本再次發送給其余的副本。因此即使高水位信息沒有傳遞給新的Master副本也沒有問題。
ISR分區過少導致失去容災特性
默認配置下,ISR分區個數可以為1時依然可以寫數據。但當出現這種情況的時候,就失去了容災性。只要主分區掛掉,那么數據就丟失。
KAFKA有配置可以指定寫入時最少的ISR數量,少于特定值,就不再ACK。如一共三臺BROKER,我們可以指定ISR最少數量為2,那么只有1臺處于ISR狀態的話,COMMIT將無法執行。
是否設置該值,視具體情況而定,若無法容忍丟失,則設置該值為2,NAME 。追求可用性,則不設置。
個人建議設置為2,無論副本數量有多少
KAFKA如何處理網絡分區情況?
如果MASTER與其他的副本與ZK是聯通的,但是MASTER與其他副本之間出現了網絡分區,那么ISR就只能為1。
消息保存的策略的設置
建議保留消息的策略基于時間。如保留21天
客戶端宕機導致的消費位置丟失
KAFKA在分區中的消費位置由客戶端管控,其有可能沒有及時保存到KAFKA中,導致消費位置丟失。 若消費位置丟失,則消費可能從上一個保存的消費位置重新進行消費。所以在不能接受重復消息的系統需要自行定制對于消息的冪等處理
(死信是否會丟失?)
At Least Once
實際上我們對可靠消息系統的要求通常是At least Once,經過上述配置已經基本達到了At Least Once的要求
消息消費失敗的重試設置
需要設計一個死信隊列,消費失敗的消息需放入里面,以免影響后續其他消息消費
參考
總結
以上是生活随笔為你收集整理的kafka数据不丢失不重复_如何配置 KAFKA 使其消息不会丢失的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中能比较两个小数吗,javasc
- 下一篇: 计算机无法识别文件夹,电脑提示错误:此卷