🔥《Kafka運維管控平台》🔥
✏️更強大的管控能力✏️
🎾更高效的問題定位能力🎾
🌅更便捷的叢集運維能力🌅
🎼更專業的資源治理🎼
🌞更友好的運維生态🌞
文章目錄
- 不同Broker之間副本同步限流
- 各種情況的限流情況
- Leader 限流 Follower不限流 結論
- Leader不限流 Follower限流
- 同Broker跨目錄同步限流
- 如何手動設定限流
- 設定相關配置屬性
- 如何設定合理的限流值呢?
大家好,我是石臻臻
上周我們分别講解了
《Kafka分區副本同步限流機制三部曲》中的第一篇 《源碼篇》
《圖解Kafka中的資料采集和統計機制 》
之是以中間插入了 《圖解Kafka中的資料采集和統計機制 》 是因為了解了 資料的采集和統計機制有利于我們對 限流的了解。
今天我們來講解一下 《Kafka分區副本同步限流機制三部曲》中的第二篇 《原理篇》
我們這裡講的限流機制, 隻是副本之間的同步限流機制,并不包含 生産者 、消費組 等等其他的限流。
那麼講到副本同步, 我們都知道正常情況下,我們是不會給副本的同步加上限流值的,因為這樣子很可能會導緻副本跟不上ISR, 那麼什麼情況下我們需要加上這個限流值呢?
分區副本重配置設定的場景下,我們可能怕大批量的資料進行遷移會占用過得的資源,導緻kafka叢集壓力增大,影響正常使用, 是以一般情況下我們可能會選擇在低峰期進行操作,也會對整個操作做一個限流處理
具體的分區副本重配置設定的運維操作教程可以看文章 【kafka運維】kafka-reassign-partitions.sh分區副本重配置設定、資料遷移、副本擴縮容 (附教學視訊)
設定限流的時候有兩個參數選項,可以同時配置
--replica-alter-log-dirs-throttle
: broker内部副本跨路徑遷移資料流量限制功能,限制資料拷貝從一個目錄到另外一個目錄帶寬上限 機關 bytes/sec 。
--throttle:
遷移過程Broker之間傳輸的速率,機關 bytes/sec
如果你之前看過我寫的 【kafka運維】kafka-reassign-partitions.sh分區副本重配置設定、資料遷移、副本擴縮容 (附教學視訊)
肯定對這個兩個參數非常熟悉。
那麼你會不會發出這樣的疑問
-
遷移過程Broker之間傳輸的速率 。 這個Broker之間是誰和誰之間?--throttle:
- Broker之間傳輸的速率 怎麼算?是Broker整體所有分區副本的傳輸速率,還是指定幾個分區副本的傳輸速率?
- 這個傳輸速率是什麼?是Broker資料流出的速率,還是資料流入的速率?還是網卡的速率?
-
這個又是怎麼限制住 Broker 不同目錄直接的流量的?--replica-alter-log-dirs-throttle
- 如何正确的 設定這些限流值呢?有哪些參考标準?
- 我可以手動設定限流嗎?
假如你有這些疑問, 并稍作思考🤔之後, 跟着我下面的講解來重新梳理一下吧!
不同Broker之間副本同步限流
注意: 這裡的副本限流前提是不在ISR中, 如果已經在ISR中了不管如何都不會被限流。
對于這個問題,我寫一個例子,就很容易明白了。
目前我有3個Broker,有一個Topic
在執行以下腳本進行分區重配置設定之後:
sh bin/kafka-reassign-partitions.sh --zookeeper xxxx:2181/src1 --reassignment-json-file config/reassignment-json-file.json --execute --bootstrap-server xxxxxx:9090 --throttle 1048576
可以看到zk的配置中新增了以下幾個屬性:
Broker節點配置
/config/brokers/0
/config/brokers/1
/config/brokers/2
這三個Broker都新增了屬性
{
"version": 1,
"config": {
"leader.replication.throttled.rate": "1048576",
"follower.replication.throttled.rate": "1048576"
}
}
leader.replication.throttled.rate:
需要對Leader端 Fetcher傳回的資料做限流,這裡的配置就是限流的門檻值
follower.replication.throttled.rate:
需要對Follower端去Leader 副本 Fetcher資料做限流,這裡的配置就是限流的門檻值
可以看到, 裡面配置的值都是我剛剛通過
--throttle 1048576
設定的值 也就是說 1M/s.
這裡配置了這兩個屬性的意思是, 3個Broker 既要做Leader端的限流 又要做 Follower 端的限流。
并且限流的門檻值都是 1M/s.
當然, 這裡配置了限流門檻值就完了嗎?
是需要所有的資料流入流出都要限流? 還是隻是部分分區限流?
Topic節點配置
/config/topics/Topic1
新增了以下幾個配置
{
"version": 1,
"config": {
"leader.replication.throttled.replicas": "1:1,1:0,0:0,0:1",
"follower.replication.throttled.replicas": "1:2,0:2"
}
}
leader.replication.throttled.replicas:
Leader端的限流副本, 他的格式是
分區号:BrokerID
上面配置的意思如下
1:1
: Topic1-1分區在Broker-1 上需要做Leader限流
1:0
: Topic1-1分區在Broker-0 上需要做Leader限流
0:0
: Topic1-0分區在Broker-0 上需要做Leader限流
0:1
: Topic1-0分區在Broker-1 上需要做Leader限流
從這裡可以看到, 基本上原始分區副本都需要配置Leader端進行限流,并且是所有涉及到的Broker
為什麼呢?
因為在副本配置設定過程中,以前的所有副本都有可能成為Leader
比如之前 Broker-0裡面的Topic1-0 是Leader副本,如果Broker-0不小心當機了,那麼Leader就變成了Broker-1中的副本了。
是以需要把之前的所有副本都要設定Leader限流。
follower.replication.throttled.replicas
:Follower端的限流副本,他的格式是
分區号:BrokerID
上面配置的意思如下
1:2
: Topic1-1分區在Broker-2 上需要做Follower限流
0:2
: Topic1-0分區在Broker-2 上需要做Follower限流
這裡更簡單一點, 相當于是 新增的副本 和對應的Broker都做 Follower限流。
一句話:重配置設定後的新增的副本 均設定成 Follower副本限流, 重配置設定前的所有副本 均設定成Leader限流
看看整體Leader限流 和Follower限流圖
看完這個圖,給你一個問題思考一下.
如果這個上面的每個分區副本大小都是 100M, 那麼上面的配置(限流1M/S) 最終執行完成同步, 需要多長的時間呢?
站在Leader的角度看限流
Broker-0中隻有
Topic1-0
一個Leader需要進行同步(資料流出),并且隻有一個Broker-2上的副本需要同步(同步①)
那麼完成同步的時間 = 100M / Leader端的限流 1M/S = 100秒。意思是最少需要100秒
同理
Broker-1 也是最少需要100秒。
站在Follower的角度看限流
Broker-2 因為有2個副本同時在同步, 那麼總共需要Fetche的資料量是 100*2 = 200M
然後又因為Follower限流是 1M/S
是以完成同步的時間最少需要 200/1M/S = 200S.
也就是說 還沒有等到Broker-0 和 Broker-1 達到它的限流值之前, Broker-2 就已經被限流了
是以最終的時間是 200秒。
是以跟你想到的答案一緻嗎?
各種情況的限流情況
Leader 限流 Follower不限流 結論
- Leader端的限流隻會計算需要被限流的分區流量值。
- 如果多個副本向Leader端Fetch資料,那麼都會被算進限流門檻值, 基本上多一個副本就多一倍的時間。

