【ELFK】之zookeeper

news2024/11/25 4:41:56

一、Zookeeper是什么?

  • zooleeper是一个分布式服务管理框架。存储业务服务节点元数据及信息,并复制;通知客户端在zookeeper上注册的服务节点状态,通过文件系统+通知机制

1、Zookeeper工作机制

Zookeeper从设计模式角度来理解

  • 是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已在Zookeeper上注册的那些观察者做出相应的反应。
     

Zookeeper=文件系统+通知机制

  • 文件系统: 就是将存储的数据通过zookeeper的文件系统进行存储到各个节点上。
  • 通知机制: 当某个节点出现故障,zookeeper会将信息通知到客户端上。

2、Zookeeper服务集群的条件

  • Zookeeper服务自身组成集群,2n+1个(奇数)主机。
  • 在集群中,允许n个主机宕机,只要集群中有一半以上的机器可用,zookeeper集群就可用。

例:

  1. 假如zookeeper为3台机器组成的集群,那么就可以允许失效一台,如果失效了2台,就会导致zookeeper集群不可用。
  2. 所以在搭建zookeeper集群时,主机数需要为奇数。
  3. 奇数的目的:为了提高容错能允许多损失一台。

总结:每个节点服务器都会在zookeeper中进行注册登记,client也获取当前在线服务器的列表,也会在zookeeper上进行注册登记,client在zookeeper集群上存储的数据。都会通过文件系统分布式存储到各个集群节点中,当集群中某个节点出现故障,zookeeper也会通知到client客户端。

3、Zookeper特点

  1. Zookeeper: 一个领导者(Leader),多个跟随者(Follower)组成的集群
  2. Zookeeper集群中只有半数以上节点存储,Zookeeper集群就能正常服务,所以Zookeeper适合安装奇数台服务器。
  3. 全局数据一致性: 每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
  4. 更新请求顺序执行: 来自同一个client的更新请求按其发送顺序依次执行,即先进先出。
  5. 数据更新原子性: 一次数据更新,要么成功,要么失败。
  6. 实时性: 在一定范围内,client能读到最新数据
     

总结:zookeeper集群中有一个lleader和多个follower,且zookeeper集群具有数据的一致性、原子性、实时性。且数据更新时按照发送顺序进行更新。

4、Zookeeper数据结构

Zookeeper数据模型的结构与linux文件系统很类似,整体上可以看作时一棵树,每个节点乘坐一个Znode。

每个znode默认能存储1mb的数据,每个znode都可以通过其路径唯一标识。

5、Zookeeper 选举机制

5.1 第一次启动选举机制

1、服务器1启动,发起一次选举。服务器1投自己一票。

  • 此时服务器1的票数为1票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;

2、服务器2启动,再发起一次选举,服务器1和2分别投自己1票,并交换选票信息。

  • 此时服务器1发现服务器2的myid比自己投票的服务器myid要大,所以将票投给服务器2.
  • 此时服务器1有0票,服务器2有2票,不够半数,选举无法完成,服务器1和2都保持looking状态。

3、服务器3启动,发起一次选举。

  • 服务器1和2发现服务器3的myid最大,就将选票信息投给服务器3.
  • 此时服务器1和2都有0票。服务器3有3票,超过半数,服务器3称为leader,服务器1和2更换状态为following。

4、服务器4启动,发起一次选举,此时服务器1,2,3已不是looking状态,不会更改选票信息。

  • 此时服务器3为3票,服务器4为1票,此时服务器服从多数,更改修选票信息为服务器3,并更改状态为following。

5、服务器5启动,情况和4一样,状态为following。

5.2 非第一次启动选举机制

1、当zookeerper集群中一台服务器出现以下两种情况之一时,就会开始进行leader选举。

  • 服务器初始化启动(第一次启动选举机制)
  • 服务器运行期间无法和leader保持连接(不知道leader是否已经产生了,或者leader宕机)

2、当一台及其进入leader选举流程时,当前集群也可以处于以下两种状态。

①集群中本来就已经存储一个leader

  • 对于已存在leader的情况,机器试图去选举时,被会告知当前服务器的leader信息,对于该机器来说,仅仅需要和leader机器建立连接,并进行状态同步即可。

