从 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(数据面)。Controlplane用来管理集群,跟踪哪些brokers(代理)处于活动状态,并在set(集合)更改时采取对应的行动。同时,dataplane(数据面)需要处理producer(生产者)和consumer(消费者)及其两者产生的记录信息。在之前的Kafka 版本中,Zookeeper是实现Control plane功能的主要集群组件。
经过几年的努力,Kafka实现了Control plane的第一版功能,我们把此次更新称为KIP-500。其中 Apache Kafka Raft(也称为KRaft)是为取代 Zookeeper 而引入的新共识协议。brokers可以作为仲裁控制器的角色来管理集群Controlplane(控制面)。此更改简化了集群部署、监控和管理等功能。新的 KRaft 控制器可以在 Apache Kafka 2.8中体验到。
容器化单节点
ApacheKafka的强项是消息处理机制的水平扩展和管理高吞吐量的消息,这也是一直推动Kafka发展的源动力。正因为如此,需要在生产环境的Kafka集群中使用多个broker完成上述功能。为了简单和快速入门今天的知识点,这里会从单节点集群切入给大家介绍Kafaka是如何进行进群管理的。
本文会使用Strimzi容器来包含所需要的应用环境。Strimzi 是Cloud Native ComputingFoundation项目成员,它让Apache Kafka在Kubernetes 运行起来更加从容,同时还提供了一套成熟的操作集合和容器镜像。
在本文中,我们将通过Quay Container Registry 发布和应用 Apache Kafka 2.8.1 镜像。
Docker 或 Podman
首先需要在同一实例中运行具有代理和控制器角色的单个容器。安装Docker或Podman并执行以下命令:
dockerrun-it--namekafka-zkless-p9092:9092-eLOG_DIR=/tmp/logsquay.io/strimzi/kafka:latest-kafka-2.8.1-amd64/bin/sh-c'exportCLUSTER_ID=$(bin/kafka-storage.shrandom-uuid)&&bin/kafka-storage.shformat-t$CLUSTER_ID-cconfig/kraft/server.properties&&bin/kafka-server-start.shconfig/kraft/server.properties'
上面的命令启动一个名为“kafka-zkless”的容器并暴露Kafka的端口 9092。我们覆盖entrypoint(入口点)的信息,这里包括三个方面的工作。
第一、设置环境变量,通过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-composeup-d
本例会公开主机9092端口,如果需要在更广泛的组合部署中访问它,可以将其修改为kafka:29092,避免与其他端口冲突。
Kubernetes 部署
如果习惯使用Kubernetes,您可以如图2 所示的部署描述:
图2
如图2所示,我们关注containers节点下面的内容,容器的名字为zkless-kafka,通过image定义了容器镜像,在command中定义容器启动时候的命令。
和Docker一样由于该命令过长将其分成两行解释,上面的一行依旧包括集群ID定义、格式化存储目录以及启动Kafaka服务器的部分。下面一行只定义了advertised的listeners的信息,这个信息是从env(环境变量)中的KAFKA_ADVERTISED_LISTENERS 对应的value中读取。
可以通过如下命令执行上面的文件:
kubectlapply-fkubernetes.yaml
执行之后会对镜像进行部署,将通过使用zkless-kafka-bootstrap主机名公开引导服务器。同时会对部署服务器所在的当前命名空间的访问限制。此时就可以和其他advertisedlisteners(广播监听者)一样获取你想要的消息了。
概括
本文简要介绍了 Apache Kafka 新Controlplane(控制面)的实现。由于上一个版本的Kafaka完成集群控制的功能,借此可以使用功能强大的 Zookeeperless Kafka集群。我们回顾了使用容器镜像部署单节点集群的三种简单方法:执行简单的 Docker 或 podman 命令、执行 docker-compose 文件以及在Kubernetes 上部署运行中的 pod。
作者简介
崔皓,社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。曾任惠普技术专家。乐于分享,撰写了很多热门技术文章,阅读量超过60万。《分布式架构原理与实践》作者。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载者并注明出处:https://www.jmbhsh.com/muyingyongpin/36004.html