zoukankan      html  css  js  c++  java
  • 【拆分版】Docker-compose构建Zookeeper集群管理Kafka集群

    写在前边

    在搭建Logstash多节点之前,想到就算先搭好Logstash启动会因为日志无法连接到Kafka Brokers而无限重试,所以这里先构建下Zookeeper集群管理的Kafka集群。

    众所周知,Zookeeper是一个高效的分布式协调中间件,可以提供配置信息管理、命名、分布式同步(分布式锁)、集群管理、数据库切换等服务。这里主要用它的集群管理功能,它可以确保在网络状态不一致,选出一致的Master节点。它是Apache下的一个Java项目,隶属于Hadroop系统,正如其名"动物管理员",作为管理员的角色存在。

    有兴趣了解zookeeper的原理,可以学习Paxos协议与Zab协议。

    ps: Hadroop系统下基本上所有的软件都是动物命名的

    在这里,我们将使用Zookeeper来管理Kafka集群,Kafka是一种消息队列(Message Queue)中间件,具有高并发、高吞吐量、容错性强、可扩展等优点。在ELK日志系统中使用Kafka作为数据的缓冲层,提高了系统的性能与稳定性。

    正好今天通过翻看两者官方的文档与其Docker镜像的文档,终于搭建成功,遂记之分享诸君。鉴于水平有限,如有写得不对的地方,欢迎大家指正。

    本文搭建架构图

    说明:

    Zookeeper搭建成集群后,提供命名服务与集群协调服务,Kafka的节点Broker通过domain与ip进行注册到Zookeeper集群中,通过Zookeeper的协调能力,选出唯一的Leader节点,集群服务启动并对外提供服务。

    环境准备

    • GNU/Debian Stretch 9.9 linux-4.19
    • Docker 18.09.6
    • Docker-Compose 1.17.1

    目录结构

    ├── docker-kafka-cluster
    │   ├── docker-kafka-cluster-down.sh
    │   ├── docker-kafka-cluster-up.sh
    │   ├── kafka-01
    │   │   ├── docker-compose.yml
    │   │   └── .env
    │   ├── kafka-02
    │   │   ├── docker-compose.yml
    │   │   └── .env
    │   ├── kafka-03
    │   │   ├── docker-compose.yml
    │   │   └── .env
    │   └── kafka-manager
    │       ├── docker-compose.yml
    │       └── .env
    └── docker-zookeeper-cluster
        ├── docker-zk-cluster-down.sh
        ├── docker-zk-cluster-up.sh
        ├── zk-01
        │   ├── docker-compose.yml
        │   └── .env
        ├── zk-02
        │   ├── docker-compose.yml
        │   └── .env
        └── zk-03
            ├── docker-compose.yml
            └── .env
    
    

    docker-zookeeper-cluster源码参见我的Git仓库 https://github.com/hellxz/docker-zookeeper-cluster.git

    docker-kafka-cluster源码参见我的Git仓库 https://github.com/hellxz/docker-kafka-cluster.git

    各节点容器说明列表

    Zookeeper集群

    节点目录名 容器名 client port follower port election port
    zk-01 zk-01 2181 2888 3888
    zk-02 zk-02 2182 2889 3889
    zk-03 zk-03 2183 2890 3890

    Kafka集群

    节点目录名 容器名 占用端口
    kafka-01 kafka-1 9092
    kafka-02 kafka-2 9093
    kafka-03 kafka-3 9094
    kafka-manager kafka-manager 19000

    各文件内容说明

    Zookeeper部分

    docker-zookeeper-cluster/zk-01目录下的.env

    .env配置文件为docker-compose.yml提供了多个zookeeper的发现服务节点列表

    配置格式为 server.x=x节点主机ip:随从端口:选举端口;客户端口 其中xZOO.MY.ID的数值,客户端口前是;

    # set args to docker-compose.yml by default
    # set zookeeper servers, pattern is `server.x=ip:follower-port:election-port;client:port`,
    # such as "server.1=192.168.1.1:2888:3888;2181 server.2=192.168.1.2:2888:3888;2181", 
    # `x` is the `ZOO.MY.ID` in docker-compose.yml, multiple server separator by white space.
    # now you can overide the ip for server.1 server.2 server.3, here demonstrate in one machine so ip same.
    ZOO_SERVERS=server.1=10.2.114.110:2888:3888;2181 server.2=10.2.114.111:2889:3889;2182 server.3=10.2.114.112:2890:3890;2183
    

    docker-zookeeper-cluster/zk-01目录下的docker-compose.yml

    version: '3'
    services:
        zk-01:
            image: zookeeper:3.5.5
            restart: always
            container_name: zk-01
            ports:
                - 2181:2181 # client port
                - 2888:2888 # follower port
                - 3888:3888 # election port
            environment:
                ZOO_MY_ID: 1 # this zookeeper's id, and others zookeeper node distinguishing
                ZOO_SERVERS: ${ZOO_SERVERS} # zookeeper services list
            network_mode: "host"
    

    Kafka部分

    kafka-01目录下的.env 为例

    .env配置文件为docker-compose.yml提供了多个zookeeper的ip:client-port列表

    # default env for kafka docker-compose.yml
    # set zookeeper cluster, pattern is "zk1-host:port,zk2-host:port,zk3-host:port", use a comma as multiple servers separator.
    ZOO_SERVERS=10.2.114.110:2181,10.2.114.111:2182,10.2.114.112:2183
    

    kafka-01目录下的docker-compose.yml,为docker-compse的配置文件

    version: "3"
    services:
        kafka-1:
            image: wurstmeister/kafka:2.12-2.1.1
            restart: always
            container_name: kafka-1
            environment:
                - KAFKA_BROKER_ID=1 #kafka的broker.id,区分不同broker
                - KAFKA_LISTENERS=PLAINTEXT://kafka1:9092 #绑定监听9092端口
                - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka1:9092 #绑定发布订阅的端口
                - KAFKA_ZOOKEEPER_CONNECT=${ZOO_SERVERS} #连接zookeeper的服务地址
                - KAFKA_MESSAGE_MAX_BYTES=2000000 #单条消息最大字节数
                #- KAFKA_CREATE_TOPICS=Topic1:1:3,Topic2:1:1:compact #创建broker时创建的topic:partition-num:replica-num[:clean.policy]
            network_mode: "host"
    

    KAFKA_CREATE_TOPICS使用官方说明:Topic 1 will have 1 partition and 3 replicas, Topic 2 will have 1 partition, 1 replica and a cleanup.policy set to compact. 文档地址:https://hub.docker.com/r/wurstmeister/kafka

    Zookeeper集群使用

    1. 请确保所布署的 1~3 台服务器网络可以ping通
    2. 确保第一台主机的218128883888端口未占用,第二台主机的218228893889端口未占用,第三台主机的218328903890端口未占用
    3. 复制zk-01到第一台主机、复制zk-02到第二台主机、复制zk-03到第三台主机
    4. 修改zk-01zk-02zk-03目录下的.env中的ZOO_SERVERS的值,按上述配置要求修改。修改完后的配置应该是集群内通用的,可以scp复制过去。
    5. 单台主机请为docker-zk-cluster-up.shdocker-zk-cluster-down.sh授执行权,使用它们进行up和down操作;多台主机请手动分别进入zk-0x目录,执行docker-compose up -d以启动,执行docker-compose down以关闭。

    Kafka集群使用

    1. 使用前确保各主机可以互相ping通

    2. 确保zookeeper的服务列表与各对应的zookeeper的ip与客户端口相同,如不同注意修改.env,集群中.env文件相同,可scp复制

    3. 确保zookeeper集群启动

    4. 复制kafka-01到第一台主机、复制kafka-02到第二台主机、复制kafka-03到第三台主机

    5. 确保这几台主机对应的占用端口号不被占用 kafka-01对应9092kafka-02对应9093 kafka-03对应9094kafka-manager对应19000

    6. 分别对每一台kafka-0x所在的主机修改/etc/hosts,例

      10.2.114.110	kafka1
      10.2.114.111	kafka2
      10.2.114.112	kafka3
      

      其中每个主机只需要设置自己的主机上的host,比如我复制了kafka-01我就写本机ip kafka1 ,依次类推.

    7. 单台主机部署kafka集群请为docker-kafka-cluster-up.shdocker-kafka-cluster-down.sh授执行权,不要移动目录,通过这两个shell脚本来启动项目;多台主机请手动进入kafka-0x目录下,执行docker-compose up -d以后台启动,执行docker-compose down以移除容器

    8. 启动脚本中没有启动kafka-manager,有需要请自行启动。为了匹配kafka的版本,使用时设置2.1.1即可。

    文中配置部分的ip因使用同一台主机做的测试,所以ip相同,为了防止误解,在文中已经修改了ip,具体详见:

    本文系原创文章,谢绝转载

  • 相关阅读:
    目录(文章整理列表)
    WF工作流的一个完整例子
    WF的权限与角色(3)一个简单的权限体系结构
    工作流:工人为你工作7天,回报为一根金条...
    由一个WF项目说起
    软件是什么
    好久没发胡说八道的贴了,今天发一贴
    关于[资料(2).rar]的说明
    倒霉的3天
    DependencyProperty事件
  • 原文地址:https://www.cnblogs.com/hellxz/p/docker_zookeeper_cluster_and_kafka_cluster.html
Copyright © 2011-2022 走看看