kafka集群容器化部署

kafka集群容器化部署

1 集群搭建

1.1 集群规划

主机地址 角色 ZOO_MY_ID KAFKA_BROKER_ID
10.247.3.33 zookeeper1,kafka1 1 1
10.247.3.127 zookeeper2,kafka2 2 2
10.247.3.135 zookeeper3,kafka3 3 3

分别在三台主机创建目录:

mkdir -p /data/kafka/zookeeper/{
    
    data,datalog}
mkdir -p /data/kafka/kafka/logs

environment设置tips:在docker-compose中,environment名称为kafka配置文件server.properties中的选项改进而来,比如:server.properties中的advertised.listeners的写法为:KAFKA_ADVERTISED_LISTENERS,规则为添加KAFKA_前缀,参数名称改为大些,.替换为_

主机一:

version: '3'
services:
  zookeeper1:
    image: zookeeper:3.8.1
    container_name: zookeeper
    volumes:
      #- /data/kafka/zookeeper/conf:/conf
      - /data/kafka/zookeeper/data:/data
      - /data/kafka/zookeeper/datalog:/datalog
    environment:
      TZ: "Asia/Shanghai"
      ZOO_CFG_EXTRA: "quorumListenOnAllIPs=true"
      ZOO_MY_ID: 1
      ZOO_SERVERS: "server.1=10.247.3.33:2888:3888;2181 server.2=10.247.3.127:2888:3888;2181 server.3=10.247.3.135:2888:3888;2181"
    ports: 
      - "2181:2181"
      - "2888:2888"
      - "3888:3888"
    restart: always

  kafka1:
    image: wurstmeister/kafka:2.13-2.8.1
    container_name: kafka
    ports:
      - "9092:9092"
    environment:
      # client 要访问的 broker 地址
      KAFKA_ADVERTISED_HOST_NAME: 10.247.3.33
      # 通过端口连接 zookeeper
      KAFKA_ZOOKEEPER_CONNECT: "10.247.3.33:2181,10.247.3.127:2181,10.247.3.135:2181"
      # 每个容器就是一个 broker,设置其对应的 ID
      KAFKA_BROKER_ID: 1
      # 外部网络只能获取到容器名称,在内外网络隔离情况下
      # 通过名称是无法成功访问 kafka 的
      # kafka 监听器,告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      # 因此需要通过绑定这个监听器能够让外部获取到的是 IP 
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.247.3.33:9092
      # Kafka默认使用-Xmx1G -Xms1G的JVM内存配置,由于服务器小,调整下启动配置
      # 这个看自己的现状做调整,如果资源充足,可以不用配置这个
      KAFKA_HEAP_OPTS: "-Xms1024M -Xmx1024M"
      # 设置 kafka 日志位置
      KAFKA_LOG_DIRS: "/kafka/logs"
      KAFKA_SOCKET_REQUEST_MAX_BYTES: 1347375956
    volumes:
      # 挂载 kafka 日志
      - /data/kafka/kafka/logs:/kafka/logs
    restart: always
    depends_on:
      - zookeeper1

主机二:

version: '3'
services:
  zookeeper2:
    image: zookeeper:3.8.1
    container_name: zookeeper
    volumes:
      #- /data/kafka/zookeeper/conf:/conf
      - /data/kafka/zookeeper/data:/data
      - /data/kafka/zookeeper/datalog:/datalog
    environment:
      TZ: "Asia/Shanghai"
      ZOO_CFG_EXTRA: "quorumListenOnAllIPs=true"
      ZOO_MY_ID: 2
      ZOO_SERVERS: "server.1=10.247.3.33:2888:3888;2181 server.2=10.247.3.127:2888:3888;2181 server.3=10.247.3.135:2888:3888;2181"
    ports: 
      - "2181:2181"
      - "2888:2888"
      - "3888:3888"
    restart: always

  kafka2:
    image: wurstmeister/kafka:2.13-2.8.1
    container_name: kafka
    ports:
      - "9092:9092"
    environment:
      # client 要访问的 broker 地址
      KAFKA_ADVERTISED_HOST_NAME: 10.247.3.127
      # 通过端口连接 zookeeper
      KAFKA_ZOOKEEPER_CONNECT: "10.247.3.33:2181,10.247.3.127:2181,10.247.3.135:2181"
      # 每个容器就是一个 broker,设置其对应的 ID
      KAFKA_BROKER_ID: 2
      # 外部网络只能获取到容器名称,在内外网络隔离情况下
      # 通过名称是无法成功访问 kafka 的
      # kafka 监听器,告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      # 因此需要通过绑定这个监听器能够让外部获取到的是 IP 
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.247.3.127:9092
      # Kafka默认使用-Xmx1G -Xms1G的JVM内存配置,由于服务器小,调整下启动配置
      # 这个看自己的现状做调整,如果资源充足,可以不用配置这个
      KAFKA_HEAP_OPTS: "-Xms1024M -Xmx1024M"
      # 设置 kafka 日志位置
      KAFKA_LOG_DIRS: "/kafka/logs"
      KAFKA_SOCKET_REQUEST_MAX_BYTES: 1347375956
    volumes:
      # 挂载 kafka 日志
      - /data/kafka/kafka/logs:/kafka/logs
    restart: always
    depends_on:
      - zookeeper2

