KafkaClusterBuild - ErikJiang/kafka_cluster_example GitHub Wiki
搭建过程参照了: Building Apache Kafka cluster using docker-compose and VirtualBox ,有兴趣可以看看原文;
服务构建的关联图参考如下:
1.1. 需要一台 like unix 系统的主机(mac、centos、ubuntu...),当然也可以使用 windows,但需要安装 mingw;
1.2. 安装 docker 及 docker-compose,具体安装请根据系统环境搜索对应安装方法,这里提供一个 centos 的安装方法;
项目 compose 编排配置见: kafka/docker-compose.yml
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
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 客户端端口;
由于 docker network 外部无法访问到 kfk1、kfk2、kfk3,所以需要对 /etc/hosts 文件进行设置;
首先,使用 ipconfig
或 ifconfig -a
查看本地IP,然后在 hosts 文件中添加映射关系:
- windows 用户可使用 Hosts File Editor 进行添加修改;
- linux 用户直接
vim /etc/hosts
修改即可;
类似如下:
# 假设本地IP为: 192.168.0.166
192.168.0.166 kfk1 kfk2 kfk3
进入 docker-compose.yml 所在目录,并执行:
$ docker-compose up -d
如果已 clone 本项目,请按照 readme.md 说明构建;
Alright,至此 zookeeper 及 kafka 集群构建完成,如果构建过程出现问题,可查看:问题汇总
我们将使用 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