写在前边

在搭建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. 确保第一台主机的2181\2888\3888端口未占用,第二台主机的2182\2889\3889端口未占用,第三台主机的2183\2890\3890端口未占用
  3. 复制zk-01到第一台主机、复制zk-02到第二台主机、复制zk-03到第三台主机
  4. 修改zk-01\zk-02\zk-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,具体详见:

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

【拆分版】Docker-compose构建Zookeeper集群管理Kafka集群的更多相关文章

  1. Docker部署zookeeper集群和kafka集群,实现互联

    本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...

  2. 【拆分版】 Docker-compose构建Logstash多实例,基于7.1.0

    [拆分版]Docker-compose构建Logstash多实例 写在最前 说起Logstash,这个组件并没有什么集群的概念,与其说是集群,不如说是各自去收集日志分析过滤存储到Elasticsear ...

  3. 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇

    <Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...

  4. 数据源管理 | Kafka集群环境搭建,消息存储机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Kafka集群环境 1.环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部 ...

  5. 基于Docker Compose构建的MySQL MHA集群

    Docker MySQL MHA 基于Docker 1.13.1之上构建的MySQL MHA Docker Compose Project 可快速启动GTID模式下的MasterHA集群, 主用于My ...

  6. docker 搭建zookeeper集群和kafka集群

    docker 搭建zookeeper集群 安装docker-compose容器编排工具 Compose介绍 Docker Compose 是 Docker 官方编排(Orchestration)项目之 ...

  7. 010.Docker Compose构建WordPress实战

    一 前期规划 类型 版本 备注 WordPress镜像 wordpress:latest   MySQL数据库 5.7   Docker已安装,参考<002.Docker版本及安装>. D ...

  8. 使用docker compose 构建多个镜像

    定义docker compose version: ' services: composedb: image: mysql/mysql-server container_name: composedb ...

  9. zookeeper集群及kafka集群搭建

    1.zookeeper集群搭建 1.1 上传安装包 官网推荐至少3个节点,我们这里也用三个节点192.169.2.18  192.169.1.82  192.169.1.95 准备好安装包,zooke ...

随机推荐

  1. WEB 前端模块化,读文笔记

    文章链接 WEB 前端模块化都有什么? 知识点 根据平台划分 浏览器 AMD.CMD 存在网络瓶颈,使用异步加载 非浏览器 CommonJS 直接操作 IO,同步加载 浏览器 AMD 依赖前置 req ...

  2. node如何导出数据成为excel格式

    node的应用方式,导出数据 首先,你要把数据库连接上,把你要导的数据表写出来 安装模块 $ npm install sequelize $ npm install mysql $ npm insta ...

  3. 用python的Requests库模拟http请求

    一.先了解几个重要的http请求头或响应头信息 Request Headers: Host: 描述请求将被发送的目的地,包括,且仅仅包括域名和端口号. Origin: 说明请求从哪里发起的,包括,且仅 ...

  4. Linux离线安装redis集群

    一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,联网环境安装较为简单,这里只说脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网,服务 ...

  5. 【linux 06】 linux中的用户权限、文件权限与目录权限

    1.用户及用户组的概念: 1.文件所有者 2.用户组 3.用户 以root登录Linux之后,执行ls -al,会看到有关文件属性的信息 -rw-r--r--,第1个字符代表这个文件是“目录,文件或链 ...

  6. Windows Server定时执行bat

    大家应该知道是在window服务器下使用bat批处理脚本文件,如果是Linux操作系统则是使用xshell脚本文件.由于自己是在做项目的时候对于文件系统中的日志进行定期删除对bat和xshell进行简 ...

  7. XTU 二分图和网络流 练习题 J. Drainage Ditches

    J. Drainage Ditches Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Ja ...

  8. Codeforces 892 B.Wrath

    B. Wrath time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  9. android去除标题栏和状态栏(全屏)

    转--http://www.eoeandroid.com/thread-66555-1-1.html 在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方 ...

  10. Codevs 1497 取余运算== 洛谷P 1226

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k ...