在阿里云ecs机器上通过docker安装kafka集群

编程

今天我开始在阿里云机器上通过 docker 来安装 kafka 集群服务。

在实际生产环境中,Kafka都是集群部署的,常见的架构如下:

Kafka集群由多个Broker组成,每个Broker对应一个Kafka实例。Zookeeper负责管理Kafka集群的Leader选举以及Consumer Group发生变化的时候进行reblance操作。

一、Kafka集群搭建

1、首先运行Zookeeper(本文并未搭建ZK集群):

docker run -d --name zookeeper -p 2181:2181 -t zookeeper

2、分别创建3个Kafka节点,并注册到ZK上:

不同Kafka节点只需要更改端口号即可。

Kafka0:

docker run -d --name kafka0 -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=x.x.x.x:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://x.x.x.x:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e KAFKA_HEAP_OPTS="-Xmx256M -Xms2562M" -t wurstmeister/kafka

Kafka1:

docker run -d --name kafka1 -p 9093:9093 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=x.x.x.x:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://x.x.x.x:9093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -e KAFKA_HEAP_OPTS="-Xmx256M -Xms2562M" -t wurstmeister/kafka

Kafka2:

docker run -d --name kafka2 -p 9094:9094 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=x.x.x.x:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://x.x.x.x:9094 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9094 -e KAFKA_HEAP_OPTS="-Xmx256M -Xms2562M" -t wurstmeister/kafka

参数说明

-e KAFKA_ZOOKEEPER_CONNECT=x.x.x.x:2181	# 表示 zookeeper 的地址,需要换成 zookeeper 机器的地址,如果是阿里云机器,可以使用内网地址

-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://x.x.x.x:9094 # 表示对外暴露的服务端口,真正建立连接用的是 listeners。如果是阿里云机器,需要对外暴露 IP 和端口,应该使用外网地址

-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9094 # 比如在公司搭建的 kafka 集群,只有内网中的服务可以用,这种情况下,只需要用 listeners 就行

-e KAFKA_HEAP_OPTS="-Xmx256M -Xms2562M" # 配置 kafka 的堆内存大小,因为我这里用的ecs 机器的内存不高,所以这里改成了 256M

注意:以上节点均需换成自己的IP。

启动3个Kafka节点之后,查看是否启动成功:

这样Kafka集群就算搭建完毕。

二、使用Docker-Compose 搭建Kafka集群

1、什么是Docker-Compose?

Docker-Compose是Docker提供的工具,用于同时管理同一个应用程序下多个容器。

举个例子,上面在Docker中搭建Kafka集群的步骤很繁杂,比如首先建一个ZK容器,然后再分别通过命令创建多个Kafka容器,并分别启动。而通过Docker-Compose可以使用单条命令就可以启动所有服务。

Docker和Docker-Compose之间的区别如下:

2、如何使用Docker-Compose

如何使用Docker-compose创建Kafka相关可以见link:https://github.com/wurstmeister/kafka-docker .

####(1)创建目录

首先,在本地路径下创建一个用于存放docker-compose.yml文件的目录,并新建一个文件:docker-compose.yml (我创建的是docker-compose-kafka-single-broker.yml)

注意:遇到权限问题自行解决

####(2)单个Broker节点

下面看如何创建单Broker节点,在docker-compose-kafka-single-broker.yml文件中进行如下配置:

version: "3"

services:

zookeeper:

image: zookeeper

container_name: zookeeper

ports:

- "2181:2181"

kafka:

image: wurstmeister/kafka

ports:

- "9092:9092"

environment:

KAFKA_ADVERTISED_HOST_NAME: x.x.x.x # 改成自己主机的地址

KAFKA_CREATE_TOPICS: TestComposeTopic:2:1

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

KAFKA_BROKER_ID: 1

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://x.x.x.x:9092 # 改成自己主机的地址

KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092

container_name: kafka01

volumes:

- /var/run/docker.sock:/var/run/docker.sock

文件中的参数含义:

version: "3"表示第3代compose语法;

services:表示要启用的实例服务;

zookeeper、kafka:启动的服务名称;

image:docker使用的镜像;

container_name:启动后容器名称;

ports:导出的端口号;

