一、Quota 功能简介官方文档
二、Quota功能简介
Kafka从0.9版本开始增加流量控制功能–Quotas,并在broker中增加了以下的配置。
- 可以在broker的配置文件中增加相应的对producer和consumer的流量控制配置,即每秒生产/消费的byte数目大小。
- 默认值是Long类型的最大值,即不限制流量,尽最大可能地生产/消费消息。
- 但可以看到在新版的配置中,这两项配置已经被声明为Deprecated,即不再建议使用,且官方声明在未来的release版本中,会删除这两项配置。
- 0.10版本的Kafka已经通过与Zookeeper结合来完成Quota的功能。将Quota限流的配置信息存储到ZK的结点中,这样配置一旦更新,可以立刻被所有的broker读取到,并且立即生效。这让我们可以更新Quota的配置,而不需要重启整体broker集群。因此,broker配置的限流功能会被废弃掉。
三、Quota使用参考文档
http://kafka.apache.org/documentation/#quotas
四、Quota使用
在0.10版本的Kafka中提供了用户权限认证这一功能,即每一台客户端实例,均可以配置相应的user属性,同时可以配置client-id属性。暂时对user属性研究还不太透彻,这里以client-id为例进行说明。
Producer Config
Consumer Config
- 上面是producer和consumer的配置说明,均有client.id的配置项,客户端在启动时,可以配置client.id的属性。如我在producer客户端配置的client.id为producer_test_id。
- 对client.id = producer_test_id的客户端实例进行限流,执行Kafka/bin目录下的脚本
sh kafka-configs.sh --zookeeper 172.18.55.21:2181,172.18.55.21:2182 --alter --add-config 'producer_byte_rate=1024,consumer_byte_rate=2048' --entity-type clients --entity-name producer_test_id
- kafka-configs.sh脚本主要参数说明
--zookeeper 指定zk集群地址
--producer_byte_rate 指定producer生产速率限制,单位byte
--consumer_byte_rate 指定consumer消费速率限制,单位byte
--entity-type 指定Quota功能是基于user还是client.id维度
--entity-name 指定user或client.id
- Kafka集群所连接的Zookeeper集群中,在根节点中有/config结点,负责存储配置相关信息。查看client.id配置情况
可以看到在/config/clients 结点路径下,有配置的三个client.id - 查看client.id = producer_test_id 的配置情况
可以看到刚刚通过脚本写入的配置信息,已经以json格式存储到zk结点中。 - 运行kafka/bin 目录下的性能测试脚本
sh kafka-producer-perf-test.sh --topic topic_2 --num-records 300 --record-size 100 --throughput 15 --producer-props bootstrap.servers=172.18.55.21:9092,172.18.55.21:9093 client.id=producer_test_id
- kafka-producer-perf-test.sh脚本主要参数说明
--topic 指定topic
--num-records 指定producer生产消息条数
--record-size 指定producer生产每条消息大小,单位byte
--throughput 指定吞吐量,单位消息条数
--producer-props 指定procuder配置情况,包括servers地址和client.id
- 观察性能测试脚本运行结果,可以看到限流配置已经生效,生产速率不稳定。
而正常的性能测试,测试结果应该如下图,每秒的吞吐量应该是趋于稳定的。
当配置的吞吐量过大,kafka已经达到限流的上限,且消息堆积一段时间后,kafka broker会采取抛弃策略,这样会出现以下的性能测试结果,可以看到消息均抛出异常。
在本地运行producer客户端,每生产一条消息打印一条日志,效果更加明显,可以明显看到生产是一段一段的,当达到限流的时候,生产速率非常非常慢。当过了一秒左右,又可以看到速度提升到正常速度。
五、Quota详细配置
上文提到0.10版本的kafka提供了用户权限认证功能,即在设置限流Quota功能时,可以基于user和client.id两个维度。
- User维度的配置在Zookeeper中,存储在/config/usres结点下。
当指定了一个user时,存储结点路径为/config/users/<user>。 - 在user的维度下,也可以设置client.id的。
当既指定了user,又指定了client.id时,存储结点路径为/config/users/<user>/clients/<client.id> - 这样在配置Quota功能时,有优先级顺序,优先级如下:
/config/users/<user>/clients/<client-id>
/config/users/<user>/clients/<default>
/config/users/<user>
/config/users/<default>/clients/<client-id>
/config/users/<default>/clients/<default>
/config/users/<default>
/config/clients/<client-id>
/config/clients/<default>
- 指定user = user1,指定client.id = producer_test_id进行限流Quota配置
sh kafka-configs.sh --zookeeper 172.18.55.21:2181,172.18.55.21:2182 --alter --add-config 'producer_byte_rate=1024,consumer_byte_rate=2048' –entity-type users –entity-name user1 --entity-type clients --entity-name producer_test_id
六、结论
- 需要使用Quota功能,必须升级Kafka版本,从0.9版本才开始提供该功能
- 若可以接受升级,不推荐升级到0.9版本,0.9.0.0版本有bug。
- 建议升级到最新版0.10.2.0版本。