【51CTO.com原创稿件】从 Kafka 2.8 开始,在没有 Zookeeper 的情况下也可以运行 Kafka 集群。本文将介绍三种方法,它们可以在使用容器单节点集群的情况下运行Kafka。
Apache Zookeeper作为Kafka的依赖项一直用来管理Apache Kafka的元数据。值得庆幸的是从Kafka 2.8 版本开始,就可以在没有 Zookeeper 的情况下运行 Kafka 集群了。下面就给大家介绍使用容器单节点集群的三种简单方法。
Control plane(控制面)和data plane(数据面)
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
首先需要在同一实例中运行具有代理和控制器角色的单个容器。安装Docker或Podman并执行以下命令:
docker run -it --name kafka-zkless -p 9092:9092 -e LOG_DIR=/tmp/logs quay.io/strimzi/kafka:latest-kafka-2.8.1-amd64 /bin/sh -c 'export CLUSTER_ID=$(bin/kafka-storage.sh random-uuid) && bin/kafka-storage.sh format -t $CLUSTER_ID -c config/kraft/server.properties && bin/kafka-server-start.sh config/kraft/server.properties'
上面的命令启动一个名为“kafka-zkless”的容器并暴露Kafka的端口 9092。我们覆盖entry point(入口点)的信息,这里包括三个方面的工作。
第一、设置环境变量,通过UUID设置集群ID。
第二、通过执行`kafka-storage.sh`脚本来格式化存储目录。
第三、使用 KRaft 配置启动 Kafka 服务器。
同时,可以使用标准的 Kafka 工具(如kcat:以前称为 kafkacat)连接到broker生成和使用相关记录。
Docker Compose
您可以使用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的信息。
可以通过如下命令执行上述示例:
docker-compose up -d
本例会公开主机9092端口,如果需要在更广泛的组合部署中访问它,可以将其修改为kafka:29092,避免与其他端口冲突。
Kubernetes 部署
如果习惯使用Kubernetes,您可以如图2 所示的部署描述:
图2
如图2 所示,我们关注containers节点下面的内容,容器的名字为zkless-kafka,通过image定义了容器镜像,在command中定义容器启动时候的命令。
和Docker一样由于该命令过长将其分成两行解释,上面的一行依旧包括集群ID定义、格式化存储目录以及启动Kafaka服务器的部分。下面一行只定义了advertised的listeners 的信息,这个信息是从env(环境变量)中的KAFKA_ADVERTISED_LISTENERS 对应的value中读取。
可以通过如下命令执行上面的文件:
kubectl apply -f kubernetes.yaml
执行之后会对镜像进行部署,将通过使用zkless-kafka-bootstrap主机名公开引导服务器。同时会对部署服务器所在的当前命名空间的访问限制。此时就可以和其他advertised listeners(广播监听者)一样获取你想要的消息了。
概括
本文简要介绍了 Apache Kafka 新Control plane(控制面)的实现。由于上一个版本的Kafaka完成集群控制的功能,借此可以使用功能强大的 Zookeeperless Kafka 集群。我们回顾了使用容器镜像部署单节点集群的三种简单方法:执行简单的 Docker 或 podman 命令、执行 docker-compose 文件以及在 Kubernetes 上部署运行中的 pod。
作者简介
崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。曾任惠普技术专家。乐于分享,撰写了很多热门技术文章,阅读量超过60万。《分布式架构原理与实践》作者。
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】