ZooKeeper 集群搭建
文章目录
- ZooKeeper 概述
- 选举机制
- 搭建前准备
- 分布式配置
- 分布式安装
- 解压缩并重命名
- 配置环境
- 配置服务器编号
- 配置文件
- 操作集群
- 编写脚本
- 运行脚本
- 搭建过程中常见错误
ZooKeeper 概述
Zookeeper 是一个开源的分布式服务协调框架,由Apache软件基金会开发和维护。以下是对Zookeeper的主要概述:
-
设计目标:
- 提供分布式环境中的数据一致性。
- 为分布式应用程序提供协调服务。
- 简化复杂分布式系统的构建和管理。
-
功能特性:
- 数据模型:Zookeeper使用一个树形结构的数据模型(Znode),每个节点可以存储数据并具有版本号。
- 一致性保证:Zookeeper保证在客户端看到的数据是一致的,提供顺序一致性、原子性和单一系统映像等特性。
- 分布式锁:通过临时节点和 watches(监视器)机制,Zookeeper可以实现分布式锁,确保在分布式环境中对共享资源的互斥访问。
- 集群管理:Zookeeper可以用于管理集群中的节点,如监控节点状态、动态加入或移除节点。
- 配置管理:应用程序可以在Zookeeper中存储和获取配置信息,使得配置变更能够快速传播到所有相关节点。
- 命名服务:Zookeeper可以作为命名服务,为分布式系统中的资源提供唯一的标识符。
-
工作原理:
- Zookeeper集群由一组相互协作的服务器组成,这些服务器共同维护一个具有相同数据副本的内存数据库。
- 客户端与Zookeeper集群进行交互,读取数据、写入数据或者注册 watches以监听数据变化。
- Zookeeper通过投票机制实现容错和领导选举,确保在部分服务器故障时仍能提供服务。
-
应用场景:
- 在Hadoop和HBase等大数据处理框架中,Zookeeper用于管理集群状态和协调任务。
- 作为服务发现工具,帮助微服务架构中的服务注册和发现。
- 在分布式消息队列系统中,如Kafka,用于Broker和Consumer的协调。
总的来说,Zookeeper在分布式系统中扮演着关键的角色,通过提供可靠的数据管理和协调服务,简化了分布式应用程序的开发和运维。
选举机制
1)集群中半数以上机器存活,集群可用。所以 Zookeeper 一般安装奇数台服务器,因为假设有 2N + 1 台机器只要 N + 1 台存活,集群就可用,再加一台也还是 N + 1 台,并不会提高集群可用性能,浪费资源。
2)服务器具有4
种状态,分别是LOOKING
、FOLLOWING
、LEADING
、OBSERVING
。
LOOKING
:寻找Leader
状态。当服务器处于该状态时,当前集群中没有Leader
,因此需要进入Leader
选举状态。FOLLOWING
:跟随者状态。表明当前服务器角色是Follower
。LEADING
:领导者状态。表明当前服务器角色是Leader
。OBSERVING
:观察者状态。表明当前服务器角色是Observer
,Observer
不参与投票和选举过程。
3)选举过程:假设有五台服务器组成的 Zookeeper 集群,它们的 id 从 1 - 5。如果这些服务器依序启动**(第一次启动)**
- 服务器 1 启动,发起选举
- 服务器先投给自己一票,然后判断是否过半,显然不够,选举无法完成,服务器 1 状态保持为
LOOKING
;
- 服务器先投给自己一票,然后判断是否过半,显然不够,选举无法完成,服务器 1 状态保持为
- 服务器 2 启动,发起选举
- 服务器 2 先投给自己一票,然后与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,
id
值更大的服务器 2 胜出,服务器 1 将选票改投给 服务器 2,此时服务器 1 有 0 票,服务器 2 有 2 票,还不够半数,选举无法完成,服务器状态 1、2 保持为LOOKING
;
- 服务器 2 先投给自己一票,然后与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,
- 服务器 3 启动,发起选举
- 服务器 3 先投给自己一票,根据上述方法同理服务器 1、2 都会改投服务器 3,此时服务器 1 有 0 票,服务器 2 有 0 票,服务器 3 有 3 票,(3/5) 超过半数,服务器 3 当选为
Leader
。服务器状态 1、2 更改状态为FOLLOWDING
,服务器 3 更改状态为LEADING
;
- 服务器 3 先投给自己一票,根据上述方法同理服务器 1、2 都会改投服务器 3,此时服务器 1 有 0 票,服务器 2 有 0 票,服务器 3 有 3 票,(3/5) 超过半数,服务器 3 当选为
- 服务器 4 启动,发起选举
- 服务器先投给自己一票,此时已经存在
Leader
了,服务器 1、2、3 不会再改投了。所以投票结果为:服务器 3 有 3 票,服务器 4 有 1 票。服务器 4 服从多数,更改状态为FOLLOWING
;
- 服务器先投给自己一票,此时已经存在
- 服务器 5 启动,发起选举
- 与服务器 4 同理,更改状态为
FOLLOWING
。
- 与服务器 4 同理,更改状态为
搭建前准备
下载地址:Index of /dist/zookeeper (apache.org)
文档地址:Apache ZooKeeper
这里选择 Zookeeper-3.5.7
版本进行搭建,自行配置 JDK7
或更高版本
分布式配置
分布式配置与伪分布式配置,主要有以下区别,其余配置均相同:
- 伪分布式所使用的端口必须不同,分布式端口可以相同。
- 伪分布式统一使用一个
IP
,分布式需要根据当前网络IP
配置。
以下为分布式与伪分布式配置对比(以3
个服务器节点为例):这里选择分布式配置
配置 | 伪分布式 | 分布式 |
---|---|---|
clienPort | 2181;2182;2183 | 2181;2181;2181 |
server.1 | 127.0.0.1:2888:3888 | hadoop102:2888:3888 |
server.2 | 127.0.0.1:2889:3889 | hadoop103:2888:3888 |
server.3 | 127.0.0.1:2890:3890 | hadoop104:2888:3888 |
分布式安装
先在 hadoop102 上操作最后分发文件,改个 myid 就行,也可以使用 MultiExec 功能一次向所有终端发送命令
解压缩并重命名
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/
mv /opt/apache-zookeeper-3.5.7-bin /opt/zookeeper-3.5.7
配置环境
vim /etc/profile.d/zookeeper.sh
添加下述内容:
export ZOOKEEPER_HOME=/opt/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin
更新环境变量
source /etc/profile
配置服务器编号
hadoop102 的 myid 设置为 1,hadoop103 为 2,hadoop104 为 3
mkdir -p $ZOOKEEPER_HOME/tmp/data
echo 1 > $ZOOKEEPER_HOME/tmp/data/myid
配置文件
把 $ZOOKEEPER_HOME/conf
这个目录下的 zoo_sample.cfg
复制为 zoo.cfg
cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
修改配置
vim $ZOOKEEPER_HOME/conf/zoo.cfg
修改数据存储路径
dataDir=/opt/zookeeper-3.5.7/tmp/data
添加下述配置
server.1=hadoop102:2888:3888
server.2=hadoop103:2888:3888
server.3=hadoop104:2888:3888
下述配置参数含义
server.A=B:C:D
- A 数字,表示这个是第几号服务器;即集群模式下配置的
myid
; - B 服务器的
IP
地址; - C 服务器与集群中的
Leader
服务器交换信息的端口; - D 当集群中的
Leader
服务器挂了,需要重新选举出一个新的Leader
时,在这个端口进行服务器相互通信; - 2181:对外提供服务端口;
- 2888:内部数据同步端口;
- 3888:
Leader
挂了,重新选举端口。
集群分发 zookeeper
目录和配置文件
xsync $ZOOKEEPER_HOME
xsync /etc/profile.d/zookeeper.sh
最后不要忘记去 hadoop102,hadoop104 上将 myid 改为 2,3 ,其他集群如果使用 $ZOOKEEPER_HOME
需要先 source /etc/profile
更新一下环境变量
[user@hadoop103 ~]$ echo 2 > $ZOOKEEPER_HOME/tmp/data/myid
[user@hadoop104 ~]$ echo 3 > $ZOOKEEPER_HOME/tmp/data/myid
操作集群
在每个服务器上启动 Zookeeper
[user@hadoop102 zookeeper-3.5.7]$ zkServer.sh start
[user@hadoop103 zookeeper-3.5.7]$ zkServer.sh start
[user@hadoop104 zookeeper-3.5.7]$ zkServer.sh start
使用 jpsall
查看进程,QuorumPeerMain
就是 Zookeeper
集群的启动入口类,用来加载配置启动 QuorumPeer
线程的
[user@hadoop102 ~]$ ./jpsall
=============== hadoop102 ===============
11507 QuorumPeerMain
12988 Jps
=============== hadoop103 ===============
14498 Jps
12887 QuorumPeerMain
=============== hadoop104 ===============
12471 Jps
11086 QuorumPeerMain
查看集群状态,按照半数选举机制三个服务器中第二个启动的集群就是 Leader
[user@hadoop102 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower[user@hadoop103 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader[user@hadoop104 zookeeper-3.5.7]$ zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
此时可以尝试将 hadoop103
断掉按照投票机制应当是 hadoop104
当选 Leader
编写脚本
vim zk.sh
给执行权限
chmod 777 zk.sh
添加如下内容:
#!/bin/bashif [ $# -lt 1 ]
thenecho "No Args Input..."exit ;
ficase $1 in
"start")echo "=========== 启动 zookeeper 集群 ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh start"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh start"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh start"
;;
"stop")echo "=========== 关闭 zookeeper 集群 ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh stop"
;;
"status")echo "=========== 查看 zookeeper 状态 ==========="echo "------------- hadoop102 -----------------"ssh hadoop102 "$ZOOKEEPER_HOME/bin/zkServer.sh status"echo "------------- hadoop103 -----------------"ssh hadoop103 "$ZOOKEEPER_HOME/bin/zkServer.sh status"echo "------------- hadoop104 -----------------"ssh hadoop104 "$ZOOKEEPER_HOME/bin/zkServer.sh status"
;;
*)echo "Input Args Error..."
;;
esac
运行脚本
1)启动 zookeeper 集群
./zk.sh start=========== 启动 zookeeper 集群 ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2)查看集群各服务器状态
./zk.sh status=========== 查看 zookeeper 状态 ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
3)关闭 zookeeper
集群
./zk.sh stop=========== 关闭 zookeeper 集群 ===========
------------- hadoop102 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
------------- hadoop103 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
------------- hadoop104 -----------------
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.5.7/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
搭建过程中常见错误
Zookeeper 集群搭建过程中常见错误-CSDN博客
相关文章:
ZooKeeper 集群搭建
文章目录 ZooKeeper 概述选举机制搭建前准备分布式配置分布式安装解压缩并重命名配置环境配置服务器编号配置文件 操作集群编写脚本运行脚本搭建过程中常见错误 ZooKeeper 概述 Zookeeper 是一个开源的分布式服务协调框架,由Apache软件基金会开发和维护。以下是对Z…...
Meson:现代的构建系统
Meson是一款现代化、高性能的开源构建系统,旨在提供简单、快速和可读性强的构建脚本。Meson被设计为跨平台的,支持多种编程语言,包括C、C、Fortran、Python等。其目标是替代传统的构建工具,如Autotools和CMake,提供更简…...