如果有多個Leader分區都限流呢?
按照最終有多少個副本在Fetch資料.
Leader不限流 Follower限流
對應的配置有
follower.replication.throttled.replicas
:Follower分區副本的限流配置
Follower分區副本限流門檻值 b/s
follower.replication.throttled.rate
Topic1 單分區 2副本 和 Topic1 2分區 2 副本
Topic1 多分區 多 副本
多個分區 多個副本 在不同的Broker上, 不同的Broker的流量隻會算在當台Broker。
上圖中的2個Leader 都是100M。
最終決定完成重配置設定任務關鍵點是什麼?
那就是 Leader端的限流 和 Follower端限流 誰先達到門檻值
Leader端先達到門檻值
Follower 先達到門檻值
同Broker跨目錄同步限流
這個指的是 一個Broker可能有多個目錄, 我們可能會針對不同目錄做一些資料遷移。當然,這個過程也會限流
如何進行跨目錄資料遷移,文章已經寫好了,下周發,可以先關注我或者加我微信
szzdzhp001
擷取最新推文,在這一篇就不詳細展開了。
這個就是跨目錄資料遷移, 在執行這個操作的時候 ,設定限流 1M/s
--replica-alter-log-dirs-throttle 1048576
那麼會在Broker配置節點新增如下配置
/config/broker/0
{
"version": 1,
"config": {
"replica.alter.log.dirs.io.max.bytes.per.second": "1048576"
}
}
不用管,其他的分區的配置
leader.replication.throttled.replicas
和
follower.replication.throttled.replicas
什麼的,不需要, 配置了也不會用,因為這裡的限流會把這台裡面的所有跨目錄同步的資料流量給統計起來并進行限流。
如果上面的兩個分區都是100M 那麼完成遷移的最小時間是 100M*2 / 1M/s = 200秒。
留一個彩蛋(挖坑)
你知道跨目錄遷移的時候,資料是從哪裡擷取的嗎?是從本地呢?還是從Leader分區Fetch呢?
想知道答案, 可以關注石臻臻, 或者加微信
szzdzhp001
擷取最新推送
我們下次專門來分析一下 跨目錄遷移的運維操作和原了解析
如何手動設定限流
我們分析了分區副本同步過程中的所有情況, 也知道了裡面的底層原理, 想要手動配置限流資訊那豈不是随便拿捏。
雖然我這裡在寫如何設定副本同步限流的教程,但是我仍然不推薦我們主動來設定它, 因為很有可能會導緻你的副本同步變慢, ISR 跟不上。
我們之前寫過一篇關于kafka的 動态配置運維操作 和 動态配置的原了解析
如下所示, 可以通路我的個人網站 szzdzhp.com/kafka (石臻臻的雜貨鋪首字母) 檢視kafka運維大全
這裡的配置就是動态配置, 實時生效的動态配置。
設定相關配置屬性
設定Broker-0的Leader和Follower限流速率
sh bin/kafka-configs.sh --bootstrap-server xxxxx:9092 --alter --entity-type brokers --entity-name 0 --add-config leader.replication.throttled.rate=1048576,follower.replication.throttled.rate=1048576
效果如下
{
"version": 1,
"config": {
"leader.replication.throttled.rate": "1048576",
"follower.replication.throttled.rate": "1048576"
}
}
當然如果設定
replica-alter-log-dirs-throttle
話 更改上面的配置就行了。
設定Topic1的某些分區需要進行限流
我們設定
Topic1-1 需要再Broker-0 上進行Leader限流
Topic1-2 需要再Broker-1 上進行Follower限流
sh bin/kafka-configs.sh --bootstrap-server xxxxx:9092 --alter --entity-type topic --entity-name Topic1 --add-config leader.replication.throttled.replicas=1:0,follower.replication.throttled.replicas=2:1
最終效果
/config/topics/Topic1
新增了以下幾個配置
{
"version": 1,
"config": {
"leader.replication.throttled.replicas": "1:0",
"follower.replication.throttled.replicas": "2:1"
}
}
設定Topic1的所有分區在所有Broker上都需要進行限流
隻需要把值設定為
*
就行了
sh bin/kafka-configs.sh --bootstrap-server xxxxx:9092 --alter --entity-type brokers --entity-name 0 --add-config leader.replication.throttled.replicas=*,follower.replication.throttled.replicas=*
最終效果
/config/topics/Topic1
新增了以下幾個配置
{
"version": 1,
"config": {
"leader.replication.throttled.replicas": "*",
"follower.replication.throttled.replicas": "*"
}
}
再留一個彩蛋(挖坑)
如果你執行分區副本重配置設定忘記執行
--verify
沒有删除限流配置, 你應該知道如何做的吧?
如何設定合理的限流值呢?
這是一個值得思考的問題, 我們在設定限流值的時候往往可能是根據以往的時候 Broker的網卡流量
還有預估這個Broker可能出現能夠承載的最大流量, 然後設定一個合理的範圍值, 但是這個合理的限流值應該是什麼呢?
還要考慮哪些因素呢?
一台Broker上的網卡流量 除了副本同步的流量 還有哪些流量呢?
這值得我們專門寫一篇文章來分析!