②集群中leader宕机了。

  • 假设zookeeper由5台服务器组成,SID分别为1,2,3,4,5。ZXID分别为:8,8,8,7.并且此时SID为3的服务器时leader。
  • 某一时刻,当3和5都出现故障时,因此又重新开始选举。
#选举leader的规则
1、EPOCH大的直接胜出。
2、EPOCH相同,事务ID(ZXID)大的胜出.
3、ZXID相同,服务器ID大的胜出

----------------名词解释-----------------------
#1、SID:
服务器ID,用来标识一台Zookeeper集群中的机器,每台机器不能重复,和myid一致。

#2、ZXID
事务ID,ZXID是一个事务ID,用来标识一次服务器状态的变更,在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和Zookeeper服务器对于客户端“更新请求”的处理逻辑速度有关。

#2、Epoch
每个leader任期的代号,没有leader时选举方式跟第一次启动方法相同,每投完一次一票,这个数据就会增加。

5.3 总结

第一次启动选举机制

  • 主要需要看启动顺序,再看他的myid,只要选举票数超过半数,就会选举出一个leader。新加的机器都会指向这个leader。

非第一次启动选举机制

  • 假如存在leader,新加入的机器会获取到leader的信息,然后进行连接。
  • 假如没有leader,会先比较Epoch(任期数),再比较ZXID(事务ID),再比较SID(服务id)

6、Zookeeper应用场景

提供的服务包括:统一命令服务,统一配置管理,统一集群管理,服务节点动态上下线,软负载均衡等

①统一命令服务

  • 在分布式环境下,经常需要对应用/服务进行统一命令,便于识别,例如:IP不容易记住,而域名容易记住。

②统一配置管理

分布式环境下,配置文件同步非常常见,一般要求一个集群中,所有节点的配置信息是一致的,比如kafka集群,对配置文件修改后,希望能快速同步到各个节点上。
配置管理可交由Zookeeper实现,可将配置信息写入Zookeeper上的zonde,各个客户端服务器监听这个znode,一旦znode中的数据被修改,zookeeper将通知各个客户端服务器。

③统一集群管理

  • 分布式环境中,时实掌握每个节点的状态是必要的,可根据节点时实状态制作出一些调整,
  • zookeeper可以实现时实监控节点状态变化,可将节点信息写入zookeeper上的Znode。监听这个Znode可以获取它的时实状态变化。

④服务动态上下线

  • 客户端能时实洞察到服务器上下线的变化。(是否宕机)

⑤软负载均衡

  • 在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。

二、Zookeper集群部署

1、环境部署

1.1 实验环境

主机名ip地址安装软件系统版本
node1192.168..247.21apache-zookeeper-3.5.7-bin.tar.gzcentos7.5
node2192.168..247.22apache-zookeeper-3.5.7-bin.tar.gzcentos7.5
node2192.168..247.23apache-zookeeper-3.5.7-bin.tar.gzcentos7.5

1.2 安装前环境

//关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

//安装 JDK
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version

2.安装 Zookeeper

//下载安装包
官方下载地址:https://archive.apache.org/dist/zookeeper/

cd /opt
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz

#或者直接将软件包上传到/opt目录下。

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7

2.1 修改Zookeeper配置配置文件

cd /usr/local/zookeeper-3.5.7/conf
cp zoo_sample.cfg zoo.cfg

vim zoo.cfg
tickTime=2000     
#通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒
initLimit=10      
#Leader和Follower初始连接时能容忍的最多心跳数( tickTime的数量),这里表示为10*2s 
syncLimit=5     
#Leader和Follower之间同步通信的超时时间,这里表示如果超过5*2s,Leader认为Follwer死掉,并从服务器列表中删除Follwer
dataDir=/usr/local/zookeeper-3.5.7/data       
#●修改,指定保存Zookeeper中的数据的目录,目录需要单独创建
dataLogDir=/usr/local/zookeeper-3.5.7/1ogs    
#●添加,指定存放日志的目录,目录需要单独创建
clientPort=2181      #客户端连接端口

