kafka 相關筆記

kafka 設計概要
    吞吐量/延時
    消息持久化
    負載均衡和故障轉移
    伸縮性

 

一些常用命令
通過GetOffsetShell 工具類查看  topic   分區消息
./kafka-run-class.sh  kafka.tools.GetOffsetShell   --broker-list  192.168.2.52:9092  --topic  test
查看當前topic 當前對應的信息 
./kafka-topics.sh  --zookeeper  192.168.2.52:2181   --describe   --topic   test1
    Topic: test1    Partition: 0    Leader: 0    Replicas: 0    Isr: 0
    Topic: test1    Partition: 1    Leader: 0    Replicas: 0    Isr: 0
修改kafka分區個數
./kafka-topics.sh  -alter --zookeeper  192.168.2.52:2181 --partitions 2  --topic  test
給現有topic 添加新的配置   添加壓實配置
./kafka-configs.sh   --zookeeper 192.168.2.52:2181 --alter  --entity-type topics --entity-name test  --add-config cleanup.policy=compact
查看當前topic 的配置 
./kafka-configs.sh  --zookeeper  192.168.2.52:2181  --describe  --entity-type topics  --entity-name  test
對topic 進行生產者消息測試
./kafka-producer-perf-test.sh   --topic topic1 --throughput  -1  --num-records 50000  --record-size 100  --producer-props  bootstrap.servers=192.168.2.52:9092  acks=1
查看當前存在的消費者組
./kafka-consumer-groups.sh   --bootstrap-server  192.168.2.52:9092  --list
查看當前消費者組的信息 
./kafka-consumer-groups.sh       --bootstrap-server  192.168.2.52:9092 --describe --group  topic1group
重置當前消費者組的offset
./kafka-consumer-groups.sh    --bootstrap-server  192.168.2.52:9092 --group topic1group  --reset-off sets --all-topics  --to-earliest --execute 
 

kafka rebalance 觸發條件
消費者新增或者 移除
topic  分區的新增或減少

Kafka多線程消費兩種方式
1 每個線程維護一個kafkaConsumer
2 單個kafkaConsumer 實例 一個線程對應一個分區

兩種方式的優缺點
方法1 (每個線程維護專屬 Ka fkaConsumer )    
實現簡單;速度較快,因爲無線程 間交互開銷:方便位移管理;易於 維護分區間的消息消費順序    
Socket連接開銷大;consumer數受限於topic分區 數,擴展性差;broker端處理負載高(因爲發往 broker的請求數多);rebalance可能性增大
方法2 (全局consumer多 worker 線程)    
消息獲取與處理解耦:可獨立擴展 consumer數和woricer數,伸縮性 好    
實現負載:難於維護分區內的消息順序;處理鏈路 變長,導致位移管理困難;worker線程異常可能導 致消費數據丟失

寫入消息的時候, 什麼情況下 導致HW 會和LEO 不同步呢
follwer請求速度追不上,leader的接受消息的速度, 可能原因  follwer 副本所在的broker 的網絡I/O開銷過大導致備份消息的速度滿於 leader處獲取的消息速度
進程卡住: follwer在一段時間內無法向leader 請求數據, 比如之前提到的頻繁gc 或者程序bug

LEO   log end offset  日誌末端唯一, 代表kafka 當前分區存了多少條數據, 12代表存在11條數據
HW   高水印         代表 這個kafka  consumer 可見的 ,當前能夠讀取的  最大offset ,  8 代表kafka消費者最多可以獲取到7條數據
HW  必須小於或者等於  LEO   代表所有消息,已提交,或者已備份
分區中的HW  爲 ISR 中所有副本LEO 的最小值

log compaction  日誌壓實(必須設置key)   確保kafka topic 每個分區中,具有相同的key的消息, 至少會保存最新的value 的消息 
_consumer_offsets 就使用了日誌壓實的策略,     最會保存(groupId + topic  + 分區號)最新的
 

broker 中的controller 的作用
更新集羣元數據信息
創建topic  刪除topic  分區重新分配
prefered leader 副本選舉
topic 分區擴展, broker 加入集羣 , broker 崩潰 
受控關閉, controller leader 選舉 
生產者如何實現,消息的精確一次處理的語義呢, 從kafka 0.11.0.0後 kafka提供了冪等性, enable.idempotence=true
 

kafka調優方向
1 吞吐量
2  延時
3  持久性
4 可用性

