1. 程式人生 > >Kafka無訊息丟失配置

Kafka無訊息丟失配置

Kafka到底會不會丟資料(data loss)? 通常不會,但有些情況下的確有可能會發生。下面的引數配置及Best practice列表可以較好地保證資料的永續性(當然是trade-off,犧牲了吞吐量)。筆者會在該列表之後對列表中的每一項進行討論,有興趣的同學可以看下後面的分析。

  1. block.on.buffer.full = true
  2. acks = all
  3. retries = MAX_VALUE
  4. max.in.flight.requests.per.connection = 1
  5. 使用KafkaProducer.send(record, callback)
  6. callback邏輯中顯式關閉producer:close(0) 
  7. unclean.leader.election.enable=false
  8. replication.factor = 3 
  9. min.insync.replicas = 2
  10. replication.factor > min.insync.replicas
  11. enable.auto.commit=false
  12. 訊息處理完成之後再提交位移

給出列表之後,我們從兩個方面來探討一下資料為什麼會丟失:

1. Producer端

  目前比較新版本的Kafka正式替換了Scala版本的old producer,使用了由Java重寫的producer。新版本的producer採用非同步傳送機制。KafkaProducer.send(ProducerRecord)方法僅僅是把這條訊息放入一個快取中(即RecordAccumulator,本質上使用了佇列來快取記錄),同時後臺的IO執行緒會不斷掃描該快取區,將滿足條件的訊息封裝到某個batch中然後傳送出去。顯然,這個過程中就有一個數據丟失的視窗:若IO執行緒傳送之前client端掛掉了,累積在accumulator中的資料的確有可能會丟失。

  Producer的另一個問題是訊息的亂序問題。假設客戶端程式碼依次執行下面的語句將兩條訊息發到相同的分割槽

producer.send(record1);
producer.send(record2);

如果此時由於某些原因(比如瞬時的網路抖動)導致record1沒有成功傳送,同時Kafka又配置了重試機制和max.in.flight.requests.per.connection大於1(預設值是5,本來就是大於1的),那麼重試record1成功後,record1在分割槽中就在record2之後,從而造成訊息的亂序。很多某些要求強順序保證的場景是不允許出現這種情況的。

  鑑於producer的這兩個問題,我們應該如何規避呢??對於訊息丟失的問題,很容易想到的一個方案就是:既然非同步傳送有可能丟失資料, 我改成同步傳送總可以吧?比如這樣:

producer.send(record).get();

這樣當然是可以的,但是效能會很差,不建議這樣使用。因此特意總結了一份配置列表。個人認為該配置清單應該能夠比較好地規避producer端資料丟失情況的發生:(特此說明一下,軟體配置的很多決策都是trade-off,下面的配置也不例外:應用了這些配置,你可能會發現你的producer/consumer 吞吐量會下降,這是正常的,因為你換取了更高的資料安全性)

  • block.on.buffer.full = true  儘管該引數在0.9.0.0已經被標記為“deprecated”,但鑑於它的含義非常直觀,所以這裡還是顯式設定它為true,使得producer將一直等待緩衝區直至其變為可用。否則如果producer生產速度過快耗盡了緩衝區,producer將丟擲異常
  • acks=all  很好理解,所有follower都響應了才認為訊息提交成功,即"committed"
  • retries = MAX 無限重試,直到你意識到出現了問題:)
  • max.in.flight.requests.per.connection = 1 限制客戶端在單個連線上能夠傳送的未響應請求的個數。設定此值是1表示kafka broker在響應請求之前client不能再向同一個broker傳送請求。注意:設定此引數是為了避免訊息亂序
  • 使用KafkaProducer.send(record, callback)而不是send(record)方法   自定義回撥邏輯處理訊息傳送失敗
  • callback邏輯中最好顯式關閉producer:close(0) 注意:設定此引數是為了避免訊息亂序
  • unclean.leader.election.enable=false   關閉unclean leader選舉,即不允許非ISR中的副本被選舉為leader,以避免資料丟失
  • replication.factor >= 3   這個完全是個人建議了,參考了Hadoop及業界通用的三備份原則
  • min.insync.replicas > 1 訊息至少要被寫入到這麼多副本才算成功,也是提升資料永續性的一個引數。與acks配合使用
  • 保證replication.factor > min.insync.replicas  如果兩者相等,當一個副本掛掉了分割槽也就沒法正常工作了。通常設定replication.factor = min.insync.replicas + 1即可

