版權(quán)聲明:本套技術(shù)專欄是作者(秦凱新)平時(shí)工作的總結(jié)和升華,通過從真實(shí)商業(yè)環(huán)境抽取案例進(jìn)行總結(jié)和分享,并給出商業(yè)應(yīng)用的調(diào)優(yōu)建議和集群環(huán)境容量規(guī)劃等內(nèi)容,請(qǐng)持續(xù)關(guān)注本套博客。版權(quán)聲明:禁止轉(zhuǎn)載观蜗,歡迎學(xué)習(xí)臊恋。
kafka商業(yè)環(huán)境實(shí)戰(zhàn)系列
作者:秦凱新 地址:于深圳
- kafka 商業(yè)環(huán)境實(shí)戰(zhàn)-kafka生產(chǎn)環(huán)境規(guī)劃
- kafka 商業(yè)環(huán)境實(shí)戰(zhàn)-kafka生產(chǎn)者和消費(fèi)者吞吐量測(cè)試
- kafka 商業(yè)環(huán)境實(shí)戰(zhàn)-kafka生產(chǎn)者Producer參數(shù)設(shè)置及參數(shù)調(diào)優(yōu)建議
1. Producer核心工作流程
- Producer首先使用用戶主線程將待發(fā)送的消息封裝進(jìn)一個(gè)ProducerRecord類實(shí)例中。
- 進(jìn)行序列化后墓捻,發(fā)送給Partioner抖仅,由Partioner確定目標(biāo)分區(qū)后坊夫,發(fā)送到Producer程序中的一塊內(nèi)存緩沖區(qū)中。
- Producer的另一個(gè)工作線程(即Sender線程)撤卢,則負(fù)責(zé)實(shí)時(shí)地從該緩沖區(qū)中提取出準(zhǔn)備好的消息封裝到一個(gè)批次的內(nèi)环凿,統(tǒng)一發(fā)送給對(duì)應(yīng)的broker中。
2. producer 主要參數(shù)設(shè)置
2.1 producer 參數(shù)acks 設(shè)置(無數(shù)據(jù)丟失)
在消息被認(rèn)為是“已提交”之前放吩,producer需要leader確認(rèn)的produce請(qǐng)求的應(yīng)答數(shù)智听。該參數(shù)用于控制消息的持久性,目前提供了3個(gè)取值:
acks = 0: 表示produce請(qǐng)求立即返回渡紫,不需要等待leader的任何確認(rèn)到推。這種方案有最高的吞吐率,但是不保證消息是否真的發(fā)送成功惕澎。
acks = -1: 表示分區(qū)leader必須等待消息被成功寫入到所有的ISR副本(同步副本)中才認(rèn)為produce請(qǐng)求成功莉测。這種方案提供最高的消息持久性保證,但是理論上吞吐率也是最差的唧喉。
acks = 1: 表示leader副本必須應(yīng)答此produce請(qǐng)求并寫入消息到本地日志捣卤,之后produce請(qǐng)求被認(rèn)為成功。如果此時(shí)leader副本應(yīng)答請(qǐng)求之后掛掉了八孝,消息會(huì)丟失董朝。這是個(gè)這種的方案,提供了不錯(cuò)的持久性保證和吞吐唆阿。
商業(yè)環(huán)境推薦:
如果要較高的持久性要求以及無數(shù)據(jù)丟失的需求益涧,設(shè)置acks = -1。其他情況下設(shè)置acks = 1
2.2 producer參數(shù) buffer.memory 設(shè)置(吞吐量)
該參數(shù)用于指定Producer端用于緩存消息的緩沖區(qū)大小驯鳖,單位為字節(jié)闲询,默認(rèn)值為:33554432合計(jì)為32M。kafka采用的是異步發(fā)送的消息架構(gòu)浅辙,prducer啟動(dòng)時(shí)會(huì)首先創(chuàng)建一塊內(nèi)存緩沖區(qū)用于保存待發(fā)送的消息扭弧,然后由一個(gè)專屬線程負(fù)責(zé)從緩沖區(qū)讀取消息進(jìn)行真正的發(fā)送。
商業(yè)環(huán)境推薦:
- 消息持續(xù)發(fā)送過程中记舆,當(dāng)緩沖區(qū)被填滿后鸽捻,producer立即進(jìn)入阻塞狀態(tài)直到空閑內(nèi)存被釋放出來,這段時(shí)間不能超過max.blocks.ms設(shè)置的值泽腮,一旦超過御蒲,producer則會(huì)拋出TimeoutException 異常,因?yàn)镻roducer是線程安全的诊赊,若一直報(bào)TimeoutException厚满,需要考慮調(diào)高buffer.memory 了。
- 用戶在使用多個(gè)線程共享kafka producer時(shí)碧磅,很容易把 buffer.memory 打滿碘箍。
2.3 producer參數(shù) compression.type 設(shè)置(lZ4)
producer壓縮器遵馆,目前支持none(不壓縮),gzip丰榴,snappy和lz4货邓。
商業(yè)環(huán)境推薦:
基于公司物聯(lián)網(wǎng)平臺(tái),試驗(yàn)過目前l(fā)z4的效果最好四濒。當(dāng)然2016年8月换况,F(xiàn)aceBook開源了Ztandard。官網(wǎng)測(cè)試: Ztandard壓縮率為2.8峻黍,snappy為2.091复隆,LZ4 為2.101 。
2.4 producer參數(shù) retries設(shè)置(注意消息亂序,EOS)
producer重試的次數(shù)設(shè)置姆涩。重試時(shí)producer會(huì)重新發(fā)送之前由于瞬時(shí)原因出現(xiàn)失敗的消息挽拂。瞬時(shí)失敗的原因可能包括:元數(shù)據(jù)信息失效、副本數(shù)量不足骨饿、超時(shí)亏栈、位移越界或未知分區(qū)等。倘若設(shè)置了retries > 0宏赘,那么這些情況下producer會(huì)嘗試重試绒北。
商業(yè)環(huán)境推薦:
- producer還有個(gè)參數(shù):max.in.flight.requests.per.connection。如果設(shè)置該參數(shù)大約1察署,那么設(shè)置retries就有可能造成發(fā)送消息的亂序闷游。
- 版本為0.11.1.0的kafka已經(jīng)支持"精確到一次的語義”,因此消息的重試不會(huì)造成消息的重復(fù)發(fā)送贴汪。
2.5 producer參數(shù)batch.size設(shè)置(吞吐量和延時(shí)性能)
producer都是按照batch進(jìn)行發(fā)送的脐往,因此batch大小的選擇對(duì)于producer性能至關(guān)重要。producer會(huì)把發(fā)往同一分區(qū)的多條消息封裝進(jìn)一個(gè)batch中扳埂,當(dāng)batch滿了后业簿,producer才會(huì)把消息發(fā)送出去。但是也不一定等到滿了阳懂,這和另外一個(gè)參數(shù)linger.ms有關(guān)梅尤。默認(rèn)值為16K,合計(jì)為16384.
商業(yè)環(huán)境推薦:
- batch 越小岩调,producer的吞吐量越低巷燥,越大,吞吐量越大号枕。
2.6 producer參數(shù)linger.ms設(shè)置(吞吐量和延時(shí)性能)
producer是按照batch進(jìn)行發(fā)送的缰揪,但是還要看linger.ms的值,默認(rèn)是0堕澄,表示不做停留邀跃。這種情況下,可能有的batch中沒有包含足夠多的produce請(qǐng)求就被發(fā)送出去了蛙紫,造成了大量的小batch拍屑,給網(wǎng)絡(luò)IO帶來的極大的壓力。
商業(yè)環(huán)境推薦:
- 為了減少了網(wǎng)絡(luò)IO坑傅,提升了整體的TPS僵驰。假設(shè)設(shè)置linger.ms=5,表示producer請(qǐng)求可能會(huì)延時(shí)5ms才會(huì)被發(fā)送唁毒。
2.7 producer參數(shù)max.in.flight.requests.per.connection設(shè)置(吞吐量和延時(shí)性能)
producer的IO線程在單個(gè)Socket連接上能夠發(fā)送未應(yīng)答producer請(qǐng)求的最大數(shù)量蒜茴。增加此值應(yīng)該可以增加IO線程的吞吐量,從而整體上提升producer的性能浆西。不過就像之前說的如果開啟了重試機(jī)制粉私,那么設(shè)置該參數(shù)大于1的話有可能造成消息的亂序。
商業(yè)環(huán)境推薦:
- 默認(rèn)值5是一個(gè)比較好的起始點(diǎn),如果發(fā)現(xiàn)producer的瓶頸在IO線程近零,同時(shí)各個(gè)broker端負(fù)載不高诺核,那么可以嘗試適當(dāng)增加該值.
- 過大增加該參數(shù)會(huì)造成producer的整體內(nèi)存負(fù)擔(dān),同時(shí)還可能造成不必要的鎖競(jìng)爭(zhēng)反而會(huì)降低TPS
結(jié)語
秦凱新 于深圳 2018-10-27