KafkaClusterBuild - ErikJiang/kafka_cluster_example GitHub Wiki

Kafka 集群构建

搭建 Kafka 集群

搭建过程参照了: Building Apache Kafka cluster using docker-compose and VirtualBox ,有兴趣可以看看原文;

服务构建的关联图参考如下:

1. 首先准备基本环境

1.1. 需要一台 like unix 系统的主机(mac、centos、ubuntu...),当然也可以使用 windows,但需要安装 mingw

1.2. 安装 docker 及 docker-compose,具体安装请根据系统环境搜索对应安装方法,这里提供一个 centos 的安装方法;

2. 编写 docker compose 配置

项目 compose 编排配置见: kafka/docker-compose.yml

2.1. 多节点 zookeeper

  zk1:
    image: confluentinc/cp-zookeeper:5.1.0
    container_name: zk1
    ports:
      - "12181:12181"
    environment:
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_CLIENT_PORT: 12181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
      ZOOKEEPER_SERVERS: zk1:12888:13888;zk2:22888:23888;zk3:32888:33888
    volumes:
      - ./zk1/data:/var/lib/zookeeper/data
      - ./zk1/log:/var/lib/zookeeper/log

  zk2:
    image: confluentinc/cp-zookeeper:5.1.0
    container_name: zk2
    ports:
      - "22181:22181"
    environment:
      ZOOKEEPER_SERVER_ID: 2
      ZOOKEEPER_CLIENT_PORT: 22181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
      ZOOKEEPER_SERVERS: zk1:12888:13888;zk2:22888:23888;zk3:32888:33888
    volumes:
      - ./zk2/data:/var/lib/zookeeper/data
      - ./zk2/log:/var/lib/zookeeper/log

  zk3:
    image: confluentinc/cp-zookeeper:5.1.0
    container_name: zk3
    ports:
      - "32181:32181"
    environment:
      ZOOKEEPER_SERVER_ID: 3
      ZOOKEEPER_CLIENT_PORT: 32181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_INIT_LIMIT: 5
      ZOOKEEPER_SYNC_LIMIT: 2
      ZOOKEEPER_SERVERS: zk1:12888:13888;zk2:22888:23888;zk3:32888:33888
    volumes:
      - ./zk3/data:/var/lib/zookeeper/data
      - ./zk3/log:/var/lib/zookeeper/log

如上所示,zookeeper 集群由 zk1、zk2、zk3 三个节点构成;

其中 ZOOKEEPER_CLIENT_PORT 端口 12181、22181、32181 供客户端使用;

ZOOKEEPER_SERVERS 中的端口主要用于集群内部通信,

区别在于像 12888、22888、32888 后缀为 2888 的端口用于节点间对等通信,

而像 13888、23888、33888 后缀为 3888 的端口用于 leader 选举;

具体说明见 ZooKeeper 官方文档

想查看 zookeeper 镜像支持的更多环境变量,可使用如下命令:

$ docker run <IMAGE ID> env

2.2. 多节点 kafka

  kfk1:
    image: confluentinc/cp-kafka:5.1.0
    container_name: kfk1
    ports:
      - "19092:19092"
    expose:
      - "19092"
    depends_on:
      - zk1
      - zk2
      - zk3
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zk1:12181,zk2:22181,zk3:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kfk1:19092
    volumes:
      - ./kfk1/data:/var/lib/kafka/data
 
  kfk2:
    image: confluentinc/cp-kafka:5.1.0
    container_name: kfk2
    ports:
      - "29092:29092"
    expose:
      - "29092"
    depends_on:
      - zk1
      - zk2
      - zk3
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zk1:12181,zk2:22181,zk3:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kfk2:29092
    volumes:
      - ./kfk2/data:/var/lib/kafka/data
 
  kfk3:
    image: confluentinc/cp-kafka:5.1.0
    container_name: kfk3
    ports:
      - "39092:39092"
    expose:
      - "39092"
    depends_on:
      - zk1
      - zk2
      - zk3
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: zk1:12181,zk2:22181,zk3:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kfk3:39092
    volumes:
      - ./kfk3/data:/var/lib/kafka/data

如上所示,kafka集群主要由 kfk1、kfk2、kfk3 三个节点构成,

并且都分别连接了 zookeeper 集群的 12181、22181、32181 客户端端口;

3. 设置 Hosts 域名

由于 docker network 外部无法访问到 kfk1、kfk2、kfk3,所以需要对 /etc/hosts 文件进行设置;

首先,使用 ipconfigifconfig -a 查看本地IP,然后在 hosts 文件中添加映射关系:

  • windows 用户可使用 Hosts File Editor 进行添加修改;
  • linux 用户直接 vim /etc/hosts 修改即可;

类似如下:

# 假设本地IP为: 192.168.0.166
192.168.0.166 kfk1 kfk2 kfk3

4. 构建集群

进入 docker-compose.yml 所在目录,并执行:

$ docker-compose up -d

如果已 clone 本项目,请按照 readme.md 说明构建;

Alright,至此 zookeeper 及 kafka 集群构建完成,如果构建过程出现问题,可查看:问题汇总

5. 测试运行情况

我们将使用 kafkacat 工具来对我们搭建的集群进行测试;

kafkacat 是一个 kafka 客户端命令行工具,它可以模拟消息发布者、消息订阅者、查看当前服务状态信息等功能;

我们先通过 kfk1 查看当前状态信息:

$ kafkacat -L -b kfk1:19092

创建一个中间人(broker)为 kfk1 向主题(topic) hello 推送消息的生产者

$ kafkacat -P -b kfk1:19092 -t hello

创建一个中间人(broker)为 kfk3 从主题(topic) hello 接收消息的消费者

$ kafkacat -C -b kfk3:39092 -t hello

至此,我们就可以通过生产者发布消息,然后通过消费者来观察是否能够正常订阅到消息了。

关于 kafkacat 更多的操作,可参考:kafkacat usage

⚠️ **GitHub.com Fallback** ⚠️