柚子快報(bào)邀請(qǐng)碼778899分享:分布式 kafka系列(二)
柚子快報(bào)邀請(qǐng)碼778899分享:分布式 kafka系列(二)
本章承接kafka一內(nèi)容,文章在本人博客主頁(yè)都有,可以自行點(diǎn)擊瀏覽。
冪等性
請(qǐng)求執(zhí)行多次,但執(zhí)行的結(jié)果是一致的。
如果,某個(gè)系統(tǒng)是不具備冪等性的,如果用戶重復(fù)提交了某個(gè)表格,就可能會(huì)造成不良影響。例如:用戶在瀏覽器上點(diǎn)擊了多次提交訂單按鈕,會(huì)在后臺(tái)生成多個(gè)一模一樣的訂單。
kafka冪等性
在生產(chǎn)者生產(chǎn)消息時(shí),如果出現(xiàn)retry時(shí),有可能會(huì)一條消息被發(fā)送了多次,如果Kafka不具備冪等性的,就有可能會(huì)在partition中保存多條一模一樣的消息。
配置
props.put("enable.idempotence",true);
原理
為了實(shí)現(xiàn)生產(chǎn)者的冪等性,Kafka引入了 Producer ID(PID)和 Sequence Number的概念。
?PID:每個(gè)Producer在初始化時(shí),都會(huì)分配一個(gè)唯一的PID,這個(gè)PID對(duì)用戶來(lái)說(shuō),是透明的。
?Sequence Number:針對(duì)每個(gè)生產(chǎn)者(對(duì)應(yīng)PID)發(fā)送到指定主題分區(qū)的消息都對(duì)應(yīng)一個(gè)從0開(kāi)始遞增的Sequence Number。
如果同一個(gè)生產(chǎn)者,發(fā)送的消息序列號(hào)一致了,那么消息就已經(jīng)存在了。
消費(fèi)者組Rebalance機(jī)制
Rebalance再均衡
Kafka中的Rebalance稱之為再均衡,是Kafka中確保Consumer group下所有的consumer如何達(dá)成一致,分配訂閱的topic的每個(gè)分區(qū)的機(jī)制。
Rebalance觸發(fā)的時(shí)機(jī)有:
消費(fèi)者組中consumer的個(gè)數(shù)發(fā)生變化。例如:有新的consumer加入到消費(fèi)者組,或者是某個(gè)consumer停止了。訂閱的topic個(gè)數(shù)發(fā)生變化。消費(fèi)者可以訂閱多個(gè)主題,假設(shè)當(dāng)前的消費(fèi)者組訂閱了三個(gè)主題,但有一個(gè)主題突然被刪除了,此時(shí)也需要發(fā)生再均衡。訂閱的topic分區(qū)數(shù)發(fā)生變化
壞處
發(fā)生Rebalance時(shí),consumer group下的所有consumer都會(huì)協(xié)調(diào)在一起共同參與,Kafka使用分配策略盡可能達(dá)到最公平的分配Rebalance過(guò)程會(huì)對(duì)consumer group產(chǎn)生非常嚴(yán)重的影響,Rebalance的過(guò)程中所有的消費(fèi)者都將停止工作,直到Rebalance完成
消費(fèi)者分區(qū)分配策略
range范圍分配
Range范圍分配策略是Kafka默認(rèn)的分配策略,它可以確保每個(gè)消費(fèi)者消費(fèi)的分區(qū)數(shù)量是均衡的。
注意:Rangle范圍分配策略是針對(duì)每個(gè)Topic的。
輪詢分配
RoundRobinAssignor輪詢策略是將消費(fèi)組內(nèi)所有消費(fèi)者以及消費(fèi)者所訂閱的所有topic的partition按照字典序排序(topic和分區(qū)的hashcode進(jìn)行排序),然后通過(guò)輪詢方式逐個(gè)將分區(qū)以此分配給每個(gè)消費(fèi)者。
粘性分配
沒(méi)有重新分配的時(shí)候和輪詢一樣,當(dāng)消費(fèi)者掛掉的時(shí)候,發(fā)生重新分配,盡可能保留之前的分配不變,將掛點(diǎn)的消費(fèi)者上綁定的分區(qū)平均分配到?jīng)]掛掉的消費(fèi)者上面。由于rebalance發(fā)生,導(dǎo)致消費(fèi)者需要重新消費(fèi)之前正在處理的分區(qū),導(dǎo)致不必要的系統(tǒng)開(kāi)銷。(例如:某個(gè)事務(wù)正在進(jìn)行就必須要取消了)
副本機(jī)制
副本的目的就是冗余備份,當(dāng)某個(gè)Broker上的分區(qū)數(shù)據(jù)丟失時(shí),依然可以保障數(shù)據(jù)可用。因?yàn)樵谄渌腂roker上的副本是可用的。
producer的ACKs參數(shù)
對(duì)副本關(guān)系較大的就是,producer配置的acks參數(shù)了,acks參數(shù)表示當(dāng)生產(chǎn)者生產(chǎn)消息的時(shí)候,寫(xiě)入到副本的要求嚴(yán)格程度。它決定了生產(chǎn)者如何在性能和可靠性之間做取舍。
確認(rèn)機(jī)制說(shuō)明acks=0生產(chǎn)者在成功寫(xiě)入消息之前不會(huì)等待任何來(lái)自服務(wù)器的響應(yīng),消息有丟失的風(fēng)險(xiǎn),但是速度最快acks=1(默認(rèn)值)只要集群首領(lǐng)節(jié)點(diǎn)收到消息,生產(chǎn)者就會(huì)收到一個(gè)來(lái)自服務(wù)器的成功響應(yīng)acks=all只有當(dāng)所有參與賦值的節(jié)點(diǎn)全部收到消息時(shí),生產(chǎn)者才會(huì)收到一個(gè)來(lái)自服務(wù)器的成功響應(yīng)
Kafka的數(shù)據(jù)存儲(chǔ)形式
?一個(gè)topic由多個(gè)分區(qū)組成?一個(gè)分區(qū)(partition)由多個(gè)segment(段)組成?一個(gè)segment(段)由多個(gè)文件組成(log、index、timeindex)
???????Kafka配額限速機(jī)制(Quotas)
生產(chǎn)者和消費(fèi)者以極高的速度生產(chǎn)/消費(fèi)大量數(shù)據(jù)或產(chǎn)生請(qǐng)求,從而占用broker上的全部資源,造成網(wǎng)絡(luò)IO飽和。有了配額(Quotas)就可以避免這些問(wèn)題。Kafka支持配額管理,從而可以對(duì)Producer和Consumer的produce&fetch操作進(jìn)行流量限制,防止個(gè)別業(yè)務(wù)壓爆服務(wù)器。
???????限制producer端速率
為所有client id設(shè)置默認(rèn)值,以下為所有producer程序設(shè)置其TPS不超過(guò)1MB/s,即1048576?/s,命令如下:
bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --add-config 'producer_byte_rate=1048576'?--entity-type clients --entity-default
運(yùn)行基準(zhǔn)測(cè)試,觀察生產(chǎn)消息的速率
bin/kafka-producer-perf-test.sh --topic test?--num-records 500000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=node1.itcast.cn:9092,node2.itcast.cn:9092,node3.itcast.cn:9092 acks=1
結(jié)果:
50000 records sent, 1108.156028 records/sec (1.06 MB/sec)
???????限制consumer端速率
對(duì)consumer限速與producer類似,只不過(guò)參數(shù)名不一樣。
為指定的topic進(jìn)行限速,以下為所有consumer程序設(shè)置topic速率不超過(guò)1MB/s,即1048576/s。命令如下:
bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --add-config 'consumer_byte_rate=1048576' --entity-type clients --entity-default
運(yùn)行基準(zhǔn)測(cè)試:
bin/kafka-consumer-perf-test.sh --broker-list node1.itcast.cn:9092,node2.itcast.cn:9092,node3.itcast.cn:9092 --topic test?--fetch-size 1048576 --messages 500000
結(jié)果為:
MB.sec:1.0743
???????取消Kafka的Quota配置
使用以下命令,刪除Kafka的Quota配置
bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --delete-config 'producer_byte_rate'?--entity-type clients --entity-default bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --delete-config 'consumer_byte_rate'?--entity-type clients --entity-default
柚子快報(bào)邀請(qǐng)碼778899分享:分布式 kafka系列(二)
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。