2. Consumer端

  consumer端丟失訊息的情形比較簡單:如果在訊息處理完成前就提交了offset,那麼就有可能造成資料的丟失。由於Kafka consumer預設是自動提交位移的,所以在後臺提交位移前一定要保證訊息被正常處理了,因此不建議採用很重的處理邏輯,如果處理耗時很長,則建議把邏輯放到另一個執行緒中去做。為了避免資料丟失,現給出兩點建議:

  • enable.auto.commit=false  關閉自動提交位移
  • 在訊息被完整處理之後再手動提交位移

相關推薦

Kafka訊息丟失配置

Kafka到底會不會丟資料(data loss)? 通常不會,但有些情況下的確有可能會發生。下面的引數配置及Best practice列表可以較好地保證資料的永續性(當然是trade-off,犧牲了吞吐量)。筆者會在該列表之後對列表中的每一項進行討論,有興趣的同學可以看下後面的分析。 block.on.bu

kafka實現訊息丟失與精確一次語義(exactly once)處理

在很多的流處理框架的介紹中,都會說kafka是一個可靠的資料來源,並且推薦使用Kafka當作資料來源來進行使用。這是因為與其他訊息引擎系統相比,kafka提供了可靠的資料儲存及備份機制。並且通過消費者位移這一概念,可以讓消費者在因某些原因宕機而重啟後,可以輕易得回到宕機前的位置。 但其實kafka的可靠性也

Kafka訊息丟失原因

1.生產者:往Broker寫入訊息時,發生網路錯誤,訊息不可達。 2.Broker:分割槽leader收到訊息,同步分割槽複製到新訊息之前,分割槽leader崩潰。 3.消費者:讀取到一批訊息,消費者提交了偏移量卻未能處理讀到的訊息(如資料需要的算力很大,處理時間會很長)

Kafka訊息丟失和重複嗎?——如何實現Kafka精確傳遞一次語義

我們都知道Kafka的吞吐量很大,但是Kafka究竟會不會丟失訊息呢?又會不會重複消費訊息呢? 圖 無人機實時監控 ​ 有很多公司因為業務要求必須保證訊息不丟失、不重複的到達,比如無人機實時監控系統,當無人機闖入機場區域,我們必須立刻報警,不允許訊息丟失。而無人機離開禁飛區域後我們需要將及時報警解除。

Linux下MySQL5.7.18二進制包安裝(默認配置文件my_default.cnf)

一點 utf8 user 二進制 width which 密碼 用戶 location 本文出處:http://www.cnblogs.com/wy123/p/6815049.html 最新在學習MySQL,純新手,對Linux了解的也不多,因為是下載

vm 安裝centos 7網卡配置文件解決方法

解決方案 network 配置文件 操作系統 failed 問題描述:朋友新安裝了centos7,發現無網卡配置文件,另外network服務是failed狀態。找到我求助嘗試解決方案1、關閉NetworkManager,自己創建ifcfg-eth0配置文件,錯誤依舊嘗試解決方案2、配置文件

kafka 並發數配置過程中踩到的坑 InstanceAlreadyExistsException

static 靜態初始化塊 obj -c 異常 判斷 con lba comm 2017-07-05 13:09:15.460 [kafka_spout:7-MultipleThreadSpoutExecutors] WARN o.a.kafka.common.utils.

kafka集群安裝配置

del etc pcs zookeepe 分發 pan div 宋體 rod 1.下載安裝包 2.解壓安裝包 3.進入到kafka的config目錄修改server.properties文件 進入後顯示如下: 修改log.dirs,基本上大部分都是默認配置

