news 2026/11/4 4:36:48

【运维】Kafka高可用: KRaft(不依赖zookeeper)集群搭建

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【运维】Kafka高可用: KRaft(不依赖zookeeper)集群搭建

文章目录

  • 一. kafka kraft 集群介绍
    • 1. KRaft架构
    • 2. Controller 服务器
    • 3. Process Roles
    • 4. Quorum Voters
    • 5. kraft的工作原理 ing
  • 二. 集群安装
    • 1. 安装
      • 1.1. 配置
      • 1.2. 格式化
    • 2. 启动测试
      • 2.1. 启功节点服务
      • 2.2. 测试

本文主要介绍了

  • kafka raft集群架构:
    与旧架构的不同点,有哪些优势,哪些问题
    架构成员有哪些,怎么规划。
  • 三节点集群安装、启动与测试

一. kafka kraft 集群介绍

1. KRaft架构

在旧的架构中

Kafka集群包含多个broker节点和一个ZooKeeper 集群。如上图集群结构:4个broker节点和3个ZooKeeper节点。Kafka 集群的controller在被选中后,会从 ZooKeeper 中加载它的状态。选举controller的过程是由zookeeper自动完成的。

在新的架构中

三个 controller 节点替代三个ZooKeeper节点。controller节点和 broker 节点运行在不同的进程中。这些controller 节点中会选择一个成为Leader。新的架构中,controller不会向 broker 推送更新,而是 broker 从 controller Leader 拉取元数据的更新信息。

尽管 controller 进程在逻辑上与 broker 进程是分离的,但它们不需要在物理上分离。即在某些情况下,部分或所有 controller 进程和 broker 进程是可以是同一个进程,即一个broker节点即是broker也是controller。

2. Controller 服务器

在KRaft模式下,通过指定某些服务器作为控制器,在Server.properties的Process.roles 参数里面配置。

不像基于ZooKeeper的模式,(zk去做的事情,我们手动配置不了)任何服务器都可以成为控制器。这带来了一个非常优秀的好处,即如果我们认为 controller 节点的负载会比其他只当做broker节点高,那么可以为 controller 节点使用高配的机器。这就解决了在1.0, 2.0架构中, controller 节点会比其他节点负载高,却无法控制哪些节点能成为 controller 节点的问题。

被(手动配置)选中的 controller 节点将参与元数据集群的选举。对于当前的 controller 节点,每个控制器服务器要么是Active的,要么是Standby的。

用户通常会选择3或5台(奇数台)服务器成为 controller 节点,3和5的个数问题和Raft的原理一样,少数服从多数。

就像使用ZooKeeper一样,为了保持可用性,你必须让大部分 controller 保持active状态。如果你有3个controller,你可以容忍1个故障;在5个控制器中,您可以容忍2个故障。

3. Process Roles

在KRaft模式下,每个Kafka服务器都有一个新的配置项,叫做process.roles, 这个参数可以有以下值:

  • 如果process.roles = broker, 服务器在KRaft模式中充当 broker。
  • 如果process.roles = controller, 服务器在KRaft模式下充当 controller。
  • 如果process.roles = broker,controller,服务器在KRaft模式中同时充当 broker 和controller。

注意:如果process.roles 没有设置。那么集群就假定是运行在ZooKeeper模式下。

对于简单的场景,组合节点更容易运行和部署,可以避免多进程运行时,JVM带来的相关的固定内存开销。但controller将较少地与系统的其余部分隔离。例如,如果代理上的活动导致内存不足,controller也会受到例如OOM的影响。

4. Quorum Voters

系统中的所有节点都必须设置 controller.quorum.voters 配置。用于配置所有想成为controller的节点。

如果你有10个broker和 3个controller1,分别命名为controller1、controller2、controller3,你可能在 controller1上有以下配置:

process.roles=controller node.id=1 listeners=CONTROLLER://controller1.example.com:9093 controller.quorum.voters=1@controller1.com:9093,2@controller2.com:9093,3@controller3.com:9093

controller.quorum.voters配置格式说明:nodeid1@controller-node1:9093,nodeid2@controller-node2:9093,nodeid3@controller-node3:9093


如果你只有三个节点,每个节点都是controller,broker角色,那么每个节点都这样配置

process.roles=broker,controller listeners=CONTROLLER://controller1.example.com:9093 controller.quorum.voters=1@controller1.com:9093,2@controller2.com:9093,3@controller3.com:9093

5. kraft的工作原理 ing

KRaft: Apache Kafka Without ZooKeeper

二. 集群安装

进行三个节点的安装,如下规划:

节点node.id角色
node11controller,broker
node22controller,broker
node33controller,broker

1. 安装

kafka下载: https://kafka.apache.org/downloads
解压

tar-zxvf kafka_2.13-3.0.0.tgz

1.1. 配置

在node1中配置:server.properties

在{KAFKA_HOME}/config/kraft/server.properties

############################# Server Basics ############################# java.home=/opt/jvm/java # The role of this server. Setting this puts us in KRaft mode process.roles=broker,controller # The node id associated with this instance's roles node.id={{broker_id}} # The connect string for the controller quorum # 每个节点配置都一样:格式:{{broker_id_1}}@{{hostname1}}:9093,{{broker_id_2}}@{{hostname2}}:9093,{{broker_id_3}}@{{hostname3}}:9093 controller.quorum.voters={{voters}} ############################# Log Basics ############################# # A comma separated list of directories under which to store log files # 数据存储目录 log.dirs=/opt/kafka3.5.0/logs

配置node2、node3,其余两个节点配置除了node.id不同,其他配置都相同。node.id配置如上节点规划。

1.2. 格式化

生成集群 ID

整个集群唯一的ID标志

$ ./bin/kafka-storage.sh random-uuid qGuAL6YzRyWQdzt4cQTZgA

格式化存储目录

使用上面生成集群 uuid, 在三个节点上都执行格式化存储目录命令:

$ ./bin/kafka-storage.shformat\-txtzWWN4bTjitpL3kfd9s5g\-c./config/kraft/server.properties

2. 启动测试

2.1. 启功节点服务

在每个节点上执行

$ ./bin/kafka-server-start.sh ./config/kraft/server.properties

2.2. 测试

# 创建topic$ bin/kafka-topics.sh--create\--topicquickstart-events\--bootstrap-server localhost:9092# 查看topic信息$ bin/kafka-topics.sh--describe\--topicquickstart-events\--bootstrap-server localhost:9092 Topic: quickstart-events TopicId: NPmZHyhbR9y00wMglMH2sg PartitionCount:1ReplicationFactor:1Configs: Topic: quickstart-events Partition:0Leader:0Replicas:0Isr:0# 生产消息$ bin/kafka-console-producer.sh\--topicquickstart-events\--bootstrap-server localhost:9092 This is my first event This is my second event#消费数据$ bin/kafka-console-consumer.sh\--topicquickstart-events\--from-beginning --bootstrap-server localhost:9092 This is my first event This is my second event
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 4:36:37

02 | LangChain 1.x:模型、工具与 Agent 的正确打开方式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 4:36:45

【初识-介绍】kafka基础(1):kafka introduction

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:09:59

001-关于vmstat命令的使用详解1.0

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:09:33

CubeMX2与STM32C5开发实战:VSCode和CLion环境搭建全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:08:43

STM32F215RE与MAX14431BAEE+的隔离SPI通信设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:08:28

工业SPI隔离方案:MAX14431与STM32L041C6实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华