单独的 zookeeper 安装或不使用 kafka 10.2?

Separate zookeeper install or not using kafka 10.2?

我想使用Kafka 10.2自带的嵌入式Zookeeper 3.4.9,不单独安装Zookeeper。每个 Kafka 代理在本地主机上总是有一个 1:1 Zookeeper。

因此,如果我在主机 A、b、C、D 和 E 上有 5 个代理,每个代理上都有一个 Kafka 和 Zookeeper 实例 运行,那么仅 运行 Kafka自带的Zookeeper?

与独立版本相比,嵌入式 3.4.9 Zookeper 有哪些缺点或配置限制?

尽管 ZooKeeper 随每个 Kafka 版本一起提供,但这并不意味着它们应该 运行 在同一台服务器上。实际上,建议在生产环境中它们 运行 在不同的服务器上。

在Kafka broker配置中可以指定ZooKeeper地址,可以是本地也可以是远程。这是来自代理配置 (config/server.properties):

# Zookeeper connection string (see zookeeper docs for details).
# This is a comma separated host:port pairs, each corresponding to a zk
# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
# You can also append an optional chroot string to the urls to specify the
# root directory for all kafka znodes.
zookeeper.connect=localhost:2181

您可以将 localhost 替换为任何其他可访问的服务器名称或 IP 地址。

这些是不 运行 zookeeper 与 Kafka 经纪人在同一个盒子上的几个原因。

  1. 它们的规模不同

    5 zk 和 5 Kafka 有效,但 6:6 或 11:11 无效。即使对于相当大的 Kafka 集群,您也不需要超过 5 个 zookeeper 节点。与 Kafka 不同,Zookeeper 将数据复制到所有节点,因此当您添加更多节点时速度会变慢。

  2. 他们争夺磁盘I/O

    Zookeeper 对磁盘 I/O 延迟非常敏感。您需要将它放在与 Kafka 提交日志不同的物理磁盘上,否则 运行 大量发布到 Kafka 的风险会减慢 zookeeper 的速度并导致它从整体中退出,从而导致潜在的问题。

  3. 它们竞争页面缓存内存

    Kafka 使用 Linux OS 页缓存来减少磁盘 I/O。当其他应用程序 运行 与 Kafka 在同一个盒子上时,您会减少或 "pollute" 页面缓存以及其他从 Kafka 缓存中带走的数据。

  4. 服务器故障导致更多基础设施瘫痪

如果盒子重新启动,您将同时失去动物园管理员和经纪人。

我们已经运行您描述的设置,有 3 到 5 个节点,每个 运行 一个 kafka 代理和 kafka 分布在相同节点上的 zookeeper。到目前为止该设置没有问题,但我们的数据吞吐量不高。

如果我们要扩展到 5 个以上的节点,我们会将它们分开,这样我们只扩展 kafka 代理,但保持 zookeeper 整体较小。如果 zookeeper 和 kafka 开始争夺 I/O 太多,那么我们会将它们的数据目录移动到单独的驱动器。如果他们开始竞争 CPU,那么我们会将他们移到单独的盒子中。

总而言之,这取决于您的预期吞吐量,以及如果它开始引起争用,您升级设置的难易程度。您可以从小处着手,将 kafka 和 zookeeper 放在一起,只要您可以灵活地使用更多节点升级您的设置并稍后引入分离。如果您认为这将很难在以后添加,最好将它们 运行 从一开始就分开。我们已经 运行 他们共处 18 个多月了,到目前为止还没有遇到资源争用。