CS8: 客戶遇到多臺Server 2008 或者Server 2008R2 服務器網關無故丟失配置

分析 ntc term 問題 process 新建 環境 mark 日誌 客戶問題概括: 很多客戶反饋某些Server會無規律丟失網關配置,造成網絡中斷,需要找到根本原因。 解決方法:經過多個系統日誌分析發現網關配置丟失都是在服務器重啟後發生,研究討論後發現,Server

kafka】集群配置

kafka cluster 1.先配置好zookeeper集群(可以看zookeeper集群搭建)2.三個kafka機器10.1.44.186 kafka(9092) zookeeper(2181)10.1.44.187 kafka(9092) zookeeper(2181)10.1.44.188 k

Linux/Centos ntp時間同步,聯網情況和網情況配置

RM inux def 本機 water rest ext 失去 分鐘 機器聯網: 如果服務器可以聯網:執行 ntpdate 1.cn.pool.ntp.org 服務器就會自動同步時間 寫一個計劃任務 每倆分鐘執行一次時間同步; crontab -e /2 *

Jenkins 打包 java項目時 丟失 配置文件(resource)

jar包 class true 增加 運行 res clas 打包 directory 使用IDEA開發的spring boot 項目在本地打包運行可以,但是利用Jenkins打包運行提示讀取不到配置文件中的變量,打開jar包發現裏面沒有配置文件。解決方法是在pom中增加如

Kafka概述以及安裝配置

一、Kafka概述 PUBLISH & SUBSCRIBE Read and write streams of data like a messaging system. 釋出和訂閱 讀取和寫入資料流,類似訊息傳遞系統。 PROCESS Write scalable stre

kafka 增加許可權認證配置

一、 版本說明:      zookeeper版本無要求,kafka必須使用0.9 以後的版本      本例使用:zookeeper-3.4.10,kafka_2.11-1.0.0    

web自動化爬蟲selenium centos GUI環境配置

基本環境:centos7,python3.x 1.安裝selenium pip3 install selenium 2.安裝chrome-browser wget https://dl.google.com/linux/direct/google-chrome-stable_current_x

SQL 2016 AlwaysOn 域AlwaysOn配置要點

環境準備: (1)作業系統:Windows Server 2016 Datacenter   (2)SQL Server 2016    配置SQL  2016 AlwaysOn 要點    1,因為沒有域所以需要在”計算機屬性“新增計算機

Kafka傳送訊息過程

Kafka傳送訊息模型   ProducerRecord物件包含目標主題和要傳送的內容,還可以指定鍵或分割槽。傳送ProducerRecord物件時,生產者要先把鍵和值物件序列化為位元組陣列(預設使用StringSerialize

學習筆記37—WIN7系統本地連接沒有有效的IP地址 電腦本地連接有效ip配置怎麽辦

c51 選中 tex details 管理 p地址 網關 win7系統 log WIN7系統本地連接沒有有效的IP地址 電腦本地連接無有效ip配置怎麽辦 家中有兩臺筆記本都有無線網卡,現在想讓兩臺筆記本都能夠上網,而又不想購買路由器,交換機等設備,這個時候怎麽辦呢?

kafka配置,kafka和flume的配置

參考文件:  https://files.cnblogs.com/files/han-guang-xue/kafka.zip 其中實現如圖的效果詳細步驟如下: #han01.confa1.sources=r1 a1.channels=c1 a1.sinks=k1 a1.sources.r1.t

ssh密登入配置詳解(hadoop叢集搭建)

ssh無密登入原理 注:私鑰和公鑰是每個使用者獨有的,而不是機器或者伺服器的,比如一臺電腦或者伺服器或者虛擬機器,可以同時存在多個使用者,但不同使用者需要遠端登入其他伺服器或者虛擬機器時,都必須配置各自的私鑰和公鑰,而且使用者之間的各不相同 常用命令 ssh ip(遠端登入也可