OS 級別的錯誤  
connection refused  
too  many open  files 
address in  use connect  
解決方案 ,基礎設置
1  禁止atime(最新的訪問時間) 更新   可以使用  mount  -o  noatime
2  可以通過禁止記日誌操作, 的方式來提高寫的速度,
commit=N_secs  該選項是  沒N秒 同步一次數據和元數據 ,  默認是5秒。 如果該值設的比較小,
可以減少崩潰發生時帶來的數據丟失, 但若設置的較大, 則會提升整體的吞吐量,以及降低延時, 生產環境 推薦用戶設置一個較大的值 1-2分鐘
swapiness 設置
2 設置swapiness   linux 默認爲 60 s   一般建議設置爲  0  禁用來提升 內存的使用率, 
這裏存在一個問題,  當內存用完後, linux  OOM Killer  回去殺掉一個進程, 這樣可能會導致數據丟失,
坐着建議, 設置爲   1-10 之間, 
jvm   設置 
由於kafka 並沒有大量使用堆上內存  所以堆內存設置爲 6G,差不多可以滿足
-Xmx6g -Xms6g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize—128m -XX:+UseG1GC
-XX:MaxGCPauseMillis— 20 -XX: InitiatingHeapOccupancyPercent 35 -XX:
GlHeapRegionSize—16M -XX: MinMetaspaceFreeRatio—50 -XX:
MaxMetaspaceFreeRatio=85
設置 單個jvm 最大支持的線程數  vm.max_map_count   65530
調優吞吐量,
1producer  設置  batch.size  和linger.ms  通常情況下, 會提升producer 端的TPS
會增加了 消息的延時性,
2合理設置分區個數, 分區的增大到某個數值,後由於鎖競爭,和內存佔用過多 降低tps, 在實際中,
可以用兩倍數來逐步測試 ,直到性能拐點
3設置compression.type   對數據進行壓縮,降低I/O的方式來提高tps ,壓縮的話主要時針對batch的, 
kafka 支持的壓縮格式又, gzip ,snappy,lz4   相比來說,lz4組合的性能最好,
4 設置acks 參數, 當參數爲1 代表leaderx寫入底層文件系統即返回,無須等待follower 響應,acks=0,  
表示 producer 端不理會 broker 端的響應,  會提升tps 但是犧牲了消息的持久化, 
5  當 producer 端  retries 參數設置的值,進行指定次數的重試,如果消息能夠忍受偶爾的數據丟失, 可以將
retries 設置爲0 , tps 會有提升, 但是 消息發生失敗後, 就不會重試, 
6  max.block.ms   當producer 端的緩衝區被填滿後,  producer  將會進入阻塞狀態, 最大的阻塞時長,
一旦超過, producer 就會拋出  TimeoutException 因此,設置 buffer.memeory(默認32MB) 的值 能使  
producer 使得阻塞的情況得到緩解,
consumer 端  fetch.min.bytes 的作用, 設置leader 副本沒錯返回 consumer 的最小字節數,  
通過增加該參數 fafka 會爲每個fetch 請求的response 填入更多的數據, 減少網絡開銷, 提升TPS, 另一方面,
會導致延時的增加, 
broker  ,num。replica.fetchers 的值, 該值控制follower 從leader 副本中,獲取的最大線程數, 默認使1  表示
follower 只有一個線程去實時拉去leader 的最新消息, 當 acks=all 的 producer 而言, 主要的延時可能都耽誤在follower於leader 同步的過程, 
增加 該值能夠縮短同步的實際間隔, 提升producer的tps
參數總結  
broker 端
•適當增加num.replica.fetchers,但不要超過CPU核數。
•調優GC避免經常性的Full GC。
producer 端
•適當增加batch.size,比如100-512KB。
•適當增加linger.ms,比如10-00毫秒。
•設置 compression.type=lz4。
•    acks=0 或 1 
•    retries=0
•若多線程共享producer或分區數很多,增加buffer.memory。 consumer 端
•採用多consumer實例。
•增加 fetch.min.bytes,比如 100000。
調優延時, 大體和調優吞吐量相反, 
broker 端
• 適 度 增 加 num.replica.fetchers。
•避 免 創 建 過 多 topic分 區 。
producer 端
•設 置 linger.ms=0
• 設 置 compression.type=none
•設 置 acks=l或 0
consumer 端
設 置 fetch.min.bytes=l
調優持久性
broker 端 調優持久性, 有兩個重要的參數可以調節,log.flush.interval.ms 和 log.flush.interval.message,
默認情況下, log.flush.interval.ms=0, log.flush.interval.message=long.max_value,一般不需要調節
broker 端
•設置 unclean.leader.election.enable=false (0.1 丨 .0.0之前版本)《
•設置 auto.create.topics.enable=false。
•設置 replicat丨 on.factor = 3, min.insync.replicas = replication.factor - 1»
•設置 default.replication.factor = 3。
•設 置 brokcr.rack屬性分散分區數據到不同機架。
•設置丨 og.flush.interval.message 和 丨 og.flush.interval.ms 爲一個較小的值 
producer 端
•設置 acks=all。
•設 罝 retries爲一個較大的值,比如 10-30。
•設置 max.in.flight.requesls.per.connection=l 
•設置 enabIe.idempotence=true 啓用冪等性。
consumer 端
•設置 auto.commit.enable=false。
•消息消費成功後調用commitSync提交位移。
調優可用性
broker 端
避 免 創 建 過 多 分
設 置 unclean.leader.election.enable=true。
設 置 min.insync.replicas=l。
設 置 num.recovery.threads.per.data.dir=brolcer 端 參 數 log.dirs 中 設 置 的 目 錄 數 9
 producer 端
 •設 罝 acks=l,若一定要設置爲all,則遵循h面broker端的min.insyn.replicas配置。
 consumer 端
 •設 置 session.timeout.ms爲 較 低 的 值 , 比 如 10000。
 • (0.丨0.1.0及之後版本)設罝max.poll.imerva丨.ms爲比消息平均處理時間稍大的值。
 • (0.10.1.0 之前版本)設置 max.poll.records 和 max.partition.fetch.bytes 減少 consumer 處理 消 息 的 總 時 長 , 避 免 頻 繁 rebalance。

 

筆記來源於 胡夕的apache kafka實戰, 有興趣的可以去看看那本書, 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章