一、Quota 功能简介官方文档

二、Quota功能简介

Kafka从0.9版本开始增加流量控制功能–Quotas,并在broker中增加了以下的配置。

CDH kafka 限流 kafka consumer限流_结点

  • 可以在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

CDH kafka 限流 kafka consumer限流_kafka_02

Consumer Config

CDH kafka 限流 kafka consumer限流_kafka_03

  1. 上面是producer和consumer的配置说明,均有client.id的配置项,客户端在启动时,可以配置client.id的属性。如我在producer客户端配置的client.id为producer_test_id。
  2. 对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
  1. 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
  1. Kafka集群所连接的Zookeeper集群中,在根节点中有/config结点,负责存储配置相关信息。查看client.id配置情况

    CDH kafka 限流 kafka consumer限流_结点_04

    可以看到在/config/clients 结点路径下,有配置的三个client.id
  2. 查看client.id = producer_test_id 的配置情况

    CDH kafka 限流 kafka consumer限流_kafka_05

    可以看到刚刚通过脚本写入的配置信息,已经以json格式存储到zk结点中。
  3. 运行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
  1. kafka-producer-perf-test.sh脚本主要参数说明
--topic           指定topic

--num-records     指定producer生产消息条数

--record-size     指定producer生产每条消息大小,单位byte

--throughput      指定吞吐量,单位消息条数

--producer-props  指定procuder配置情况,包括servers地址和client.id
  1. 观察性能测试脚本运行结果,可以看到限流配置已经生效,生产速率不稳定。

    CDH kafka 限流 kafka consumer限流_kafka_06

    而正常的性能测试,测试结果应该如下图,每秒的吞吐量应该是趋于稳定的。

    CDH kafka 限流 kafka consumer限流_CDH kafka 限流_07

    当配置的吞吐量过大,kafka已经达到限流的上限,且消息堆积一段时间后,kafka broker会采取抛弃策略,这样会出现以下的性能测试结果,可以看到消息均抛出异常。

    CDH kafka 限流 kafka consumer限流_限流_08

    在本地运行producer客户端,每生产一条消息打印一条日志,效果更加明显,可以明显看到生产是一段一段的,当达到限流的时候,生产速率非常非常慢。当过了一秒左右,又可以看到速度提升到正常速度。

五、Quota详细配置

上文提到0.10版本的kafka提供了用户权限认证功能,即在设置限流Quota功能时,可以基于user和client.id两个维度。

  1. User维度的配置在Zookeeper中,存储在/config/usres结点下。
    当指定了一个user时,存储结点路径为/config/users/<user>。
  2. 在user的维度下,也可以设置client.id的。
    当既指定了user,又指定了client.id时,存储结点路径为/config/users/<user>/clients/<client.id>
  3. 这样在配置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>
  1. 指定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

六、结论

  1. 需要使用Quota功能,必须升级Kafka版本,从0.9版本才开始提供该功能
  2. 若可以接受升级,不推荐升级到0.9版本,0.9.0.0版本有bug。
  3. 建议升级到最新版0.10.2.0版本。