单主机集群
1. 安装compose
安装目录:/root/container/docker
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /root/container/docker
chmod +x/usr/local/bin/docker-compose
2. 创建/修改compose配置文件
编辑配置文件docker-compose.yml
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
volumes:
- ./data:/data
ports:
- "2183:2181"
kafka:
image: wurstmeister/kafka
depends_on: [ zookeeper ] // 依赖启动项,当zookeeper启动完成后,才启动kafka
ports:
- "9025:9092" // 025为宿主机对外端口,9092为docker内服务端口
environment:
KAFKA_ADVERTISED_HOST_NAME: 172.16.3.1
KAFKA_CREATE_TOPICS: "appLogs:1:1" // kafka启动时自动创建topic,名为 appLogs
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
volumes:
- ./kafka-logs:/kafka
- /var/run/docker.sock:/var/run/docker.sock
kafka-manager:
image: sheepkiller/kafka-manager
ports:
- "9000:9000"
environment:
ZK_HOSTS: "zookeeper:2181"
depends_on:
- kafka // 依赖启动项,当kafka启动完成后,才启动kafka-manager
3. 启动服务
docker-compose up -d // 启动镜像 -d 表示后台静默启动
docker-compose down // 关闭镜像
docker-compose ps // 查看当前compose进程列表
lsof -i:9000 // 查看占用9000端口的进程
docker logs -f zookeeper // 查看启动日志,zookeeper是容器名
4. 查看及操作Topic
进入docker-kafka容器
// docker_kafka_1是容器名,可以通过ps命令看到
docker exec -it docker_kafka_1 /bin/bash
查看topic列表
kafka-topics.sh --zookeeper 172.16.3.1:2183 --list
创建topic(tLog)
kafka-topics.sh --zookeeper 172.16.3.1:2183 --create --replication-factor 1 --partitions 1 --topic tLog
删除topic(tLog)
kafka-topics.sh --delete --zookeeper 172.16.3.1: 9025 --topic tLog
模拟生产者
kafka-console-producer.sh --broker-list 172.16.3.1:9025 --topic tLog
模拟消费者(新开终端)
kafka-console-consumer.sh --bootstrap-server 172.16.3.1:9025 --topic tLog --from-beginning
进入kafka主目录
cd opt/kafka
5. kafka版本信息
查看kafka版本(需先进入kafka容器)
find / -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*'
前面为scala版本,后面为kafka版本。(2.7.0)
与spring版本对应关系
与zk版本对应关系
6. 参考
spring.io - Spring for Apache Kafka
多主机集群
1. 下载zookeeper和kafka的镜像
[root@localhost ~]# docker pull zookeeper:3.7.0
[root@localhost ~]# docker pull wurstmeister/kafka
开始用的zk镜像是wurstmeister/zookeeper:v3.4.13,单主机部署集群没问题,换到多主机的时候,集群组不上,好像是集群间的通信有问题。
2. zookeeper集群
2.1 创建zk配置文件:zoo.cfg
[root@localhost ~]# vi /data/zookeeper/conf/zoo.cfg
# 数据目录
dataDir=/data
# 日志目录
dataLogDir=/datalog
tickTime=2000
initLimit=10
syncLimit=5
# 监听端口
clientPort=2181
# 集群列表
server.1=0.0.0.0:2888:3888;2181
server.2=10.1.2.102:2888:3888;2181
server.3=10.1.2.103:2888:3888;2181
数据目录 dataDir 和日志目录 dataLogDir 对后面的配置会有影响。
集群列表中,当前服务器的ip用0.0.0.0替换,避免zk找不到自己。
2.2 创建myid
新建一个文件,用来指定当前服务器在集群中的id。myid文件中只写一个id值就行(2.1中集群列表的id)。
[root@localhost ~]# vi /data/zookeeper/data/myid
1
~
2.3 创建compose启动配置文件
[root@localhost ~]# vi zookeeper-compose.yml
version: '3.2'
services:
zoo:
image: zookeeper:3.7.0
restart: always
hostname: zoo1
container_name: zoo1
# 容器的网络模式
network_mode: "host"
# 端口映射
ports:
- 2181:2181
- 2888:2888
- 3888:3888
# 变量配置
volumes:
- "/data/zookeeper/data:/data" # 数据目录
- "/data/zookeeper/log:/datalog" # 日志目录
- "/data/zookeeper/conf/zoo.cfg:/conf/zoo.cfg" # 配置文件
每台主机的配置大致都一样,network_mode 一定要配成 host 。
要注意的是,数据目录、日志目录和配置文件要根据 2.1 zoo.cfg 的配置调整一下。另外,我把myid放在数据目录 /data/zookeeper/data 里面了,如果myid文件不在数据目录中,需要额外再配一条变量。如:
- "/etc/myid:/data/myid" # myid文件位置
2.4 启动
[root@localhost ~]# docker-compose -f zookeeper-compose.yml -d
依次把各个节点都启动起来。
2.5 验证集群状态
看一下日志有没有问题:
[root@localhost ~]# docker logs zoo1
看一下节点的运行状态:
[root@localhost ~]# docker exec -it zookeeper /bin/bash
root@zookeeper:/opt/zookeeper# cd bin/
root@zookeeper:/opt/zookeeper/bin# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: leader
3. kafka集群
zk集群没问题后,部署kafka集群。
3.1 创建compose的启动配置文件
[root@localhost ~]# vi kafka-compose.yml
version: '3.2'
services:
kafka:
image: wurstmeister/kafka:latest
restart: always
hostname: kafka1
container_name: kafka1
# 网络模式
network_mode: "host"
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1 # 节点id
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.1.255.202:9092
KAFKA_ADVERTISED_HOST_NAME: 10.1.255.202
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: 10.1.255.202:2181,10.1.255.203:2181,10.1.255.204:2181
volumes:
- /data/kafka/logs:/kafka # 日志目录
- /data/kafka/data:/data/kafka-data # 数据目录
同样的网络模式 network_mode 一定要配成 host 。
不同的节点,要调整 KAFKA_BROKER_ID 和相关的IP地址。
3.2 启动
[root@localhost ~]# docker-compose -f kafka-compose.yml -d
依次把各个节点都启动起来。
4. kafka-manager
启动配置文件:
[root@localhost ~]# vi kafka-manager-compose.yml
version: '3.2'
services:
kafka-manager: # Kafka
image: sheepkiller/kafka-manager:latest
restart: unless-stopped
container_name: kafka-manager
hostname: kafka-manager
ports:
- "9090:9000"
environment:
ZK_HOSTS: 10.1.249.143:2181,10.1.249.144:2181,10.1.249.145:2181
KAFKA_BROKERS: 10.1.249.143:9092,10.1.249.144:9092,10.1.249.145:9092
替换一下zk和kafka集群的地址即可。启动容器:
[root@localhost ~]# docker-compose -f kafka-manager-compose.yml -d
启动之后,通过 http://localhost:9000 访问 kafka-manager。
添加zk集群,看一下kafka的broker数量是否正确。
5. 参考
docker-compose部署zk+kafka+storm集群的实现