关于Kafka的参数信息单独讲下:

  • KAFKA_ADVERTISED_HOST_NAME:Docker宿主机IP,可以设置多个;
  • KAFKA_CREATE_TOPICS:启动时默认创建的topic;TestComposeTopic:2:1表示创建topic为TestComposeTopic、2个分区、1个副本;
  • KAFKA_ZOOKEEPER_CONNECT:连接ZK;
  • KAFKA_BROKER_ID:Broker ID;
  • KAFKA_ADVERTISED_LISTENERS 和 KAFKA_LISTENERS必须要有,否则可能无法正常使用。

配置好后,使用命令 docker-compose -f docker-compose-kafka-single-broker.yml up 启动单节点Kafka。

查看启动的单Broker信息和topic信息:

####(3)Broker集群

上面使用了docker-compose成功地搭建了kafka单节点Broker,现在看如何构建Kafka集群:

首先在目录下创建一个新文件:docker-compose-kafka-single-broker.yml,配置内容如下:

version: "3"

services:

zookeeper:

image: zookeeper

container_name: zookeeper

ports:

- "2181:2181"

kafka1:

image: wurstmeister/kafka

ports:

- "9092:9092"

environment:

KAFKA_ADVERTISED_HOST_NAME: x.x.x.x # 改成自己主机的地址

KAFKA_CREATE_TOPICS: TestComposeTopic:4:3

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

KAFKA_BROKER_ID: 1

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://x.x.x.x:9092 # 改成自己主机的地址

KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092

container_name: kafka01

volumes:

- /var/run/docker.sock:/var/run/docker.sock

kafka2:

image: wurstmeister/kafka

ports:

- "9093:9093"

environment:

KAFKA_ADVERTISED_HOST_NAME: x.x.x.x # 改成自己主机的地址

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

KAFKA_BROKER_ID: 2

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://x.x.x.x:9093 # 改成自己主机的地址

KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093

container_name: kafka02

volumes:

- /var/run/docker.sock:/var/run/docker.sock

kafka3:

image: wurstmeister/kafka

ports:

- "9094:9094"

environment:

KAFKA_ADVERTISED_HOST_NAME: x.x.x.x # 改成自己主机的地址

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

KAFKA_BROKER_ID: 3

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://x.x.x.x:9094 # 改成自己主机的地址

KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9094

container_name: kafka03

volumes:

- /var/run/docker.sock:/var/run/docker.sock

执行脚本:docker-compose -f docker-compose-kafka-cluster.yml up ,

可以看到启动成功:

分别进入3个容器中查看topic信息

3 、疑难杂症问题记录

1、使用KAFKA_CREATE_TOPICS参数不能创建topic多个分区

配置文件中参数KAFKA_CREATE_TOPICS: TestComposeTopic:2:1本意为创建topic:TestComposeTopic,2个分区、1个副本,但是实际执行后,topic能成功执行,但是分区仍然为1:

使用docker-compose down -v即可解决。

进入docker-compose.yml所在的目录,由于我不是使用默认的docker-compose.yml文件,所以需要加上参数-f指定自己写的文件:

cd  /docker/config/kafka

### 执行该命令, 解决只能创建一个分区的问题

docker-compose -f docker-compose-kafka-single-broker.yml down -v

### 重新启动

docker-compose -f docker-compose-kafka-single-broker.yml up

在重新执行docker-compose.yml后再次查看该topic信息,发现2个分区已经成功创建:

关于 docker-compose down -v命令的含义是:

Stops containers and removes containers, networks, volumes, and images

created by up.

By default, the only things removed are:

  • Containers for services defined in the Compose file
  • Networks defined in the networks section of the Compose file
  • The default network, if one is used

Networks and volumes defined as external are never removed.

为什么使用该命令?可能是因为使用docker-compose在创建分区之前会默认创建1个分区1个副本的topic。

参考链接

  • Kafka 配置使用注意事项
  • 【Kafka精进系列003】Docker环境下搭建Kafka集群
  • 阿里云ECS安装zookeeper/kafka的配置问题
  • kafka listeners 和 advertised.listeners 的应用

以上是 在阿里云ecs机器上通过docker安装kafka集群 的全部内容, 来源链接: utcz.com/z/517351.html

回到顶部