Docker搭建Kafka集群

Docker搭建Kafka集群

Kafka的运行依赖Zookeeper,本文介绍如何在docker顺利搭建一个三个broker构成的kafka集群。将通过以下步骤详细展开:

  1. 拉取镜像 bitnami/kafka and bitnami/zookeeper
  2. 创建network使集群在同一子网下 knet
  3. 创建三个节点的配置文件以供挂载
  4. 创建hosts文件以供挂载
  5. 运行镜像
  6. 测试是否搭建成功

环境说明

linux+centos+jdk8

拉取镜像

zookeeper

docker pull bitnami/zookeeper

kafka

docker pull bitnami/kafka

创建network使集群在同一子网下: knet

docker network create knet

在运行容器时指定 docker run --net knet ...可以将容器置于子网中,ip地址是根据进入子网的顺序递增的。
可通过 docker network ls查看子网列表。
可通过docker network inspect 子网名称查看具体子网下游哪些容器。

创建配置文件

配置文件说明:kafka的配置文件server.properties在容器中的位置为:/bitnami/kafka/config 在运行容器时挂载到这个文件夹即可替换配置文件。
约定:创建三个节点的配置文件分别存放在/home/docker/kafka/config/node1/server.properties/home/docker/kafka/config/node2/server.properties/home/docker/kafka/config/node3/server.properties

三个配置文件内容如下:
节点1的server.properties:

# broker id
broker.id = 1
# 监听地址
listeners = PLAINTEXT://node1:9091
advertised.listeners = PLAINTEXT://node1:9091
# 发送响应的线程数
num.network.threads = 2
# io线程数
num.io.threads = 4
# 发送缓存大小
socket.send.buffer.bytes = 10240
# 接收缓存大小
socket.receive.buffer.bytes = 10240
# 最大请求
socket.request.max.bytes = 1048576
# 日志地址
# log.dirs = /tmp/kafka-logs
# 分区数
num.partitions = 1
# zookeeper的地址
zookeeper.connect =172.18.0.2:2181
# 允许容器监听
ALLOW_PLAINTEXT_LISTENER=yes

节点2的server.properties:

# broker id
broker.id = 2
# 监听地址
listeners = PLAINTEXT://node2:9092
advertised.listeners = PLAINTEXT://node2:9092
# 发送响应的线程数
num.network.threads = 2
# io线程数
num.io.threads = 4
# 发送缓存大小
socket.send.buffer.bytes = 10240
# 接收缓存大小
socket.receive.buffer.bytes = 10240
# 最大请求
socket.request.max.bytes = 1048576
# 日志地址
# log.dirs = /tmp/kafka-logs
# 分区数
num.partitions = 1
# zookeeper的地址
zookeeper.connect =172.18.0.2:2181
# 允许容器监听
ALLOW_PLAINTEXT_LISTENER=yes

节点3的server.properties:

# broker id
broker.id = 3
# 监听地址
listeners = PLAINTEXT://node3:9093
advertised.listeners = PLAINTEXT://node2:9093
# 发送响应的线程数
num.network.threads = 2
# io线程数
num.io.threads = 4
# 发送缓存大小
socket.send.buffer.bytes = 10240
# 接收缓存大小
socket.receive.buffer.bytes = 10240
# 最大请求
socket.request.max.bytes = 1048576
# 日志地址
# log.dirs = /tmp/kafka-logs
# 分区数
num.partitions = 1
# zookeeper的地址
zookeeper.connect =172.18.0.2:2181
# 允许容器监听
ALLOW_PLAINTEXT_LISTENER=yes

注意: zookeeper的地址需要你查看你自己的子网ip并且替换,具体操作为:运行zookeeper后执行docker network inspect knet查看。

创建hosts

约定:将要替换掉容器内的hosts文件,以实现将三个容器的hostname修改为node1node2node3.
hosts文件存放在/home/docker/kafka/etc/hosts 三个容器使用同一个hosts文件,因为都需要知道node1node2node3的具体ip地址。

hosts文件内容如下

127.0.0.1		localhost
172.18.0.3      node1
172.18.0.4      node2
172.18.0.5      node3

注意: 请严格按照zookeepernode1node2node3的顺序启动容器,因为只有这样根据子网分配ip的规律上面的hosts文件各个节点的ip才对,如果子网ip不一样请修改。

运行镜像

按照约定,我们依次启动zookeepernode1node2node3以保证ip的正确性。

启动 zookeeper

docker run -itd --name zookeeper-server -p 12181:2181 \
 --net knet -e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest

启动kafka-node1

docker run -itd --name kafka-node1 --net knet -p 19091:9091 \
-v /home/docker/kafka/config/node1:/bitnami/kafka/config \
-v /home/docker/kafka/etc/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka

启动kafka-node2

