其他
13张图让你学会Kafka分区副本同步限流机制
The following article is from 石臻臻的杂货铺 Author 石臻臻的杂货铺
大家好,我是Tom哥~
今天我们来讲解一下 《Kafka分区副本同步限流机制三部曲》中的第二篇 《原理篇》
我们这里讲的限流机制, 只是副本之间的同步限流机制,并不包含 生产者 、消费组 等等其他的限流。
那么讲到副本同步, 我们都知道正常情况下,我们是不会给副本的同步加上限流值的,因为这样子很可能会导致副本跟不上ISR, 那么什么情况下我们需要加上这个限流值呢?
分区副本重分配的场景下,我们可能怕大批量的数据进行迁移会占用过的的资源,导致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 不同目录直接的流量的?如何正确的 设置这些限流值呢?有哪些参考标准? 我可以手动设置限流吗?
不同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
/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./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限流follower.replication.throttled.replicas
:Follower端的限流副本,他的格式是 分区号:BrokerID
上面配置的意思如下1:2
: Topic1-1分区在Broker-2 上需要做Follower限流0:2
: Topic1-0分区在Broker-2 上需要做Follower限流Topic1-0
一个Leader需要进行同步(数据流出),并且只有一个Broker-2上的副本需要同步(同步①)
那么完成同步的时间 = 100M / Leader端的限流 1M/S = 100秒。意思是最少需要100秒各种情况的限流情况
Leader 限流 Follower不限流 结论
Leader端的限流只会计算需要被限流的分区流量值。 如果多个副本向Leader端Fetch数据,那么都会被算进限流阈值, 基本上多一个副本就多一倍的时间。
按照最终有多少个副本在Fetch数据.
Leader不限流 Follower限流
对应的配置有 follower.replication.throttled.replicas
:Follower分区副本的限流配置follower.replication.throttled.rate
Follower分区副本限流阈值 b/s
多个分区 多个副本 在不同的Broker上, 不同的Broker的流量只会算在当台Broker。
那就是 Leader端的限流 和 Follower端限流 谁先达到阈值
同Broker跨目录同步限流
这个指的是 一个Broker可能有多个目录, 我们可能会针对不同目录做一些数据迁移。当然,这个过程也会限流
szzdzhp001
获取最新推文,在这一篇就不详细展开了。--replica-alter-log-dirs-throttle 1048576
/config/broker/0
"version": 1,
"config": {
"replica.alter.log.dirs.io.max.bytes.per.second": "1048576"
}
}
leader.replication.throttled.replicas
和follower.replication.throttled.replicas
什么的,不需要, 配置了也不会用,因为这里的限流会把这台里面的所有跨目录同步的数据流量给统计起来并进行限流。szzdzhp001
获取最新推送
我们下次专门来分析一下 跨目录迁移的运维操作和原理解析如何手动设置限流
我们分析了分区副本同步过程中的所有情况, 也知道了里面的底层原理, 想要手动配置限流信息那岂不是随便拿捏。
设置相关配置属性
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
/config/topics/Topic1
新增了以下几个配置"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=*
/config/topics/Topic1
新增了以下几个配置"version": 1,
"config": {
"leader.replication.throttled.replicas": "*",
"follower.replication.throttled.replicas": "*"
}
}