zookeeper入门

一、分布式思想

  1. 当某个文件数据的体量超出了某一台服务器所能存储的最大容量时,如要继续存储,则首先根据数据整体规模大小以及单台服务器所能存储的最大容量,计算出存储改文件所需要的服务器总台数,进而实现服务器节点数量的规划;

  2. 其次将这些规划好的服务器以网络的形式组织起来,形成一个集群;

  3. 在这个集群中,每一台服务器进行整个文件的部分数据的存储以及计算的操作,统一管理集群中的各个服务器资源,提供一个统一的文件的出入口(首领)负责和客户端交互

二、zookeeper概述

  1. 概述:zookeeper是分布式协调服务框架,用于解决分布式环境下的一些常见问题:集群统一管理、统一命名、信息配置、分布式一致性等等

  2. 分布式的解决方案:

    a.引入zookeeper的监控和管理节点来保证集群中服务器之间的任务、资源调度

    b.为了防止单一监控节点带来的单点故障问题,所以需要引入多个监控节点

    c.为了防止多个监控节点之间的任务调度不同,需要从中选举出一个主监控节点,只有此节点提出的任务调度方案才会被接收

    d.为了避免主监控节点宕机而导致所有数据丢失的问题,需要将监控节点的数据进行统一,以便以在其宕机之后,其余节点能够快速顶替工作

  3. 三台虚拟机的系统设置:

    a.创建一个软件管理目录:mkdir -p /home/software

    b.防火墙:

    i.查看防火墙状态: systemctl status firewalld

    ii.临时关闭:systemctl stop firewalld

    iii.永久关闭:chkconfig firewalld off

    c.后续几乎所有课程内容的大数据框架都需要JDK的支持,因此要先安装JDK并配置其环境变量:

    i.先在jit-bigdata01上完成配置:

    1)上传jdk的压缩包至软件管理目录下
    在这里插入图片描述

    2)解压:tar -zxf jdk-8u181-linux-x64.tar.gz

    3)重命名:mv jdk1.8.0_181/ jdk1.8

    4)配置环境变量:

    a)编辑:vim /etc/profile

    b)在文件末尾添加以下内容:

    #set env varsJAVA_HOME=/home/software/jdk1.8CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/toos.jarPATH=$JAVA_HOME/bin:$PATH export JAVA_HOME CLASSPATH 		PATH
    

    c)保存退出,重新加载使修改生效:source /etc/prpfile

    5)验证指令是否处处可用:

    在这里插入图片描述

    ii.其余两台直接远程拷贝以上文件以及目录即可:

    1)jit-bigdata01执行:

    scp -r /home/software/jdk1.8 root@slave01:/home/software/ scp -r 	/home/software/jdk1.8 root@slave02:/home/software/ scp -r /etc/profile 	root@slave01:/etcscp -r /etc/profile root@slave02:/etc
    

    2)jit-bigdata02 & jit-bigdata03执行: source /etcc/profile

    java -version

三、zookeeper集群模式:

1.集群模式的搭建:

a. 首先在jit-bigdata01虚拟机也即master上安装部署zookeeper:

i.上传 zookeeper-3.4.7.tar.gz至软件管理目录

ii.解压安装:tar -zxvf zookeeper-3.4.7.tar.gz

iii.重命名:mv zookeeper-3.4.7 clusterZK

1)重要目录说明:

a)bin:zk的可执行文件所在目录,zk服务器指令与zk客户端指令
在这里插入图片描述

b)conf:配置文件所在目录,核心配置文件zoo.cfg(zk启动默认寻找此名称的配置文件,加载其中的配置项)
在这里插入图片描述

iv.zk服务的核心配置项:

1)切换到conf目录下:cd clusterZK/conf/

2)复制一份模板文件,命名为zoo.cfg:cp zoo_sample.cfg zoo.cfg

3)编辑zoo.cfg:vim zoo.cfg

a)修改其中dataDir属性的值,指定数据文件(版本信息、事务日志、快照文件等)的存储目录:

dataDir=/home/software/clusterZK/tmp

i)格式:server.zk服务器编号=服务器IP:原子广播端口:选举端口

ii)例如:

server.1=192.168.88.182:2888:3888server.2=192.168.88.183:2888:3888server.3=192.168.88.184:2888:3888

iii)注意:

One. 服务器编号一定是数字,并且不能重复,具有唯一性;此数字需要与服务器编号文件myid中的数字一致 Two. 原子广播端口&选举端口可以修改,前提不能是当前已经被使用的端口号

c)保存退出

v.编写服务器的编号:

1)切换回到clusterZK目录下,创建tmp目录:mkdir tmp

2)进入到tmp目录下,创建服务器编号文件myid:vim myid

3)编辑此文件,填入当前服务器对应的编号

vi.配置zk的环境变量:

1)编辑:vim /etc/profile

2)添加新的ZK_HOME:

 #set env varsJAVA_HOME=/home/software/jdk1.8 ZK_HOME=/home/software/clusterZK CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/toos.jar PATH=$JAVA_HOME/bin:$ZK_HOME/bin:$PATHexport JAVA_HOME CLASSPATH ZK_HOME PATH

3)保存退出,重新加载: source /etc/profile

b.然后将master上的部署完成的zookeeper远程拷贝至slave01&slave02:

i.clusterZK文件夹:

1)拷贝:

scp -r /home/software/clusterZK/ root@slave01:/home/software/scp -r /home/software/clusterZK/ root@slave02:/home/software/ 
  1. 修改服务器编号:

a)slave01上:myid值为2

b)slave02上:myid值为3

ai./etc/profile文件:

1)远程拷贝:

scp /etc/profile root@slave01:/etc scp /etc/profile root@slave02:/etc

2)重新加载:

a)slave01 & slave02上:source /etc/profile

2.启动集群:

a.依次在三台服务器上执行:zkServer.sh start

i.在哪个工作目录下执行,zk的启动日志zookeeper.out文件就位于那个目录

ai.若出现意料之外的一些错误异常,可以检查此文件的日志

b.查看集群状态:

1)此时要求Mode必须是leader或follower

2)若出现standalone或者not running,表示zk集群配置存在某些问题,导致集群通信失败未能正常启动

ai.指令:jps

1)此时要求必须存在一个QuorumPeerMain进程

3.登录zk客户端:

a.指令:zkCli.sh [-server localhost:2181]

i.不指定服务器,表示默认启动本机2181端口的zk服务

b.客户端的操作指令:

在这里插入图片描述

四、zookeeper的结构&特性

1.结构特点:

a.zookeeper是一个树状结构,根节点为/,zookeeper中的每一个节点都被称为znode,树状结构被称为znode树

b.znode树中的所有的znode节点都是从根节点出发(绝对路径形式)
在这里插入图片描述

c.每个znode的路径都是唯一不可重复的,可以基于此特点实现集群中的统一命名服务
在这里插入图片描述

d.znode节点的类型分为四种:

i.持久节点:一旦创建就会持久化到磁盘中,只要未被销毁,就会一直存在

ii.临时节点:跟随客户端会话销毁而销毁,从属于当前客户端会话,临时存在的;例如ephemeralOwner = 0x288b778dea80000

iii.持久顺序节点:持久化并编号

iv.临时顺序节点:临时并编号

e.每一个持久节点都可以挂在子节点

f.每一个znode节点都必须存储数据,但是不能存储海量数据:

i.znode树维系在内存中,并且假设集群模式下每个zk存储的数据都是相同的,必然会造成内存浪费甚至崩溃

ii.zk本质上是为了实现分布式协调服务而不是存储服务

g.znode树:

i.维系在内存:便于客户端快速访问、进行查找

ii.持久化到磁盘:便于容错、恢复数据

h. zookeeper会为每一次事务性操作(增删改)提供一个全局递增的事务id——zxid 2. znode节点信息:

在这里插入图片描述

