使用docker-compose安装kafka

使用docker-compose安装kafka和zookeeper

docker-compose.yml的配置

yaml 复制代码
version: '3'

services:
  zookeeper:
    image: 'zookeeper:3.8.0'
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"
    environment:
      TZ: Asia/Shanghai
      ALLOW_ANONYMOUS_LOGIN: "yes"

  kafka:
    image: 'bitnami/kafka:3.2.0'
    container_name: kafka
    restart: always
    ports:
      - "9192:9192"  # 确保内外端口一致
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_CFG_LISTENERS: PLAINTEXT://0.0.0.0:9192  # 使用9192端口
      KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.10:9192  # 使用9192端口
      KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
      ALLOW_PLAINTEXT_LISTENER: "yes"
      TZ: Asia/Shanghai
    volumes:
      - /work/var/kafka:/bitnami/kafka
    depends_on:
      - zookeeper

关键点解释

  • KAFKA_CFG_LISTENERS :设置为 PLAINTEXT://0.0.0.0:9192,这意味着 Kafka 代理将监听所有网络接口上的 9192 端口。
  • KAFKA_CFG_ADVERTISED_LISTENERS :设置为 PLAINTEXT://192.168.1.10:9192,这意味着 Kafka 会告诉生产者和消费者使用 192.168.1.10 的 IP 地址以及 9192 端口来连接它。
  • Docker 端口映射 :设置为 9192:9192,以确保容器内的 9192 端口映射到主机的 9192 端口,从而与 KAFKA_CFG_ADVERTISED_LISTENERS 中指定的端口保持一致。

确认网络连通性

确保从 192.168.1.7 可以访问 192.168.1.10:9192,你可以通过以下命令测试连通性:

bash 复制代码
telnet 192.168.1.111 9192
# 或者
nc -zv 192.168.1.111 9192

总结

通过上述配置,你可以确保 Kafka 代理监听正确的端口,并且向生产者和消费者广播一个它们可以访问的地址。这样不仅保持了配置的一致性,还减少了潜在的混淆和错误。此外,确保防火墙规则允许两台服务器之间的通信仍然是非常重要的。如果你按照这种方式配置后仍然遇到问题,请检查日志文件以获取更多线索,并确保没有其他网络或安全策略阻止了通信。

Zookeeper 的 docker-compose 配置可以优化,以满足以下需求:

  1. 挂载日志和数据目录

    • 挂载宿主机的目录到 Zookeeper 容器,便于持久化数据和查看日志。
    • Zookeeper 的数据目录默认是 /data,日志目录是 /datalog
  2. 配置日志文件大小限制

    • 使用 zookeeper-log4j.properties 文件配置日志滚动和大小限制。

以下是优化后的配置:


修改后的 docker-compose.yml

yaml 复制代码
version: '3'

services:
  zookeeper:
    image: 'zookeeper:3.8.0'
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"  # Zookeeper 默认端口
    environment:
      TZ: Asia/Shanghai
      ALLOW_ANONYMOUS_LOGIN: "yes"
    volumes:
      - /work/var/zookeeper/data:/data     # 数据目录
      - /work/var/zookeeper/datalog:/datalog # 日志目录
      - /work/var/zookeeper/logs:/logs     # 挂载日志目录
      - ./zookeeper-log4j.properties:/conf/log4j.properties # 自定义日志配置

添加日志配置文件

docker-compose.yml 的同级目录下,创建一个 zookeeper-log4j.properties 文件,用于配置 Zookeeper 的日志管理:

zookeeper-log4j.properties
properties 复制代码
zookeeper.root.logger=INFO, CONSOLE, ROLLINGFILE
zookeeper.console.threshold=INFO
log4j.rootLogger=${zookeeper.root.logger}

# Console appender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{2} (%F:%L) - %m%n

# Rolling File Appender
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.File=/logs/zookeeper.log
log4j.appender.ROLLINGFILE.MaxFileSize=10MB    # 每个日志文件最大大小
log4j.appender.ROLLINGFILE.MaxBackupIndex=5   # 保留的日志文件个数
log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{2} (%F:%L) - %m%n

