单独动物园管理员安装或不使用 kafka 10.2



我想使用 Kafka 10.2 附带的嵌入式 Zookeeper 3.4.9,而不是单独安装 Zookeeper。每个 Kafka 经纪人在本地主机上将始终有一个 1:1 的动物园管理员。

因此,如果我在主机 A、B、C、D 和 E 上有 5 个代理,每个代理都有一个 Kafka 和 Zookeeper 实例在它们上运行,那么运行随 Kafka 提供的 Zookeeper 就足够了吗?

嵌入式 3.4.9 Zookeeper 与独立版本相比有哪些缺点或配置限制(如果有的话)?

这些是不要在与 Kafka 代理相同的盒子上运行 zookeeper 的几个原因。

  1. 它们的扩展方式不同

    5zk和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 在同一个盒子上运行时,您会减少或"污染"页面缓存,其中包含从 Kafka 缓存中获取的其他数据。

  4. 服务器故障导致更多基础架构瘫痪

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

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

在 Kafka 代理配置中,您可以指定 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 地址。

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

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

总而言之,这取决于您的预期吞吐量,以及如果它开始引起争用,您可以轻松升级设置。你可以从小而简单开始,kafka 和 zookeeper 位于同一地点,只要你能灵活地升级你的设置,有更多的节点,并在以后引入分离。如果您认为以后很难添加,最好从头开始单独运行它们。我们已经在同一个位置运行了 18+ 个月,到目前为止还没有遇到资源争用。

最新更新