牢记这三种方法!即便没有Zookeeper也能运行Kafka

1344 字丨阅读本文需 4 分钟

【51CTO原创稿件】从 Kafka 2.8 开始,在没有 Zookeeper 的情况下也可以运行 Kafka  集群。本文将介绍三种方法,它们可以在使用容器单节点集群的情况下运行Kafka。

Apache Zookeeper作为Kafka的依赖项一直用来管理Apache Kafka的元数据。值得庆幸的是从Kafka 2.8  版本开始,就可以在没有 Zookeeper 的情况下运行 Kafka 集群了。下面就给大家介绍使用容器单节点集群的三种简单方法。

Apache Kafka 为其集群实现了独立的control plane(控制面)和data plane(数据面)。Control  plane用来管理集群,跟踪哪些brokers(代理)处于活动状态,并在set(集合)更改时采取对应的行动。同时,data  plane(数据面)需要处理producer(生产者)和consumer(消费者)及其两者产生的记录信息。在之前的Kafka 版本中,Zookeeper  是实现Control plane功能的主要集群组件。

经过几年的努力,Kafka实现了Control plane的第一版功能,我们把此次更新称为KIP-500。其中 Apache Kafka Raft(也称为  KRaft)是为取代 Zookeeper 而引入的新共识协议。brokers可以作为仲裁控制器的角色来管理集群Control  plane(控制面)。此更改简化了集群部署、监控和管理等功能。新的 KRaft 控制器可以在 Apache Kafka 2.8中体验到。

Apache  Kafka的强项是消息处理机制的水平扩展和管理高吞吐量的消息,这也是一直推动Kafka发展的源动力。正因为如此,需要在生产环境的Kafka集群中使用多个broker完成上述功能。为了简单和快速入门今天的知识点,这里会从单节点集群切入给大家介绍Kafaka是如何进行进群管理的。

本文会使用Strimzi容器来包含所需要的应用环境。Strimzi 是Cloud Native Computing  Foundation项目成员,它让Apache Kafka在Kubernetes 运行起来更加从容,同时还提供了一套成熟的操作集合和容器镜像。

在本文中,我们将通过Quay Container Registry 发布和应用 Apache Kafka 2.8.1 镜像。

首先需要在同一实例中运行具有代理和控制器角色的单个容器。安装Docker或Podman并执行以下命令:

上面的命令启动一个名为“kafka-zkless”的容器并暴露Kafka的端口 9092。我们覆盖entry  point(入口点)的信息,这里包括三个方面的工作。

第一、设置环境变量,通过UUID设置集群ID。

第二、通过执行`kafka-storage.sh`脚本来格式化存储目录。

第三、使用 KRaft 配置启动 Kafka 服务器。

同时,可以使用标准的 Kafka 工具(如kcat:以前称为 kafkacat)连接到broker生成和使用相关记录。

您可以使用Compose 规范来定义您的组件。如图 1 所示, docker-compose yaml 文件的示例:

图1

从图中可以看出通过container_name定义容器名称,image定义容器镜像,其中command的部分是要执行的命令。由于该命令过长将其分成两行解释(实际上是一行,这里人为加入了回车为的是方便大家阅读),上面的一行和Docker中的命令一致,包括集群ID定义、格式化存储目录以及启动Kafaka服务器的部分。下面一行主要是重写了advertised中的listeners、security.protocol.map  以及listeners的信息。接着就是定义ports  端口为9092,在environment中定义了需要在命令行中重写的三类信息:KAFKA_ADVERTISED_LISTENERS  对应advertised中的listeners;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP对应security.protocol.map;KAFKA_LISTENERS对应listeners的信息。

可以通过如下命令执行上述示例:

本例会公开主机9092端口,如果需要在更广泛的组合部署中访问它,可以将其修改为kafka:29092,避免与其他端口冲突。

如果习惯使用Kubernetes,您可以如图2 所示的部署描述:

图2

如图2  所示,我们关注containers节点下面的内容,容器的名字为zkless-kafka,通过image定义了容器镜像,在command中定义容器启动时候的命令。

和Docker一样由于该命令过长将其分成两行解释,上面的一行依旧包括集群ID定义、格式化存储目录以及启动Kafaka服务器的部分。下面一行只定义了advertised的listeners  的信息,这个信息是从env(环境变量)中的KAFKA_ADVERTISED_LISTENERS 对应的value中读取。

可以通过如下命令执行上面的文件:

执行之后会对镜像进行部署,将通过使用zkless-kafka-bootstrap主机名公开引导服务器。同时会对部署服务器所在的当前命名空间的访问限制。此时就可以和其他advertised  listeners(广播监听者)一样获取你想要的消息了。

本文简要介绍了 Apache Kafka 新Control  plane(控制面)的实现。由于上一个版本的Kafaka完成集群控制的功能,借此可以使用功能强大的 Zookeeperless Kafka  集群。我们回顾了使用容器镜像部署单节点集群的三种简单方法:执行简单的 Docker 或 podman 命令、执行 docker-compose 文件以及在  Kubernetes 上部署运行中的 pod。

崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。曾任惠普技术专家。乐于分享,撰写了很多热门技术文章,阅读量超过60万。《分布式架构原理与实践》作者。

来源:51CTO崔皓

免责声明:凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处本网。非本网作品均来自其他媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如您发现有任何侵权内容,请依照下方联系方式进行沟通,我们将第一时间进行处理。

0赞 好资讯,需要你的鼓励
来自:51CTO
0

参与评论

登录后参与讨论 0/1000

为你推荐

加载中...