#添加集群信息
server.1=192.168.247.21:3188:3288
server.2=192.168.247.22:3188:3288
server.3=192.168.247.23:3188:3288

mkdir /usr/local/zookeeper-3.5.7/data
mkdir /usr/local/zookeeper-3.5.7/logs

2.2 设置myid号以及启动脚本

到这里就不要设置同步了,下面的操作,做好一台机器一台机器的配置。

echo 1 >/usr/local/zookeeper-3.5.7/data/myid
# node1上配置

echo 2 >/usr/local/zookeeper-3.5.7/data/myid
#node2上配置

echo 3 >/usr/local/zookeeper-3.5.7/data/myid
#node3上配置

#//配置启动脚本,脚本在开启启动执行的目录中创建
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/usr/local/zookeeper-3.5.7'
case $1 in
start)
	echo "----------zookeeper启动----------"
	$ZK_HOME/bin/zkServer.sh start
;;
stop)
	echo "---------- zookeeper停止-----------"
	$ZK_HOME/bin/zkServer.sh stop
;;
restart)
	echo "---------- zookeeper 重启------------"
	$ZK_HOME/bin/zkServer.sh restart
;;
status)
	echo "---------- zookeeper 状态------------"
	$ZK_HOME/bin/zkServer.sh status
;;
*)
	echo "Usage: $0 {start|stop|restart|status}"
esac

chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper

service zookeeper start

service zookeeper status

三台机器都需要执行脚本

启动node1机器(192.168.247.21)

启动node2机器(192.168.247.22)

启动node3机器(20.0.0.57)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1021566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java——文件操作IO

一 、文件File 狭义的文件: 指硬盘上的 文件 和 目录 。 广义的文件: 泛指计算机中的很多软硬件资源。 针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时, 往往不是保存成一个整体,而是独立成一个个的单位…

C/C++简单计算器 2019年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C简单计算器 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C简单计算器 2019年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 一个最简单的计算器,支持…

Hadoop NameNode执行命令工作流程

Hadoop NameNode执行命令工作流程 客户端API或者CLI与NameNode的交互命令数据的格式(1) 预处理流程(2) 创建NameNode与NameNodePrcServer流程(3) HDFS API以及CLI的命令到NameNode的工作执行流程(4) 执行命令的参数流动 客户端API或者CLI与NameNode的交互命令数据的格式 hadoop…

读高性能MySQL(第4版)笔记10_查询性能优化(上)

1. 三管齐下 1.1. 不做、少做、快速地做 1.2. 如果查询太大,服务端会拒绝接收更多的数据并抛出相应错误 1.3. 如果查询写得很糟糕,即使库表结构再合理、索引再合适,也无法实现高性能 1.4. 查询优化、索引优化、库表结构优化需要齐头并进&…

JS的WebAPI

WebAPI背景知识 什么是 WebAPI 前面学习的 JS 分成三个大的部分 ECMAScript: 基础语法部分 DOM API: 操作页面结构 BOM API: 操作浏览器 WebAPI 就包含了 DOM BOM. 什么是 API API 是一个更广义的概念. 而 WebAPI 是一个更具体的概念, 特指 DOMBOM,所谓的 API …

使用 Elasticsearch、OpenAI 和 LangChain 进行语义搜索

在本教程中,我将引导您使用 Elasticsearch、OpenAI、LangChain 和 FastAPI 构建语义搜索服务。 LangChain 是这个领域的新酷孩子。 它是一个旨在帮助你与大型语言模型 (LLM) 交互的库。 LangChain 简化了与 LLMs 相关的许多日常任务,例如从文档中提取文本…

服务网格和CI/CD集成:讨论服务网格在持续集成和持续交付中的应用。

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

混淆矩阵细致理解

1、什么是混淆矩阵 混淆矩阵(Confusion Matrix)是深度学习和机器学习领域中的一个重要工具,用于评估分类模型的性能。它提供了一个清晰的视觉方式来展示模型的预测结果与真实标签之间的关系,尤其在分类任务中,帮助我们…

