单主机集群

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]*'

docker-compose restart配置 docker-compose -f_linux


前面为scala版本,后面为kafka版本。(2.7.0)

与spring版本对应关系

docker-compose restart配置 docker-compose -f_linux_02

与zk版本对应关系

docker-compose restart配置 docker-compose -f_linux_03

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集群的实现