3.退出客户端:quit

在这里插入图片描述

本质上是关闭了客户端会话,后续再次启动客户端会开启一个全新的会话,重新分配会话sessionID

4.zookeeper的事务日志:

a.存放在dataDir属性指定的目录下的version-2中:/home/software/clusterZK/tmp/version-2,其中log.n是持久化事务日志文件

b.概念:

i.在zookeeper正常运行过程中执行过的事务型操作,在返回客户端ack响应之前,zk会被保证已将本次事务操作写入到磁盘文件中

ii.此文件是二进制文件,无法通过vim/cat/tail这些查看工具进行编辑或查看

c.需要通过zk提供的日志工具包的API来实现查看事务日志:

i.将zookeeper-3.4.7.jar & slf4j-api-1.6.1.jar两个工具包拷贝到事务日志文件所在的version-2目录下:

cp /home/software/clusterZK/zookeeper-3.4.7.jar 
/home/software/clusterZK/tmp/version-2/ cp 
/home/software/clusterZK/lib/slf4j-api-1.6.1.jar 
/home/software/clusterZK/tmp/version-2/

ii. 在version-2目录下,执行:

java -cp .:zookeeper-3.4.7.jar:slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.100000001

iii.一条事务日志信息说明:

创建时间 所属客户端会话编号 创建czxid编号 最大事务id 事务操作

在这里插入图片描述

5.集群特性

i.客户端不论连接到zookeeper集群中的哪个服务器上,展示给客户端的都是相同的视图;也即znode树结构一致以及数据一致 b. 原子性:

i.对于事务型决议的更新(增删改),只有成功或者失败两种可能,没有中间状态;

ii.要么都更新更新,要么都更新失败

iii.要么整个集群中所有机器都成功应用了某个事务,要么都没有应用某个事务;一定不会出现集群中部分机器应用了该事务,而另一部分机器没用应用的情况

c.可靠性:

i.一旦zookeeper集群中服务器端成功应用了某个事务(记录了该事务日志),并且完成了客户端的响应,那么该事务所引起的服务器端状态变化就会一直保留下来,直到有另一个事务对其进行了更改

d.顺序性:

i.只要某一台服务器上消息a是在消息b之前发布的,那么在所有的服务器上消息a都是消息b之前被发布

ii.客户端在发起请求时,都会跟着一个递增的命令号(在底层指的就是zxid);根据此机制,zookeeper会确保客户端提交的事务的执行顺序

e.实时性:

i.zookeeper可以保证客户端在非常短的时间间隔范围内感知到服务器的更新信息、失效信息或者指定监听事件的变化信息

ii.示例:

1)服务器关闭,此时客户端会立即感知到所连接到这台服务器出错:Session 0x186c4330ffe0000 for server null, unexpected error, closing socket connection and attempting reconnect

2)再次开启服务器:

a)若还在此时客户端会话的连接超时时间范围内,则会恢复当前客户端会话;

b)若此时已经超过连接时间,会提示当前客户端会话已经过期:Unable to reconnect to ZooKeeper service, session

0x186c47179020000 has expired, closing socket connection

3)若超时过期,则需要重新开启一个客户端; sessionid = 0x188b7e005850000发生变化 f. 过半性:

i.过半服务(运行):zookeeper集群中只有超过一半服务器正常工作(状态正常),才能对外提供服务

1)举例:

a)关闭掉bigdata01&bigdata03上的zkServer.sh stop,立马bigdata02上的客户端会提示:

b)bigdata02上的服务器状态变为:

ii.过半操作:zookeeper集群中只有超过一半服务器存活,客户端才能提交请求应用请求;在zookeeper集群在做事务决议的时候,一定要有半数以上的服务器正常写入了此事务(增删改)才能更新事务

iv.过半选举

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MBD开发 STM32 UASRT