【大模型AIGC系列课程 5-2】视觉-语言大模型原理
重磅推荐专栏: 《大模型AIGC》;《课程大纲》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在…...

震惊!难怪别人家的孩子越来越聪明,原来竟是因为它
前段时间工作调动给孩子换了个新学校,刚开始担心她不能适应新学校的授课方式,但任课老师对她评价很高,夸她上课很专注。 为了训练孩子的专注力,作为家长可没少下功夫,画画,下五子棋等益智游戏的兴趣班没少…...

Linux操作系统(UMASK+SUID+SGID+STICK)
UMASK反掩码 如何查看反掩码:直接在终端窗口运行 umask root用户反掩码:0022 普通用户反掩码:0002 UMASK的作用:确定目录,文件的缺省权限值 以root身份创建目录,观察目录的9位权限值 以root身份创建普通文件…...

Java 中单例模式的常见实现方式
目录 一、什么是单例模式? 二、单例模式有什么作用? 三、常见的创建单例模式的方式 1、饿汉式创建 2、懒汉式创建 3、DCL(Double Checked Lock)双检锁方式创建 3.1、synchronized 同步锁的基本使用 3.2、使用 DCL 中存在的疑…...

【C语言】自定义类型之联合和枚举
目录 1. 前言2. 联合体2.1 联合体类型的声明2.2 联合体的特点2.3 相同成员的结构体和联合体对比2.4 联合体大小的计算2.4 判断当前机器的大小端 3. 枚举3.1 枚举类型的声明3.2 枚举类型的优点3.3 枚举类型的使用 1. 前言 在之前的博客中介绍了自定义类型中的结构体,…...