docker run -itd --name kafka-node2 --net knet -p 19092:9092 \
-v /home/docker/kafka/config/node2:/bitnami/kafka/config \
-v /home/docker/kafka/etc/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka

启动kafka-node3

docker run -itd --name kafka-node3 --net knet -p 19093:9093 \
-v /home/docker/kafka/config/node3:/bitnami/kafka/config \
-v /home/docker/kafka/etc/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka

测试是否搭建成功

首先看看zookeeper和三台kafka是否启动成功,启动成功则进入容器1创建topic发布消息,进入容器2接收该topic的消息。

首先docker ps -a查看所有容器,这些都是UP说明都起来了。
docker ps -a
也可以检查一下ip是否正确:

docker network inspect knet
[
    {
        "Name": "knet",
        "Id": "8dce5a7c2286dc412779f2eccc6da2ab48e84fd742df3466fe4f18fdc9b90556",
        "Created": "2023-02-26T11:54:40.806440621+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "2ba87b9bc25502cbb5074b2a987bbc112d36e0761347431c4a83194d9908bec9": {
                "Name": "kafka-node3",
                "EndpointID": "79ec91577aec61a472b6af469c66064570ebd81b88e740e2c1744a7ce546018d",
                "MacAddress": "02:42:ac:12:00:05",
                "IPv4Address": "172.18.0.5/16",
                "IPv6Address": ""
            },
            "549863c6f62ab2fb6e4f673af3836b40f67413687f038d2a0254fa4f80a0b27c": {
                "Name": "kafka-node2",
                "EndpointID": "50d800e401e697953c0c1c6d1962422f433f6e004315f8ce70e9696973be04af",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "5fc974b8eb4441202e02d75bd4718cfc3dc3be2979bafbb4b89819ce8f6b16a0": {
                "Name": "kafka-node1",
                "EndpointID": "0ff4794752eae5f337a12fca3de76eb00b080bf6999f7d353be4b0531662938e",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "b887ba0e289bd42ed0c081177e63383e169584b41747cf66ef10142427d15321": {
                "Name": "zookeeper-server",
                "EndpointID": "506951e5f2c26a516d105d979596e59e8ccd59e05ae5441ec3c15f8a2ec1492e",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

进入node1创建topic:

docker exec -it kafka-node1 /bin/bash

进入容器后进入bin目录创建topic并且往里面发布消息

# 进入bin目录
cd /opt/bitnami/kafka/bin/
# 创建topic
./kafka-topics.sh --create --topic demo1 --bootstrap-server node1:9091

如果搭建的没有问题将会出现以下结果表示demo1主题创建成功:

Created topic demo1.

topic中发送消息:

./kafka-console-producer.sh --topic demo1 --bootstrap-server node1:9091

创建topic发送消息
打开另一个窗口进入node2接收这条消息:

docker exec -it kafka-node2 /bin/bash
cd /opt/bitnami/kafka/bin
kafka-console-consumer.sh --topic demo1 --from-beginning --bootstrap-server node2:9092

在另一台broker中接收demo1中的消息

至此,集群搭建完毕,如果遇到各种连接问题,那就是ip配置的问题,就是在监听的配置上有问题。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: Docker搭建kafka集群的过程可以参考以下步骤。首先,需要依赖zookeeper来管理kafka集群的状态和元数据。因此,在搭建kafka集群之前,需要先搭建一个zookeeper集群。可以使用Docker创建一个新的网络,并在该网络上启动一个zookeeper集群。接下来,创建一个docker-compose文件(例如docker-compose-zk.yml),在该文件定义zookeeper集群的配置和启动参数。然后,使用docker-compose命令启动zookeeper集群。接下来,创建一个新的docker-compose文件(例如docker-compose-kafka.yml),在该文件定义kafka集群的配置和启动参数。在这个文件,需要挂载一些文件,这些文件包括kafka的配置文件和数据目录。挂载这些文件的目的是为了保留kafka集群的状态和数据。最后,使用docker-compose命令启动kafka集群。在集群启动后,可以安装kafka-manager来管理kafka集群。可以创建一个新的docker-compose文件(例如docker-compose-kafka-manager.yml),在该文件定义kafka-manager的配置和启动参数。使用docker-compose命令启动kafka-manager。配置kafka-manager连接到kafka集群,并进行测试。\[1\] 在搭建过程,可能会遇到一些问题。例如,如果之前已经安装过旧版本的docker,可能会导致安装新版本docker时出现冲突的错误。解决这个问题的方法之一是使用wget命令下载docker-ce.repo文件,并将其放置在/etc/yum.repos.d/目录下。这样可以更新docker的安装源,然后重新安装docker。\[2\]\[3\] #### 引用[.reference_title] - *1* [Docker搭建kafka集群](https://blog.csdn.net/weixin_48412846/article/details/128724377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [docker搭建kafka集群](https://blog.csdn.net/fxh13579/article/details/81299185)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值