【拆分版】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:随从端口:选举端口;客户端口
其中x
为ZOO.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 acleanup.policy
set tocompact
. 文档地址:https://hub.docker.com/r/wurstmeister/kafka
Zookeeper集群使用
- 请确保所布署的 1~3 台服务器网络可以ping通
- 确保第一台主机的2181\2888\3888端口未占用,第二台主机的2182\2889\3889端口未占用,第三台主机的2183\2890\3890端口未占用
- 复制zk-01到第一台主机、复制zk-02到第二台主机、复制zk-03到第三台主机
- 修改zk-01\zk-02\zk-03目录下的.env中的
ZOO_SERVERS
的值,按上述配置要求修改。修改完后的配置应该是集群内通用的,可以scp复制过去。 - 单台主机请为
docker-zk-cluster-up.sh
与docker-zk-cluster-down.sh
授执行权,使用它们进行up和down操作;多台主机请手动分别进入zk-0x目录,执行docker-compose up -d
以启动,执行docker-compose down
以关闭。
Kafka集群使用
使用前确保各主机可以互相ping通
确保zookeeper的服务列表与各对应的zookeeper的ip与客户端口相同,如不同注意修改
.env
,集群中.env
文件相同,可scp复制确保zookeeper集群启动
复制kafka-01到第一台主机、复制kafka-02到第二台主机、复制kafka-03到第三台主机
确保这几台主机对应的占用端口号不被占用
kafka-01对应9092
、kafka-02对应9093
、kafka-03对应9094
、kafka-manager对应19000
分别对每一台kafka-0x所在的主机修改
/etc/hosts
,例10.2.114.110 kafka1
10.2.114.111 kafka2
10.2.114.112 kafka3
其中每个主机只需要设置自己的主机上的host,比如我复制了
kafka-01
我就写本机ip kafka1
,依次类推.单台主机部署kafka集群请为
docker-kafka-cluster-up.sh
与docker-kafka-cluster-down.sh
授执行权,不要移动目录,通过这两个shell脚本来启动项目;多台主机请手动进入kafka-0x
目录下,执行docker-compose up -d
以后台启动,执行docker-compose down
以移除容器启动脚本中没有启动
kafka-manager
,有需要请自行启动。为了匹配kafka的版本,使用时设置2.1.1即可。
文中配置部分的ip因使用同一台主机做的测试,所以ip相同,为了防止误解,在文中已经修改了ip,具体详见:
docker-zookeeper-cluster源码 https://github.com/hellxz/docker-zookeeper-cluster.git
docker-kafka-cluster源码 https://github.com/hellxz/docker-kafka-cluster.git
本文系原创文章,谢绝转载
【拆分版】Docker-compose构建Zookeeper集群管理Kafka集群的更多相关文章
- Docker部署zookeeper集群和kafka集群,实现互联
本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...
- 【拆分版】 Docker-compose构建Logstash多实例,基于7.1.0
[拆分版]Docker-compose构建Logstash多实例 写在最前 说起Logstash,这个组件并没有什么集群的概念,与其说是集群,不如说是各自去收集日志分析过滤存储到Elasticsear ...
- 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇
<Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...
- 数据源管理 | Kafka集群环境搭建,消息存储机制详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Kafka集群环境 1.环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部 ...
- 基于Docker Compose构建的MySQL MHA集群
Docker MySQL MHA 基于Docker 1.13.1之上构建的MySQL MHA Docker Compose Project 可快速启动GTID模式下的MasterHA集群, 主用于My ...
- docker 搭建zookeeper集群和kafka集群
docker 搭建zookeeper集群 安装docker-compose容器编排工具 Compose介绍 Docker Compose 是 Docker 官方编排(Orchestration)项目之 ...
- 010.Docker Compose构建WordPress实战
一 前期规划 类型 版本 备注 WordPress镜像 wordpress:latest MySQL数据库 5.7 Docker已安装,参考<002.Docker版本及安装>. D ...
- 使用docker compose 构建多个镜像
定义docker compose version: ' services: composedb: image: mysql/mysql-server container_name: composedb ...
- zookeeper集群及kafka集群搭建
1.zookeeper集群搭建 1.1 上传安装包 官网推荐至少3个节点,我们这里也用三个节点192.169.2.18 192.169.1.82 192.169.1.95 准备好安装包,zooke ...
随机推荐
- scrapy example
scrapy example scrapy with pycharm import win32api 出现ImportError: DLL load failed 错误的解决方法 pip instal ...
- WebGL 绘制Line的bug(三)
之前铺垫了许多,今天可以来分享点纯干货了. 上一篇已经讲述了通过面模拟线条时候,每一个顶点的顶点数据包括:端点坐标.偏移量.前一个端点坐标.后一个端点坐标,当然如果我们通过索引的方式来绘制的话,还包括 ...
- springmvc请求方法那些事
@RequestMapping 用法详解之地址映射 (2013-08-11 16:06:58) 转载▼ 标签: it 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式 ...
- java中的编译时与运行时
----?基础知识 -- 编译时 编译器将源代码翻译成机器能够读懂的代码,如java中就是翻译成jvm能够读懂的字节码文件.简单说,编译时就是机器帮我们检查代码是否有出现语法错误,关键字写错之类的 ...
- java 图片合成文字或者awt包下的对话框引入自定义字体库
成就卡图片字体问题:1.下载 xxx.ttf 文件2.mkdir /usr/local/jdk1.6.0_11/jre/lib/fonts/fallback. 在jre/lib/fonts 下 ...
- Linux内核学习总览
断断续续学习操作系统已经有大半年时间了,一直想系统地梳理一下. 正好借助<深入Linux内核架构> (Wolfgang Manuere 著,郭旭 译)汇总一下. 首先基础框架篇,Linux ...
- RabbitMQ 关键词解释
源地址: https://www.cnblogs.com/hz04022016/p/6518138.html RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQ ...
- 【HDU 3336】Count the string(KMP+DP)
Problem Description It is well known that AekdyCoin is good at string problems as well as number the ...
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
发现一个问题,十分蛋疼. 我们项目是由N个工程组成的,外围工程是web工程,内部的工程打包成jar,放入外围工程的WEB-INF/lib 内部的工程用到了spring的注解,例如@Service.@C ...
- Go循环语句
package main import ( "fmt" "strconv" "os" "bufio" ) //for的条 ...