在搭建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 └── .envdocker-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 portzk-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;2183docker-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 为例