牢记这三种方法!即便没有Zookeeper也能运行Kafka 原创
云计算 Kafka
从 Kafka 2.8 开始,在没有 Zookeeper 的情况下也可以运行 Kafka 集群。本文将介绍三种方法,它们可以在使用容器单节点集群的情况下运行Kafka。

【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并执行以下命令:

  1. 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的信息。

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

  1. 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中读取。

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

  1. 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】

责任编辑:华轩 来源: 51CTO

同话题下的热门内容

携手构建丹东纺织工业互联网平台,助力纺织业专精特新企业数字化转型自动化的云优化会取代DevOps人员的工作吗?创建云迁移测试策略指南监控云流量的七种QoS优秀实践2022年针对云计算基础设施的网络犯罪威胁将不断上升2022 年值得关注的三个云安全趋势改进边缘计算进行数据处理的优秀实践三大核心优势,亚马逊云科技助力跨国企业植根中国

编辑推荐

一文让你看懂IaaS、PaaS和SaaS看完小白也能懂什么是公有云、私有云、混合云Hyper-V深度评测六:虚拟机迁移方面的改进IOUG主席谈Oracle云服务战略和大数据用途你在 Docker 中跑 MySQL?恭喜你,好下岗了!
我收藏的内容
点赞
收藏

51CTO技术栈视频号