目录 轮询 ptintf 中断方式 DMA方式 轮询 串口要加入这两个文件 bug在于接到10个后会一直发送 ptintf function buffPtr convert(buff)if coder.target(Sfun)%固定句式%Executing in MATLAB, Buff is nullbuffPtr uint32(0); elsecoder.cinclude(getBuffPtr.h);%加入头…

Mybatis处理复杂查询环境

复杂查询环境 多对一和一对多 多个工作者对应一个协调人 对于工作者(worker)而言,多个工作者关联一个协调人(coordinator)(多对一,关联) 对于协调人而言,一个协调人有很多工作者(一对多,集合&a…

node版本管理工具nvm手册

文章目录 下载使用命令node.js其他版本下载下载exe版解压改名放入到指定位置 下载 github下载 使用命令 查看当前版本 nvm -v 查看被管理的node nvm list 切换node版本 nvm use 14.21.3 node.js其他版本下载 下载链接 下载exe版 解压改名放入到指定位置

【Squid二】使用squid和nginx服务搭建反向缓存代理服务

使用squid和nginx服务搭建反向缓存代理服务 1.反向代理1.1 反向代理概述1.2 反向代理工作机制 2.搭建squid反向代理服务2.1 Nginx服务器端配置2.2 squid反向代理服务器配置 3.搭建nginx反向缓存代理服务3.1 nginx反向缓存代理服务配置3.2 nginx服务端配置3.3 客户端验证访问 参…

老照片修复:模糊褪色有划痕的老旧照片如何修复?

在我们的生活中,照片是记录我们生活的重要方式之一。无论是在手机相册里还是在家中的相册里,我们都有很多珍贵的照片,但是随着时间的推移,照片也会老化,甚至出现褪色、划痕、折痕、破损、发霉等情况,这些情…

2核4G服务器_4M带宽_CPU性能测评_60G系统盘

阿里云2核4G服务器297元一年、4M公网带宽、60G系统盘,阿里云轻量应用服务器2核4G4M带宽配置一年297.98元,2核2G3M带宽轻量服务器一年108元12个月,如下图: 目录 阿里云2核4G4M轻量应用服务器 2核4G服务器限制条件 轻量服务器介…

第 7 章 集合-----Scala集合继承图

7.1.1 不可变集合继承图 7.1.2 可变集合继承图 7.2.3 不可变数组与可变数组的转换 7.7.6 复杂 WordCount 案例 1)方式一 object TestWordCount {def main(args: Array[String]): Unit {// 第一种方式(不通用)val tupleList List(("H…

自定义MVC

目录 一、MVC概念描述 1、什么是MVC? 2、什么是自定义MVC? 3、自定义MVC有什么用(主要用途)? 二、MVC三层架构 第一种版本 JSP页面 servlet 结果 第二种版本 JSP代码 servlet 结果 第三种版本 jsp页面 s…

HIve中的查询语句

文章目录 Hive中的查询语句1. 基础语法2. 基本查询(Select…From)2.1 数据准备(0)原始数据(1)创建部门表(2)创建员工表(3)导入数据 2.2 全表和特定列查询1&am…

Flutter 实现任意控件拖动

文章目录 前言一、如何实现?1、使用GestureDetector响应拖动事件2、使用Transform变换控件位置3、计算拖动区域 二、完整代码三、使用示例1、基本用法 总结 前言 使用flutter开发是需要控件能拖动,比如画板中的元素,或者工具条,搜…

arcgis api for JavaScript4.2x 在vue中白膜图层的加载、(分类、分段)渲染

这篇文章是对有webgis前端开发经验的人 1、假设之前的三维视图均已成功加载,获取到了三维视图,这里的三维视图变量定义的名字是mapView。(PS:三维视图mapview在项目初始化已经设置了,本示例中会直接使用调用结果&…

Unity 热力图效果实现 笔记

Unity 热力图效果实现 笔记 参考文献连接: 1、人体热力图shader graph实现(URP) 超链接: https://www.youtube.com/watch?vKlMON4Dzq_0&t51s shader forge 翻译通用管线下 连接点实现方案: 2、碰撞热力图实现…