用docker-compose搭建kafka集群和可视化监控

244 阅读3分钟

背景

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集群环境。不建议用于大型公司的生产级别项目,生产环境仍需要专业运维团队构建这些组件或者使用云厂商提供的服务。