上篇文章ubuntu使用docker-compose搭建zookeeper集群,部署完了zookeeper集群。现在可以开始部署kafka集群。

部署

kafka.yml

version: '3.7'

networks:
  docker_net:
volumes:
  kafka1_data:
  kafka1_sock:
  kafka2_data:
  kafka2_sock:
  kafka3_data:
  kafka3_sock:

services:

  kafka1:
    image: wurstmeister/kafka
    restart: unless-stopped
    container_name: kafka1
    ports:
      - "9093:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_HOST_NAME: 192.168.30.174                     ## 修改:宿主机IP
      KAFKA_ADVERTISED_PORT: 9093                                 ## 修改:宿主机映射port
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.30.174:9093    ## 绑定发布订阅的端口。修改:宿主机IP
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2183"
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"                       ## 关闭自动创建主题
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3                            ## 主题复制系数
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3                      ## 内部主题__consumer_offsets的复制系数
    volumes:
      - kafka1_sock:/var/run/docker.sock
      - kafka1_data:/kafka
    networks:
      - docker_net


  kafka2:
    image: wurstmeister/kafka
    restart: unless-stopped
    container_name: kafka2
    ports:
      - "9094:9092"
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_HOST_NAME: 192.168.30.174                    ## 修改:宿主机IP
      KAFKA_ADVERTISED_PORT: 9094                               ## 修改:宿主机映射port
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.30.174:9094   ## 修改:宿主机IP
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
    volumes:
      - kafka2_sock:/var/run/docker.sock
      - kafka2_data:/kafka
    networks:
      - docker_net

  kafka3:
    image: wurstmeister/kafka
    restart: unless-stopped
    container_name: kafka3
    ports:
      - "9095:9092"
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ADVERTISED_HOST_NAME: 192.168.30.174                   ## 修改:宿主机IP
      KAFKA_ADVERTISED_PORT: 9095                              ## 修改:宿主机映射port
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.30.174:9095   ## 修改:宿主机IP
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
    volumes:
      - kafka3_sock:/var/run/docker.sock
      - kafka3_data:/kafka
    networks:
      - docker_net

  kafka-manager:
    image: sheepkiller/kafka-manager:latest
    restart: unless-stopped
    container_name: kafka-manager
    hostname: kafka-manager
    ports:
      - "9000:9000"
    environment:
      ZK_HOSTS: zoo1:2181,zoo2:2181,zoo3:2181                 ## 修改:宿主机IP
      TZ: CST-8
    networks:
      - docker_net

上面文件里,需要注意的是networks,kafka的容器需要和zookeeper的容器处于同一个网络,才能互相访问。

执行docker-compose -f kafka.yml up,启动集群。

执行docker-compose -f kafka.yml ps,查看集群状态。

JUUbWR.jpg

同时,这里还部署了一个管理kafka集群的容器kafka-manager,通过你的主机IP:9000可以访问web界面,管理集群和查看集群的信息。

JUamTg.jpg

使用

执行docker exec -it kafka1 /bin/bash进入到容器里。

查看主题

$ cd /opt/kafka
$ ./bin/kafka-topics.sh --list --zookeeper zoo1:2181,zoo2:2181,zoo3:2181   # 查看主题列表
__consumer_offsets

创建主题
默认情况下,kafka会在下面几种情况下自动创建主题。

  • 当一个生产者开始往主题写入消息
  • 当一个消费者开始往主题读取消息
  • 当任意一个客户端先主题发送元数据请求

生产环境中,最好通过设置auto.create.topics.enable=False来关闭自动创建主题。

创建一个3个分区,复制系数是3,最少同步副本数是2的主题。

./bin/kafka-topics.sh --create --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --replication-factor 3 --partitions 3 min-insync-replicas 2 --topic test   

Jay9c4.jpg

可以看到主题的3个分区,分区首领均匀地分布在每台broker(因为请求都是发往分区首领,这样分布是为了负载均衡),每个分区的副本也均匀地分布在每台broker,例如分区0的副本分布在broker 0, 1, 2,这样如果其中一台broker崩溃后,剩下的broker可以进行分区首领选举,保证可用性。

发送消息

./bin/kafka-console-producer.sh --broker-list kafka1:9092,kafka2:9092,kafka3:9092  --topic test

消费消息

./bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test --from-beginning
Last modification:April 23rd, 2020 at 03:46 pm
如果觉得我的文章对你有用,请尽情赞赏 🐶