在Kafka 2.8.0之前,其使用ZooKeeper来管理集群的元数据和协调集群中的各个节点。后续在2.8.0之后,Kafka引入了 KRaft 模式(Kafka Raft Metadata Mode),用来取代 ZooKeeper。
ZooKeeper与KRaft区别
- 架构
- ZooKeeper模式:
- 依赖于 ZooKeeper 作为外部的协调服务。
- ZooKeeper 负责管理 Kafka 的元数据,包括主题、分区、副本等,同时协调选举 Kafka 集群中的 Leader 节点。
- Kafka 集群中的每个 Broker 都需要与 ZooKeeper 通信来获取和更新元数据。
- KRaft模式:
- Kafka 自身管理集群的元数据,不再依赖 ZooKeeper。
- 通过 Raft 共识协议,Kafka 的 Broker 自身能够处理元数据的存储和 Leader 选举。
- 减少了外部依赖,简化了系统架构。
- ZooKeeper模式:
- 元数据管理
- ZooKeeper模式:
- Kafka 将元数据存储在 ZooKeeper 中,包括主题的创建、分区、副本、副本状态等信息。
- ZooKeeper 负责协调 Kafka 中的 Leader 选举过程,如果 Leader 节点出现故障,ZooKeeper 会通知其他 Broker 重新选举 Leader。
- KRaft模式:
- Kafka Broker 自身存储并管理所有元数据,元数据通过 Raft 共识协议在多个 Broker 之间复制和同步,保证一致性。
- 通过 Raft 机制,Kafka 能够实现去中心化的 Leader 选举和元数据管理,Broker 自行负责这些任务。
- ZooKeeper模式:
- Leader选举
- ZooKeeper模式:
- 当某个分区的 Leader 节点故障时,ZooKeeper 会协调 Kafka 集群中的 Broker 进行 Leader 选举。
- 依赖于 ZooKeeper 的状态一致性和选举机制,ZooKeeper 是一个外部协调者。
- KRaft模式:
- 通过 Raft 协议,Kafka Broker 之间会自动协商选举 Leader,减少外部协调器的依赖。
- Raft 协议通过日志复制和投票机制来确保集群内一致的 Leader 选举流程。
- ZooKeeper模式:
使用ZooKeeper模式部署Kafka(使用Kafka内置ZooKeeper,系统环境为Rocky 9)
部署Java JDK
- 访问Oracle下载Java 22并安装RPM包
wget https://download.oracle.com/java/22/latest/jdk-22_linux-x64_bin.rpm && rpm -Uvh jdk-22_linux-x64_bin.rpm
上传Kafka tar包到指定目录并解压
-
访问Apache Kafka下载tar
cd /usr/local wget https://downloads.apache.org/kafka/3.8.0/kafka_2.13-3.8.0.tgz && tar -xzvf kafka_2.13-3.8.0.tgz
配置Kafka、ZooKeeper配置文件
-
ZooKeeper配置文件
cd /usr/local/kafka_2.13-3.8.0/config vi zookeeper.properties
# 存储快照目录. dataDir=/tmp/zookeeper # 客户端连接端口 clientPort=2181 # 最大连接数限制 maxClientCnxns=0 # 默认禁用管理服务器,避免端口冲突 # 如果选择启用此功能,请将端口设置为不冲突的端口 admin.enableServer=false # admin.serverPort=8080
- Kafka配置文件(部分)
cd /usr/local/kafka_2.13-3.8.0/config vi server.properties
# broker唯一id broker.id=0 # 套接字服务器侦听地址 listeners=PLAINTEXT://:9092 # 广播监听地址 advertised.listeners=PLAINTEXT://your.host.name:9092 # Kafka日志存放目录,英文逗号分隔 log.dirs=/tmp/kafka-logs # ZooKeeper连接地址 zookeeper.connect=localhost:2181 # ZooKeeper连接超时时间 zookeeper.connection.timeout.ms=18000 # 启用自动创建 Topic auto.create.topics.enable=true
启动ZooKeeper & Kafka
- 后台启动
# 后台运行ZooKeeper,并指定zookeeper.properties配置文件 nohup /usr/local/kafka_2.13-3.8.0/bin/zookeeper-server-start.sh /usr/local/kafka_2.13-3.8.0/config/zookeeper.properties & # 后台运行Kafka,并指定server.properties配置文件 nohup /usr/local/kafka_2.13-3.8.0/bin/kafka-server-start.sh /usr/local/kafka_2.13-3.8.0/config/server.properties &
使用KRaft模式部署Kafka(系统环境为Rocky 9)
安装Kafka步骤与ZooKeeper模式部署相同,具体区别在配置文件不同。以及ZooKeeper模式下,Kafka的log目录可以直接配置。而KRaft模式下,Kafka的log目录需要进行格式化操作才可以使用。
配置KRaft模式Kafka配置文件
- KRaft目录下的server配置文件
cd /usr/local/kafka_2.13-3.8.0/config/kraft vi server.properties
# 此服务器的角色。设置此项会使我们进入 KRaft 模式 process.roles=broker,controller # 与此实例的角色关联的节点 ID node.id=1 # 控制器仲裁集群的连接字符串,通常用于指定多个控制器节点的地址,以便它们能够相互协调 # 1,表示各个节点的id。localhost表示各个控制器节点所在的主机名或ip地址,9093表示各个节点使用的端口号 controller.quorum.voters=1@localhost:9093 # 套接字服务器监听的地址 # 组合节点(即那些具有 `process.roles=broker,controller` 的节点)必须至少在此处列出控制器监听器 listeners=PLAINTEXT://:9092,CONTROLLER://:9093 # 用于代理之间通信的监听器名称 inter.broker.listener.name=PLAINTEXT # 监听器名称、主机名和端口,代理将向客户端广播这些信息。如果未设置,则使用 listeners 的值 advertised.listeners=PLAINTEXT://localhost:9092 # 控制器使用的监听器名称的逗号分隔列表。如果在 listener.security.protocol.map 中未设置显式映射,默认将使用 PLAINTEXT 协议。如果在 KRaft 模式下运行,这是必需的 controller.listener.names=CONTROLLER # 将监听器名称映射到安全协议,默认情况下它们是相同的 listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL # 存储日志目录 log.dirs=/tmp/kraft-combined-logs # 启用自动创建Topic auto.create.topics.enable=true
格式化Kafka日志目录
格式化目录主要是为了初始化或重新初始化Kafka的元数据和日志存储结构,以适应 KRaft模式下的元数据存储和管理。KRaft(Kafka Raft)模式不再依赖于外部的ZooKeeper,而是通过Kafka自身管理元数据。
- 格式化命令
# 进入Kafka bin目录 cd /usr/local/kafka_2.13-3.8.0/bin # 生成随机uuid,并使用此uuid以及server配置文件格式化Kafka日志目录 ./kafka-storage.sh format -t $(./kafka-storage.sh random-uuid) -c ../config/kraft/server.properties
启动KRaft模式的Kafka
- 后台启动
# 后台运行Kafka,并指定KRaft模式配置文件 nohup /usr/local/kafka_2.13-3.8.0/bin/kafka-server-start.sh /usr/local/kafka_2.13-3.8.0/config/kraft/server.properties &
Comments NOTHING