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

文章目录

  • [一. kafka kraft 集群介绍](#一. kafka kraft 集群介绍)
    • [1. KRaft架构](#1. KRaft架构)
    • [2. Controller 服务器](#2. Controller 服务器)
    • [3. Process Roles](#3. Process Roles)
    • [4. Quorum Voters](#4. Quorum Voters)
    • [5. kraft的工作原理 ing](#5. kraft的工作原理 ing)
  • [二. 集群安装](#二. 集群安装)
    • [1. 安装](#1. 安装)
      • [1.1. 配置](#1.1. 配置)
      • [1.2. 格式化](#1.2. 格式化)
    • [2. 启动测试](#2. 启动测试)
      • [2.1. 启功节点服务](#2.1. 启功节点服务)
      • [2.2. 测试](#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上有以下配置:

xml 复制代码
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角色,那么每个节点都这样配置

xml 复制代码
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 角色
node1 1 controller,broker
node2 2 controller,broker
node3 3 controller,broker

1. 安装

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

解压

c 复制代码
tar -zxvf kafka_2.13-3.0.0.tgz

1.1. 配置

在node1中配置:server.properties

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

pro 复制代码
############################# 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标志

shell 复制代码
$ ./bin/kafka-storage.sh random-uuid
qGuAL6YzRyWQdzt4cQTZgA

格式化存储目录

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

shell 复制代码
$ ./bin/kafka-storage.sh format \
-t xtzWWN4bTjitpL3kfd9s5g \
-c ./config/kraft/server.properties

2. 启动测试

2.1. 启功节点服务

在每个节点上执行

shell 复制代码
$ ./bin/kafka-server-start.sh ./config/kraft/server.properties

2.2. 测试

shell 复制代码
# 创建topic
$ bin/kafka-topics.sh --create \
--topic quickstart-events \
--bootstrap-server localhost:9092


# 查看topic信息
$ bin/kafka-topics.sh --describe \
--topic quickstart-events \
--bootstrap-server localhost:9092

Topic: quickstart-events        TopicId: NPmZHyhbR9y00wMglMH2sg PartitionCount: 1       ReplicationFactor: 1	Configs:
    Topic: quickstart-events Partition: 0    Leader: 0   Replicas: 0 Isr: 0


# 生产消息
$ bin/kafka-console-producer.sh \
--topic quickstart-events  \
--bootstrap-server localhost:9092

This is my first event
This is my second event


#消费数据
$ bin/kafka-console-consumer.sh \
--topic quickstart-events \
--from-beginning --bootstrap-server localhost:9092

This is my first event
This is my second event
相关推荐
鲁正杰1 小时前
在一个服务器上抓取 Docker 镜像并在另一个服务器上运行
运维·服务器·docker
aherhuo1 小时前
基于openEuler22.09部署OpenStack Yoga云平台(一)
linux·运维·服务器·openstack
WebDeveloper20011 小时前
如何使用美国域名中心US Domain Center和WordPress创建商业网站
运维·服务器·css·网络·html
檀越剑指大厂2 小时前
【Linux系列】Shell 脚本中的条件判断:`[ ]`与`[[ ]]`的比较
linux·运维·服务器
2301_819287124 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la4 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
武汉联从信息4 小时前
如何使用linux日志管理工具来管理oracle osb服务器日志文件?
linux·运维·服务器
天天进步20154 小时前
STUN服务器实现NAT穿透
运维·服务器
lucky_syq4 小时前
Flume和Kafka的区别?
大数据·kafka·flume
观测云4 小时前
Confluent Cloud Kafka 可观测性最佳实践
kafka·confluent