说明

  1. 挂载卷说明

    • /work/var/zookeeper/data:存储 Zookeeper 的快照数据。
    • /work/var/zookeeper/datalog:存储事务日志。
    • /work/var/zookeeper/logs:存储应用日志。
  2. 日志配置文件

    • zookeeper-log4j.properties 定义了日志输出到控制台和文件。
    • 滚动日志配置了最大文件大小为 10MB,最多保留 5 个旧日志文件。
  3. 查看日志

    • 使用 docker logs 查看控制台日志:

      bash 复制代码
      docker logs zookeeper
    • 查看挂载的日志文件:

      bash 复制代码
      tail -f /work/var/zookeeper/logs/zookeeper.log
  4. 限制日志大小

    • 每个日志文件最大 10MB,超过后生成新的日志文件。
    • 最多保留 5 个日志文件,避免日志占用过多磁盘空间。

启动服务

  1. 启动容器:

    bash 复制代码
    docker-compose up -d
  2. 验证:

    • 检查 /work/var/zookeeper/logs/zookeeper.log 文件是否生成。

    • 检查 Zookeeper 是否正常运行:

      bash 复制代码
      docker logs zookeeper

通过上述优化,你可以更方便地管理 Zookeeper 的日志和数据,同时避免日志占用过多磁盘空间。

你可以通过进入 Kafka 容器来使用 Kafka 自带的命令行工具 (kafka-console-producer.shkafka-console-consumer.sh) 测试消息的发送和消费。以下是步骤:


1. 进入 Kafka 容器

运行以下命令进入 Kafka 容器:

bash 复制代码
docker exec -it kafka /bin/bash

这将打开 Kafka 容器的交互式终端。


2. 测试生产消息

使用 kafka-console-producer.sh 向某个主题发送消息。

示例命令:
bash 复制代码
kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic
操作:
  1. 输入消息,例如:

    复制代码
    Hello Kafka!
    Test message.
  2. 按回车键发送消息。


3. 测试消费消息

使用 kafka-console-consumer.sh 从主题中消费消息。

示例命令:
bash 复制代码
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
操作:
  • --from-beginning 参数表示从主题的最早消息开始消费。

  • 你应该能看到在生产者中输入的消息,例如:

    复制代码
    Hello Kafka!
    Test message.

4. 创建主题(可选)

如果主题不存在,你可以手动创建一个主题。

创建主题命令:
bash 复制代码
kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
验证主题:

查看当前的主题列表:

bash 复制代码
kafka-topics.sh --list --bootstrap-server localhost:9092

5. 退出容器

完成测试后,可以输入以下命令退出容器:

bash 复制代码
exit

注意事项

  1. 连接配置 :测试命令中的 --broker-list--bootstrap-server 参数必须匹配 Kafka 容器的配置。如果使用 docker-compose.yml 文件中的配置,应该是 localhost:9092 或容器内的默认端口。

  2. 远程测试 :如果从其他服务器(如 192.168.1.7)测试,需要使用 KAFKA_CFG_ADVERTISED_LISTENERS 中配置的地址和端口(如 192.168.1.10:9192)。

  3. 错误排查 :如果消息发送或消费失败,检查 Kafka 和 Zookeeper 的日志:

    bash 复制代码
    docker logs kafka
    docker logs zookeeper

通过以上步骤,你可以快速测试 Kafka 的消息发送和消费功能。

相关推荐
滴答滴答嗒嗒滴3 小时前
全栈加速:FrankenPHP 架构原理与实战案例
docker·微服务·性能优化·架构·php·高并发·frankenphp
Edingbrugh.南空4 小时前
Kafka线上集群部署方案:从环境选型到资源规划思考
分布式·kafka
我是老孙4 小时前
Kafka节点注册冲突问题分析与解决
分布式·kafka
leo_hush4 小时前
kafka部署和基本操作
分布式·kafka
Fireworkitte5 小时前
Docker 日志
docker·容器·eureka
杨同学technotes7 小时前
Spring Kafka进阶:实现多态消息消费
后端·kafka
潘yi.7 小时前
Docker环境部署
docker·微服务·容器
计算机毕设定制辅导-无忧学长8 小时前
分布式系统中的 Kafka:流量削峰与异步解耦(二)
microsoft·kafka·linq
sky_ph8 小时前
Kafka分区分配策略
后端·kafka