使用Mosquitto/python3进行MQTT连接
一、简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件。 …...

JavaWeb笔记之前端开发HTML
一、引言 1.1HTML概念 网页,是网站中的一个页面,通常是网页是构成网站的基本元素,是承载各种网站应用的平台。通俗的说,网站就是由网页组成的。通常我们看到的网页都是以htm或html后缀结尾的文件,俗称 HTML文件。 …...

通过IP地址定位解决被薅羊毛问题
随着互联网的普及,线上交易和优惠活动日益增多,这也为一些不法分子提供了可乘之机。他们利用技术手段,通过大量注册账号或使用虚假IP地址进行异常操作,以获取更多的优惠或利益,这种行为被称为“薅羊毛”。对于企业和平…...
Leetcode 122 买卖股票的最佳时机 II
题意理解: 已知:一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格 如何哪个时间点买入,哪个时间点卖出,多次交易,能够收益最大化 目的:收益最大化 解题思路: 使用贪心…...
音频文件合成
音频文件合成 音频文件合成 http://ffmpeg.org/download.html https://blog.csdn.net/u013314786/article/details/89682800 http://www.360doc.com/content/19/0317/01/10519289_822112563.shtml https://chaijunkun.blog.csdn.net/article/details/116491526?spm1001.210…...

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞
20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞 2023/12/20 17:19 简略步骤:rootrootrootroot-X99-Turbo:~/3TB$ tar --use-compress-programpigz -xvpf rk3399-android-10.git-20210201.tgz rootrootro…...