主机三:

version: '3'
services:
  zookeeper3:
    image: zookeeper:3.8.1
    container_name: zookeeper
    volumes:
      #- /data/kafka/zookeeper/conf:/conf
      - /data/kafka/zookeeper/data:/data
      - /data/kafka/zookeeper/datalog:/datalog
    environment:
      TZ: "Asia/Shanghai"
      ZOO_CFG_EXTRA: "quorumListenOnAllIPs=true"
      ZOO_MY_ID: 3
      ZOO_SERVERS: "server.1=10.247.3.33:2888:3888;2181 server.2=10.247.3.127:2888:3888;2181 server.3=10.247.3.135:2888:3888;2181" 
    ports: 
      - "2181:2181"
      - "2888:2888"
      - "3888:3888"
    restart: always

  kafka3:
    image: wurstmeister/kafka:2.13-2.8.1
    container_name: kafka
    ports:
      - "9092:9092"
    environment:
      # client 要访问的 broker 地址
      KAFKA_ADVERTISED_HOST_NAME: 10.247.3.135
      # 通过端口连接 zookeeper
      KAFKA_ZOOKEEPER_CONNECT: "10.247.3.33:2181,10.247.3.127:2181,10.247.3.135:2181"
      # 每个容器就是一个 broker,设置其对应的 ID
      KAFKA_BROKER_ID: 3
      # 外部网络只能获取到容器名称,在内外网络隔离情况下
      # 通过名称是无法成功访问 kafka 的
      # kafka 监听器,告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      # 因此需要通过绑定这个监听器能够让外部获取到的是 IP 
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.247.3.135:9092
      # Kafka默认使用-Xmx1G -Xms1G的JVM内存配置,由于服务器小,调整下启动配置
      # 这个看自己的现状做调整,如果资源充足,可以不用配置这个
      KAFKA_HEAP_OPTS: "-Xms1024M -Xmx1024M"
      # 设置 kafka 日志位置
      KAFKA_LOG_DIRS: "/kafka/logs"
      KAFKA_SOCKET_REQUEST_MAX_BYTES: 1347375956
    volumes:
      # 挂载 kafka 日志
      - /data/kafka/kafka/logs:/kafka/logs
    restart: always
    depends_on:
      - zookeeper3

2 kafka相关知识

  • 创建Topic

创建一个名为test的topic,只有一个副本,一个分区:

./kafka-topics.sh --create --zookeeper 10.247.3.33:2181,10.247.3.127:2181,10.247.3.135:2181 --replication-factor 3 --partitions 1 --topic testT

查看已经创建的 topic:

./kafka-topics.sh -list -zookeeper 10.247.3.33:2181,10.247.3.127:2181,10.247.3.135:2181
  • 启动Producer发送消息

打开一个窗口,在kafka解压目录下:

./kafka-console-producer.sh --broker-list 10.247.3.33:9092,10.247.3.127:9092,10.247.3.135:9092 --topic testT

*注意:不要localhost:9092这样写,也不要127.0.0.1:9092这样写,正确的写法是:10.221.19.217:9092。
  • 启动Consumer

在一个新的远程窗口中:

./kafka-console-consumer.sh --bootstrap-server 10.247.3.33:9092,10.247.3.127:9092,10.247.3.135:9092 --topic testT --from-beginning

此时,在Producer窗口发送消息,在Consumer窗口就打印出消费到的消息。

猜你喜欢

转载自blog.csdn.net/m0_38004228/article/details/130401883