卡夫卡拓扑最佳实践

时间:2017-08-10 20:54:38

标签: apache-kafka

我有4台机器,其中Kafka群集配置了拓扑 每台机器都有一个动物园管理员和两个经纪人。

使用此配置,您对最佳主题和分区的建议是什么?

复制因子3: 使用kafka 0.10.XX

感谢?

1 个答案:

答案 0 :(得分:6)

无论有多少节点(截至2017年7月),每个主题都限制在100,000个分区

主题数量取决于机器中最小RAM的大小。这是因为Zookeeper将所有内容保存在内存中以便快速访问(同时它不会对znodes进行分片,只需在写入时跨ZK节点进行复制)。这实际上意味着一旦你耗尽一台机器内存,ZK将无法添加更多主题。在Kafka代理节点上达到此限制之前,您很可能会用完文件句柄。

在他们的网站上引用KAFKA文档(6.1基本卡夫卡行动https://kafka.apache.org/documentation/#basic_ops_add_topic):

  

每个分片分区日志都放在Kafka日志目录下的自己的文件夹中。此类文件夹的名称由主题名称,短划线( - )和分区ID组成。由于典型的文件夹名称长度不能超过255个字符,因此主题名称的长度将受到限制。我们假设分区数量不会超过100,000。因此,主题名称不能超过249个字符。这在短划线的文件夹名称和可能的5位长分区ID中留下了足够的空间。

引用Zookeeper文档(https://zookeeper.apache.org/doc/trunk/zookeeperOver.html):

  

复制数据库是包含整个数据树的内存数据库。更新将记录到磁盘以获得可恢复性,并且写入在应用于内存数据库之前会序列化到磁盘。

性能:

根据您的发布和消费语义,主题分区有限性将发生变化。以下是一组您应该问自己的问题,以深入了解潜在的解决方案(您的问题是非常开放的):

  • 我发布的数据是否具有关键性(即不能丢失它,必须确保我已经发布它,必须完全消费一次)?
  • 我应该尽可能使producer.send()调用同步还是继续使用异步方法进行批处理(我是否需要权衡发布保证的速度)?
  • 我发布的邮件是否相互依赖?是否必须在消息B之前消费消息A(暗示A在B之前发布)?
  • 如何选择将邮件发送到哪个分区?    我应该:将消息分配给一个分区(额外的生产者逻辑),让集群以循环方式决定,或者分配一个密钥,该密钥将散列到该主题的一个分区(需要提出均匀分布的哈希在分区之间获得良好的负载平衡)
  • 你应该有多少主题?这与数据的语义有什么关系?为许多不同的逻辑数据域自动创建主题是否有效(想想对Zookeeper的影响以及删除过时主题的管理难题)?
  • 分区提供并行性(更多消费者可能)并且可能增加正负载平衡效果(如果生产者正确发布)。是否要将问题域元素的一部分分配给特定分区(将客户端A的数据发布到分区1时)?这有什么副作用(想想可重构性和可维护性)?
  • 您是否希望制作比您需要更多的分区,以便在需要时可以扩展更多的经纪人/消费者?考虑到您的专业知识,KAFKA集群的自动扩展有多现实?这会手动完成吗?手动扩展是否适用于您的问题域(您是否围绕具有众所周知特征的固定系统构建KAFKA,或者您是否需要能够处理消息中的严重峰值)?
  • 我的消费者如何订阅主题?他们会使用预先配置的配置还是使用正则表达式来使用许多主题?主题之间的消息是依赖还是优先(消费者需要额外的逻辑来实现优先级)?
  • 您是否应该使用不同的网络接口在代理之间进行复制(即生产者/消费者的端口9092和复制流量的9093)?

良好链接:

http://cloudurable.com/ppt/4-kafka-detailed-architecture.pdf https://www.slideshare.net/ToddPalino/putting-kafka-into-overdrive https://www.slideshare.net/JiangjieQin/no-data-loss-pipeline-with-apache-kafka-49753844 https://kafka.apache.org/documentation/