13 张图让你学会 Kafka 分区副本同步限流机制
The following article is from 石臻臻的杂货铺 Author 石臻臻的杂货铺
今天我们来讲解一下限流机制。本文提到的限流机制指副本之间的同步限流机制,并不包含生产者 、消费组等其他限流。
那么讲到副本同步,大家都知道,正常情况下我们是不会给副本的同步加上限流值的。因为这样子很可能会导致副本跟不上 ISR(in-sync replica),那么什么情况下我们需要加上这个限流值呢?
分区副本重分配的场景下,我们可能担心大批量的数据进行迁移会占用过多的资源,导致 Kafka 集群压力增大进而影响正常使用。所以,一般情况下我们可能会选择在低峰期进行操作,也会对整个操作做一个限流处理。
--replica-alter-log-dirs-throttle:broker 内部副本跨路径迁移数据流量限制功能,限制数据拷贝从一个目录到另外一个目录带宽上限,单位 bytes/sec;
--throttle:迁移过程中 Broker 之间传输的速率,单位 bytes/sec。
--throttle:迁移过程 Broker 之间传输的速率,这里的“Broker 之间”是谁和谁之间? Broker之间传输的速率怎么算?是 Broker 整体所有分区副本的传输速率,还是指定几个分区副本的传输速率? 这个传输速率是什么?是 Broker 数据流出的速率,还是数据流入的速率,还是网卡的速率? --replica-alter-log-dirs-throttle 又是怎么限制住 Broker 不同目录直接的流量的? 如何正确设置这些限流值呢?有哪些参考标准? 可以手动设置限流吗?
1. 不同 Broker 之间副本同步限流
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
{
"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 数据做限流。这里的配置就是限流的阈值。
{
"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 限流。
1:2 - Topic1-1 分区在 Broker-2 上需要做 Follower 限流;
0:2 - Topic1-0 分区在 Broker-2 上需要做 Follower 限流。
3. 各种条件下的限流情况
1) Leader 限流,Follower 不限流
结论:
Leader 端的限流只会计算需要被限流的分区流量值; 如果多个副本向 Leader 端 Fetch 数据,那么都会被算进限流阈值。基本上多一个副本就多一倍的时间。
如果有多个 Leader 分区都限流呢?
按照最终有多少个副本在 Fetch 数据。
2) Leader 不限流,Follower 限流
3) Topic1 单分区 2 副本和 Topic1 双分区 2 副本
4) Topic1 多分区、多副本
上图中的两个 Leader 都是 100M。
a) Leader 端先达到阈值
b) Follower 先达到阈值
5) 同 Broker 跨目录同步限流
这个就是跨目录数据迁移。在执行这个操作的时候 ,设置限流 1M/s --replica-alter-log-dirs-throttle 1048576。
{
"version": 1,
"config": {
"replica.alter.log.dirs.io.max.bytes.per.second": "1048576"
}
}
4. 如何手动设置限流
我们分析了分区副本同步过程中的所有情况,也知道了里面的底层原理,想要手动配置限流信息那岂不是随便拿捏。
虽然我这里在写如何设置副本同步限流的教程,但是我仍然不推荐我们主动来设置它。因为很有可能会导致你的副本同步变慢 ISR 跟不上。
这里的配置就是动态配置,实时生效的动态配置。
设置相关配置属性
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 话,更改上面的配置就行了。
sh bin/kafka-configs.sh --bootstrap-server xxxxx:9092 --alter --entity-type brokers --entity-name 0 --add-config leader.replication.throttled.replicas=1:0,follower.replication.throttled.replicas=2:1
{
"version": 1,
"config": {
"leader.replication.throttled.replicas": "1:0",
"follower.replication.throttled.replicas": "2:1"
}
}
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=*
{
"version": 1,
"config": {
"leader.replication.throttled.replicas": "*",
"follower.replication.throttled.replicas": "*"
}
}
- EOF -
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
点赞和在看就是最大的支持❤️