Kafka 安装部署

Kafka 安装部署

一、环境准备

1. 服务器规划

节点角色 服务器IP 容器名称 节点ID(KAFKA_NODE_ID) 控制器端口(CONTROLLER) broker端口(PLAINTEXT)
Kafka节点1 ip1 kafka-157 1 9093 9092
Kafka节点2 ip2 kafka-158 2 9093 9092
Kafka节点3 ip3 kafka-159 3 9093 9092

2. 前置条件

  • 所有节点安装 Docker 和 Docker Compose

  • 网络互通 :三个节点之间需开放 9092(broker通信)和 9093(控制器通信)端口,关闭防火墙或配置白名单。

  • 目录准备 :每个节点创建数据和日志目录,并赋予权限:

    bash 复制代码
    # 在 ip1、ip2、ip3 分别执行
    mkdir -p /data/kafka/data /data/kafka/logs
    chmod -R 777 /data/kafka  # 生产环境建议精细化权限(如设置容器用户ID)

二、集群配置文件(docker-compose.yml)

1. 节点1(ip1)配置文件 kafka.yml

yaml 复制代码
version: "3.8"

services:
  kafka:
    image: apache/kafka:3.8.0  # 官方镜像
    container_name: kafka-157  # 容器名称,需唯一
    hostname: kafka-157        # 容器 hostname,用于集群识别
    restart: always            # 故障自动重启
    ports:
      - "9092:9092"  # broker 对外服务端口(PLAINTEXT协议)
      - "9093:9093"  # controller 集群通信端口
    environment:
      # 核心配置(集群必改项)
      KAFKA_NODE_ID: 1                          # 节点唯一ID(1/2/3,不可重复)
      KAFKA_PROCESS_ROLES: broker,controller    # 当前节点角色:既是broker也是controller(3.3+ 新架构,无需独立controller节点)
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093  # 监听地址(0.0.0.0表示所有网卡)
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://ip1:9092  # 对外暴露的地址(客户端连接用,需替换为节点实际IP)
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT  #  listener与协议映射
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER  # 指定控制器通信的listener名称
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@ip1:9093,2@ip2:9093,3@ip3:9093  # 控制器集群投票节点(node_id@ip:port)

      # 存储与日志配置
      KAFKA_LOG_DIRS: /var/lib/kafka/data  # 数据存储目录(映射到宿主机/data/kafka/data)
      KAFKA_LOG_RETENTION_HOURS: 168       # 日志保留时间(7天)
      KAFKA_LOG_SEGMENT_BYTES: 1073741824  # 单个日志段大小(1GB)
      KAFKA_LOG_RETENTION_CHECK_INTERVAL_MS: 300000  # 日志清理检查间隔(5分钟)

      #  Topic默认配置
      KAFKA_NUM_PARTITIONS: 18              # 默认分区数(根据业务调整,建议偶数)
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3   # 默认副本因子(3节点集群建议3,保证高可用)
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3  # 偏移量 topic 副本因子(需 ≥ 3)
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3  # 事务日志副本因子
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2  # 事务日志最小同步副本数

      # 性能与安全配置
      KAFKA_MIN_INSYNC_REPLICAS: 2          # 最小同步副本数(需 ≤ 副本因子,建议副本因子-1)
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"  # 禁止自动创建topic(需手动创建,避免垃圾topic)
      KAFKA_UNCLEAN_LEADER_ELECTION_ENABLE: "false"  # 禁止非同步副本成为leader(保证数据一致性)
      KAFKA_NUM_NETWORK_THREADS: 4          # 网络线程数(处理客户端请求,建议CPU核心数的1-2倍)
      KAFKA_NUM_IO_THREADS: 8               # IO线程数(处理磁盘IO,建议CPU核心数的2-4倍)
      KAFKA_HEAP_OPTS: "-Xms2G -Xmx2G"      # JVM堆内存(建议为物理内存的50%,最大不超过32G)

    networks:
      - kafka-net  # 自定义网络(如需跨主机通信,需替换为overlay网络或host网络)
    volumes:
      - /data/kafka/data:/var/lib/kafka/data  # 数据目录挂载(宿主机:容器内)
      - /data/kafka/logs:/opt/kafka/logs      # 日志目录挂载
    deploy:
      resources:
        limits:
          cpus: '4'    # CPU限制(根据服务器配置调整,建议4核以上)
          memory: 4G   # 内存限制(需大于堆内存,预留系统和缓存空间)

networks:
  kafka-net:
    driver: bridge  # 单主机用bridge;跨主机需用overlay(如Docker Swarm)或host网络

2. 节点2(ip2)和节点3(ip3)配置调整

节点2和节点3的配置文件与节点1基本一致,只需修改以下参数:

参数 节点2(ip2)调整 节点3(ip3)调整
container_name kafka-158 kafka-159
hostname kafka-158 kafka-159
KAFKA_NODE_ID 2 3
KAFKA_ADVERTISED_LISTENERS PLAINTEXT://ip2:9092 PLAINTEXT://ip3:9092

三、启动集群

1. 分别在三个节点启动容器

bash 复制代码
# 在 ip1、ip2、ip3 节点分别执行
docker-compose -f kafka.yml up -d

2. 检查容器状态

bash 复制代码
# 查看容器是否运行
docker ps | grep kafka

# 查看日志(确认无错误,如控制器选举、集群连接成功)
docker logs -f kafka-157  # 替换为对应节点的容器名称

日志关键成功标志

  • 节点1日志出现 Controller quorum initialized successfully(控制器集群初始化成功)。
  • 所有节点日志出现 Joined group as a followerBecame leader(集群共识达成)。

四、集群验证

1. 检查集群节点状态

五、性能压测与优化

1. 压测工具使用(内置 kafka-producer-perf-test.sh

bash 复制代码
# 在容器内执行(向 isrm-test 压入 100万条消息,每条1KB)
/opt/kafka/bin/kafka-producer-perf-test.sh \
  --topic isrm-test \
  --num-records 1000000 \
  --record-size 1024 \
  --throughput -1 \  # 不限速,测试最大吞吐量
  --producer-props bootstrap.servers=ip1:9092,ip2:9092,ip3:9092


2. 常见性能问题优化

(1)客户端压测失败(吞吐量不足)
  • 检查服务器资源:确保每个节点 CPU 使用率 < 80%,内存充足(避免 swap)。
  • 调整 JVM 堆内存 :若堆内存过小(如 < 2G),可增大 KAFKA_HEAP_OPTS(如 -Xms4G -Xmx4G,需同步调整 deploy.resources.memory)。
  • 优化网络线程 :增加 KAFKA_NUM_NETWORK_THREADS(如 8,CPU核心数的2倍)和 KAFKA_NUM_IO_THREADS(如 16)。
(2)副本同步延迟
  • 检查磁盘 IO :使用 iostat -x 1 查看磁盘 IO 使用率,若 %util 接近 100%,需更换 SSD 或调整日志目录到独立磁盘。
  • 减少同步副本数 :非核心 topic 可降低 replication-factor(如 2),但核心业务建议保持 3。

六、注意事项

  1. 跨主机网络:若三个节点在不同服务器,Docker 默认 bridge 网络无法跨主机通信,需:

    • 方案1:使用 network_mode: host(直接使用宿主机网络,需确保端口不冲突)。
    • 方案2:搭建 Docker Swarm 并使用 overlay 网络(适合大规模集群)。
  2. 数据备份 :定期备份 /data/kafka/data 目录(Kafka 数据目录),避免数据丢失。

  3. 版本兼容性 :客户端 SDK 版本需与 Kafka 服务端版本兼容(建议客户端版本 ≥ 服务端版本,或遵循 Kafka 版本兼容性文档)。

  4. 监控集成 :建议通过 Prometheus + Grafana 监控 Kafka 指标(如 kafka_server_BrokerTopicMetrics_MessagesInPerSec 吞吐量、kafka_controller_ActiveControllerCount 控制器状态等)。

七、总结

通过 Docker Compose 部署 Kafka 3.8.0 集群,核心在于配置文件中控制器集群(CONTROLLER_QUORUM_VOTERS)、节点 ID、监听地址的正确设置,以及确保三节点网络互通。部署完成后,需通过创建 topic、生产消费消息验证集群功能,并根据压测结果优化资源配置,确保高可用和高性能。

相关推荐
有梦想的攻城狮2 小时前
kafka-client各版本消息格式、协议版本及兼容性问题整理
分布式·kafka·版本
廋到被风吹走2 小时前
【消息队列】Kafka 核心概念深度解析
分布式·kafka
九章-2 小时前
集中式数据库 vs 分布式数据库:2026 最新对比,选哪个更合适?
数据库·分布式·集中式
softshow10262 小时前
Redis 分布式锁必避问题及解决方案
数据库·redis·分布式
小钟不想敲代码2 小时前
RabbitMQ高级
分布式·rabbitmq
Francek Chen2 小时前
【大数据基础】大数据处理架构Hadoop:02 Hadoop生态系统
大数据·hadoop·分布式·hdfs·架构
Thomas21433 小时前
spark view永久保存 + paimon对应的view
大数据·分布式·spark
jc06203 小时前
项目实战6-消息推送
c++·redis·websocket·nginx·kafka
_codemonster3 小时前
分布式深度学习训练框架Horovod
人工智能·分布式·深度学习