浅谈应急照明系统在民用建筑的设计应用与产品选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 【摘要】应急照明分为备用照明、安全照明及疏散照明。文章介绍了应急照明系统的设计、灯具选择、灯具布置、配电等要求。并结合实例进行疏散照明的计算,以指导应急照明系统的设计与应用。 【关键词】照度&#xf…

大数据学习1.4-xShell配置Hadoop

1.创建hadoop目录 mkdir /usr/local/hadoop 2.切换到hadoop中 cd /usr/local/hadoop/ 3.将hadoop直接拖到xShell中 4.解压hadoop tar -zxvf hadoop-2.7.1.tar.gz 5.配置环境变量 vi /etc/profile export PATH$PATH:/usr/local/hadoop/hadoop-2.7.1/bin 6.加载配置文件(不能…

【刷题】蓝桥杯

蓝桥杯2023年第十四届省赛真题-平方差 - C语言网 (dotcpp.com) 初步想法,x y2 − z2(yz)(y-z) 即xa*b,ayz,by-z 2yab 即ab是2的倍数就好了。 即x存在两个因数之和为偶数就能满足条件。 但时间是(r-l)*x&am…

Mybatis学习笔记8 查询返回专题

1.返回实体类 2.返回List<实体类> 3.返回Map 4.返回List<Map> 5.返回Map<String,Map> 6.resultMap结果集映射 7.返回总记录条数 新建模块 依赖 目录结构 1.返回实体类 如果返回多条,用单个实体接收会出异常 2.返回List<实体类> 即使返回一条记…

【软考】系统集成项目管理工程师(四)项目管理一般知识

一、 项目 1、 项目的定义 为大到特定的目的、使用一定的资源、在确定的期间内、为特定发起人而提供独特的产品、服务或成果而进行的一次性努力。 2、项目目标 分类描述成果性目标项目目标&#xff1a;满足客观要求的产品、系统、服务或者成果&#xff1b;例&#xff1a;①…

删除链表中所有含有val的节点

给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 思路1&#xff1a;遍历查找&#xf…

大数据学习1.1-Centos8网络配置

1.查看虚拟网卡 2.配置网络信息 打勾处取消 记住箭头的数字 3.修改 网络连接 4.进入虚拟网络 5.进入属性 6.修改IPv4 5.将iIP和DNS进行修改 6.配置网络信息-进入修改网络配置文件 # 进入root用户 su root # 进入网络配置文件 cd /etc/sysconfig/network-scripts/ # 修改网络配…

C. Beautiful Sets of Points(找规律杂题)

解析&#xff1b; 由于坐标必须为整数&#xff0c;并且距离不能为整数&#xff0c;则同行同列不能存在多个“好点”。 则每行每列只能放一个点&#xff0c;所以最多的点数量即为 min&#xff08;n&#xff0c;m&#xff09;1 #include<bits/stdc.h> using namespace std…

以数据为中心的安全市场快速增长

根据Adroit Market Research的数据&#xff0c;2021年全球以数据为中心的安全市场规模估计为27.6亿美元&#xff0c;预计到2030年将增长至393.48亿美元&#xff0c;2021年至2030年的复合年增长率为30.9%。 研究人员表示&#xff0c;以数据为中心的安全强调保护数据本身&#x…

arcgis栅格按某列属性导出

栅格属性如下 可以看出栅格对应很多属性值&#xff0c;我们要按其中一个属性值作为栅格值 操作如下 只需将栅格值赋值为所需属性数据

后端配置(宝塔):SSH终端设置

一、打开SSH开关 在“安全”中找到SSH管理&#xff0c;按图打开对应按钮 二、复制秘钥 点击“查看密钥”&#xff0c;对密钥进行复制 三、添加服务器 在终端页面添加新的服务器 四、进行密钥连接 输入IP地址&#xff0c;进行root登录&#xff0c;私钥即在“安全”界面复制的…

微服务保护-隔离和降级

隔离和降级 限流是一种预防措施&#xff0c;虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围&#xff0c;避免雪崩&#xff0c;就要靠线程隔离&#xff08;舱壁模式&#xff09;和熔断降级手段了。 线…