Linux Rocky 9部署ZooKeeper+Kafka+Kerberos认证 (二) Kafka部署(Zookeeper/KRaft)

星光下的梦想 发布于 2024-09-18 10 次阅读


在Kafka 2.8.0之前,其使用ZooKeeper来管理集群的元数据和协调集群中的各个节点。后续在2.8.0之后,Kafka引入了 KRaft 模式(Kafka Raft Metadata Mode),用来取代 ZooKeeper。

ZooKeeper与KRaft区别

  1. 架构
    • ZooKeeper模式:
      • 依赖于 ZooKeeper 作为外部的协调服务。
      • ZooKeeper 负责管理 Kafka 的元数据,包括主题、分区、副本等,同时协调选举 Kafka 集群中的 Leader 节点。
      • Kafka 集群中的每个 Broker 都需要与 ZooKeeper 通信来获取和更新元数据。
    • KRaft模式:
      • Kafka 自身管理集群的元数据,不再依赖 ZooKeeper。
      • 通过 Raft 共识协议,Kafka 的 Broker 自身能够处理元数据的存储和 Leader 选举。
      • 减少了外部依赖,简化了系统架构。
  2. 元数据管理
    • ZooKeeper模式:
      • Kafka 将元数据存储在 ZooKeeper 中,包括主题的创建、分区、副本、副本状态等信息。
      • ZooKeeper 负责协调 Kafka 中的 Leader 选举过程,如果 Leader 节点出现故障,ZooKeeper 会通知其他 Broker 重新选举 Leader。
    • KRaft模式:
      • Kafka Broker 自身存储并管理所有元数据,元数据通过 Raft 共识协议在多个 Broker 之间复制和同步,保证一致性。
      • 通过 Raft 机制,Kafka 能够实现去中心化的 Leader 选举和元数据管理,Broker 自行负责这些任务。
  3. Leader选举
    • ZooKeeper模式:
      • 当某个分区的 Leader 节点故障时,ZooKeeper 会协调 Kafka 集群中的 Broker 进行 Leader 选举。
      • 依赖于 ZooKeeper 的状态一致性和选举机制,ZooKeeper 是一个外部协调者。
    • KRaft模式:
      • 通过 Raft 协议,Kafka Broker 之间会自动协商选举 Leader,减少外部协调器的依赖。
      • Raft 协议通过日志复制和投票机制来确保集群内一致的 Leader 选举流程。

使用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 &