kafka配额

半兽人 发表于: 2017-01-07   最后更新时间: 2017-02-10  
  •   53 订阅,543 游览

4.9 配额

从0.9开始,Kafka集群能够对生产和消费设置配额。为每个客户端分组设置配额阈值(基于字节比率)。

为什么需要配额?

生产者和消费者的可能用生产/消费非常大量的数据,从而垄断了broker的资源,引起网络饱和,配额可防止这个问题。在大型多节点集群中更加重要。其中有一小部分不良行为的用户将被降权。事实上,当kafka作为服务运行时,可以根据约定好的协议执行API限制。

客户端集群

Kafka客户端的身份表示在安全集群中已认证的用户principal。在一个支持未认证的客户端中,用户principal是一个未认证的分组。用户principal是通过broker(使用可配置的PrincipalBuilder)选择未认证的用户分组,Client-id是客户端应用程序选择的具有有意义名称的客户端的逻辑分组。元组(user,client-id)定义了共享用户principal和client-id的客户端安全逻辑分组。

配置可应用到(user,client-id),用户或client-id分组。对于一个给定的连接,将应用与连接匹配的配额。配置分组的所有连接共享该分组的配额。例如,如果(user="test-user", client-id="test-client")的生产者的配额是10MB/秒,这个配额将在用户“test-user”与client-id "test-client"的所有生产者实例之间分享这个配额。

配额配置

为user和client-id分组定义配额配置。可根据自身需要去覆盖默认的配置,这个机制类似于topic日志配置覆盖。用户和(user, client-id)配额覆盖写在ZooKeeper的/config/users下,client-id配额覆盖写在/config/clients下。这写配置被所有broker读取,并立即生效。并且我们更改配置而无需重启整个集群。点击这里查看更多细节。每个分组默认的配额也可使用相同的机制来动态地更新。

配额配置的优先级顺序为:

1. /config/users/<user>/clients/<client-id>
2. /config/users/<user>/clients/<default>
3. /config/users/<user>
4. /config/users/<default>/clients/<client-id>
5. /config/users/<default>/clients/<default>
6. /config/users/<default>
7. /config/clients/<client-id>
8. /config/clients/<default>

可以通过Broker配置(quota.producer.default, quota.consumer.default)为client-id分组设置默认的属性。但已不赞成使用,并将在后面的版本移除。可以在Zookeeper设置client-id的默认配额,类似与其他的配额覆盖和默认值。

强制执行

默认情况下,每个客户端分组将按照集群配置的固定的配额(以byte/秒为单位)。此配额基于每个broker定义的。每个客户端被限制之前每个broker可发布/拉取最多X byte/每秒。我们为每个broker定义这些配额比为每个客户端固定的集群带宽要好得多,因为这需要一种在所有broker之间共享客户端配额使用的机制。这可能比配额实现其本身更难获取。

当检测到配额违规时,broker该做出什么样的反应?在我们的解决方案中,broker不返回错误,而是尝试减慢超出其配额的客户端。它计算延迟量,使违规的客户端根据其配额并延迟该时段的响应时间。这个方法保持对客户端违法配额透明(除client度量)。这也使他们不必实现任何特殊的回退或重试(否则可能会变得很麻烦)。 事实上,坏的客户端行为(不重试回退)可能加速尝试解决的配额问题。

客户端字节速率在多个小窗口上测量(例如。每1秒30个窗口)。以便快速察觉和纠正配额违规。通常情况下,大的测量窗口(例如,每30秒10个窗口)导致大流量突发,引起很长的延迟,这样对用户体验不好。







发表于: 2月前   最后更新时间: 1月前   游览量:543
上一条: kafka broker配置(0.10版)
下一条: kafka实战kerberos(笔记)
评论…

  • 评论…
    • in this conversation
      提问