美文网首页
Docker搭建Kafka集群

Docker搭建Kafka集群

作者: yichen_china | 来源:发表于2023-08-23 18:57 被阅读0次

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

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

    环境说明

    linux+centos+jdk8

    拉取镜像

    zookeeper

    docker pull bitnami/zookeeper
    

    kafka

    docker pull bitnami/kafka
    

    第四步 搭建kafka管理平台

    docker pull sheepkiller/kafka-manager
    docker run -it -d --rm -p 9000:9000 -e ZK_HOSTS=" 172.17.0.2:2181" sheepkiller/kafka-manager
    

    创建成后,在浏览器中访问http://192.168.31.200:9000

    创建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修改为node1、node2、node3.
    hosts文件存放在/home/docker/kafka/etc/hosts 三个容器使用同一个hosts文件,因为都需要知道node1、node2、node3的具体ip地址。

    hosts文件内容如下

    127.0.0.1       localhost
    172.18.0.3      node1
    172.18.0.4      node2
    172.18.0.5      node3
    

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

    运行镜像
    按照约定,我们依次启动zookeeper、node1、node2、node3以保证ip的正确性。

    启动 zookeeper

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

    不映射主机配置文件启动方式

    docker run -d --name kafka -p 9092:9092 --restart=always \
    -e KAFKA_BROKER_ID=0 \
    -e ALLOW_PLAINTEXT_LISTENER=yes \
    -e KAFKA_CFG_ZOOKEEPER_CONNECT=192.168.222.100:2181 \
    -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.222.100:9092 \
    -e TZ="Asia/Shanghai" bitnami/kafka:latest
    

    参数解释:

    第一行的就不用解释了,大家应该都知道了。
    -e:指定环境变量
    ALLOW_PLAINTEXT_LISTENER:允许使用PLAINTEXT侦听器
    KAFKA_BROKER_ID=0:集群的broker的ID,该ID是集群的唯一标识
    KAFKA_CFG_ZOOKEEPER_CONNECT:zk的连接地址
    KAFKA_CFG_ADVERTISED_LISTENERS:kafka发布到zookeeper供客户端使用的服务地址。
    TZ:指定时区,这里指定亚洲上海时区,也就是东八区

    映射主键配置文件的启动方式

    启动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说明都起来了。

    也可以检查一下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
    或者
    ./kafka-topics.sh --create --topic demo1 --bootstrap-server 127.0.0.1:9091
    

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

    Created topic demo1.
    

    向topic中发送消息:

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

    打开另一个窗口进入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
    

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

    相关文章

      网友评论

          本文标题:Docker搭建Kafka集群

          本文链接:https://www.haomeiwen.com/subject/qzejmdtx.html