卡夫卡拓扑最佳实践

Ahm*_*aya 2 apache-kafka

我有4台机器,其中Kafka群集配置了拓扑,每台机器有一个zookeeper和两个代理.

使用此配置,您对最佳主题和分区有何建议以获得最佳性能?

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

谢谢?

Pra*_*mer 6

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

至于主题数量取决于机器中最小RAM的大小.这是因为Zookeeper将所有内容保存在内存中以便快速访问(同时它不会对znodes进行分片,只需在写入时跨ZK节点进行复制).这实际上意味着一旦你耗尽一台机器内存,ZK将无法添加更多主题.

在他们的网站上引用KAFKA文档(6.1基本Kafka操作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/