背景
kafka作为一个消息队列中间件,是一款具有异步解耦、高吞吐量的、分布式的、基于发布订阅模式等特点的组件。
广泛应用于日志收集、消息解耦、数据采集处理等场景,是开发分布式服务、数据量较大服务不可或缺的中间件。
困境
作为一款分布式组件,运维成本偏高。
1.底层需要一套zookeeper集群,根据选举机制,至少需要3台机器做主从。
2.kafka运行在zk之上,也需要至少3台机器。通用的做法是和zk用同样3台。
3.需要另外做kafka集群的监控和可视化运维等管理。
4.数据备份和历史数据过大后处理策略,考虑物理机的存储上限,需要做好数据的存储管理。
不错的方案
利用docker的虚拟化和隔离特性,把一台服务器当做三台用,开放不同的端口即可。
网站上的docker部署kafka集群的文章不少,但是质量普遍不高,有些都是一篇文章的复制粘贴,甚至还有贴错的。实践排错过程非常浪费时间和精力。
因此,在这边贴出本人实战可行的docker-compose文件,仅需修改ip即可。
version: '3.3'
services:
zk1:
image: zookeeper:3.5.7
restart: always
hostname: zk1
container_name: zk1
privileged: true
ports:
- 2181:2181
volumes:
- /data/zk1:/data/kafka-data
- /etc/timezone:/etc/timezone
- /etc/localtime:/etc/localtime
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
zk2:
image: zookeeper:3.5.7
restart: always
hostname: zk2
container_name: zk2
privileged: true
ports:
- 2182:2181
volumes:
- /data/zk2:/data/kafka-data
- /etc/timezone:/etc/timezone
- /etc/localtime:/etc/localtime
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zk3:2888:3888;2181
zk3:
image: zookeeper:3.5.7
restart: always
hostname: zk3
container_name: zk3
privileged: true
ports:
- 2183:2181
volumes:
- /data/zk3:/data/kafka-data
- /etc/timezone:/etc/timezone
- /etc/localtime:/etc/localtime
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
kafka1:
image: wurstmeister/kafka
container_name: kafka1
ports:
- 9092:9092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: yourIP:2181,yourIP:2182,yourIP:2183
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://yourIP:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_LOG_DIRS: /data/kafka-data
JMX_PORT: 9999
volumes:
- ./data/kafka1:/data/kafka-data
- /etc/timezone:/etc/timezone
- /etc/localtime:/etc/localtime
restart: always
kafka2:
image: wurstmeister/kafka
container_name: kafka2
ports:
- 9093:9093
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: yourIP:2181,yourIP:2182,yourIP:2183
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://yourIP:9093
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093
KAFKA_LOG_DIRS: /data/kafka-data
JMX_PORT: 9988
volumes:
- ./data/kafka2:/data/kafka-data
- /etc/timezone:/etc/timezone
- /etc/localtime:/etc/localtime
restart: always
kafka3:
image: wurstmeister/kafka
container_name: kafka3
ports:
- 9094:9094
environment:
KAFKA_BROKER_ID: 3
KAFKA_ZOOKEEPER_CONNECT: yourIP:2181,yourIP:2182,yourIP:2183
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://yourIP:9094
KAFKA_ADVERTISED_HOST_NAME: kafka3
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9094
KAFKA_LOG_DIRS: /data/kafka-data
JMX_PORT: 9977
volumes:
- ./data/kafka3:/data/kafka-data
- /etc/timezone:/etc/timezone
- /etc/localtime:/etc/localtime
restart: always
kafka-manager:
image: sheepkiller/kafka-manager:latest
restart: always
container_name: kafa-manager
hostname: kafka-manager
ports:
- "9091:9000"
links:
- kafka1
- kafka2
- kafka3
environment:
ZK_HOSTS: yourIP:2181,yourIP:2182,yourIP:2183
KAFKA_BROKERS: kafka1:9092,kafka2:9093,kafka3:9094
APPLICATION_SECRET: letmein
KM_ARGS: -Djava.net.preferIPv4Stack=true
可视化页面
访问 yourIP:9091 即可完成新集群信息录入以及创建topic等可视化操作。
备注
此方案仅适用于本地开发或测试环境,快速部署一个kafka集群环境。不建议用于大型公司的生产级别项目,生产环境仍需要专业运维团队构建这些组件或者使用云厂商提供的服务。