vivo 容器平台资源运营实践
作者:vivo 互联网服务器团队 - Chen Han 容器平台针对业务资源申请值偏大的运营问题,通过静态超卖和动态超卖两种技术方案,使业务资源申请值趋于合理化,提高平台资源装箱率和资源利用率。 一、背景 在Kubernetes中,容…...

ASP.NET Core面试题之Redis高频问题
🎈🎈在.NET后端开发岗位中,如今也少不了、微服务、分布式、高并发高可用相关的面试题🎈🎈 👍👍本文分享一些整理的Redis高频面试题🎉 👍👍机会都是给有准备…...
【教程】Ubuntu基本软件安装
文章目录 一、搜狗输入法安装二、百度网盘安装三、划词翻译 一、搜狗输入法安装 全网最准确的Ubuntu 20.04 安装搜狗输入法的步骤 二、百度网盘安装 百度云盘for Linux安装教程和体验 三、划词翻译 ubuntu最好用的划词翻译词典:有道词典和GoldenDict...

Jenkins 构建环境指南
目录 Delete workspace before build starts(常用) Use secret text(s) or file(s) (常用) Add timestamps to the Console Output (常用) Inspect build log for published build scans Terminate a …...

基于Go语言的HTTP路由设计与实现
在Go语言的世界里,HTTP路由是一种将HTTP请求映射到相应处理函数的技术。通过路由,我们可以确定当用户发送一个HTTP请求时,应该调用哪个函数来处理该请求。在这个过程中,我们可以使用多种方法来实现路由设计,下面我将以…...

SpringMVC01
SpringMVC 1. 学习⽬标2. 什么叫MVC?3. SpringMVC 框架概念与特点4. SpringMVC 请求流程5. Spring MVC 环境搭建6. URL 地址映射配置7. 参数绑定8. JSON 数据开发JSON普通数组步骤1:pom.xml添加依赖步骤2: 修改配置⽂件步骤3. 注解使⽤ 1. 学习⽬标 2. 什…...

基于Redis限流(aop切面+redis实现“令牌桶算法”)
令牌桶算法属于流量控制算法,在一定时间内保证一个键(key)的访问量不超过某个阈值。这里的关键是设置一个令牌桶,在某个时间段内生成一定数量的令牌,然后每次访问时从桶中获取令牌,如果桶中没有令牌&#x…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...