网站模板制作教程视频教程,南京网站建设培训班,老师教学生做网站吗,论坛型网站开发Zookeeper概述
Zookeeper 是一个开源的分布式的#xff0c;为分布式框架提供协调服务的 Apache 项目
工作机制
Zookeeper从设计模式角度来理解#xff1a;是一个基于观察者模式设计的分布式服务管理框架#xff0c;它负责存储和管理大家都关心的数据#xff0c;然后接受…Zookeeper概述
Zookeeper 是一个开源的分布式的为分布式框架提供协调服务的 Apache 项目
工作机制
Zookeeper从设计模式角度来理解是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据然后接受观察者的注 册一旦这些数据的状态发生变化Zookeeper就 将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应 Zookeeper文件系统通知机制 其主要功能为数据存储通知更新 以服务器上下线为例 1.服务端启动到zookeeper集群中注册信息
2.客户端从zookeeper集群中获取到当前服务器的列表并注册监听
3.服务器节点下线
4.zookeeper集群将服务器节点下线事件通知到客户端
5.客户端重新获取服务器列表并注册监听 特点 1Zookeeper是一个领导者Leader多个跟随者Follower组成的集群
2集群中只要有半数以上节点存活Zookeeper集群就能正常服务。所 以Zookeeper适合安装奇数台服务器
偶数台服务器并不能提升zookeeper的性能
3全局数据一致每个Server保存一份相同的数据副本Client无论连接到哪个Server数据都是一致的
4更新请求顺序执行来自同一个Client的更新请求按其发送顺序依次执行
5数据更新原子性一次数据更新要么成功要么失败
6实时性在一定时间范围内Client能读到最新数据
数据结构 ZooKeeper 数据模型的结构与 Unix 文件系统很类似整体上可以看作是一棵树每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据每个 ZNode 都可以通过其路径唯一标识 ZNode结构决定了ZooKeeper只适合存储一些简单的配置文件不适合存储海量数据 应用场景
Zookeeper提供的服务包括统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等
统一命名服务 统一配置管理
分布式环境下经常有各个节点配置信息一致的要求因此对配置文件修改后希望能快速同步到各个节点上 zookeeper进行统一配置管理的简单流程
1可将配置信息写入ZooKeeper上的一个Znode
2各个客户端服务器监听这个Znode
3一旦Znode中的数据被修改ZooKeeper将通知各个客户端服务器
统一集群管理
将节点信息写入zookeeper的ZNode中然后监听该ZNode即可获取集群节点的实时状态变化 服务器动态上下线
客户端能实时洞察到服务器上下线的变化
1.服务端启动到zookeeper集群中注册信息
2.客户端从zookeeper集群中获取到当前服务器的列表并注册监听
3.服务器节点下线
4.zookeeper集群将服务器节点下线事件通知到客户端
5.客户端重新获取服务器列表并注册监听
软负载均衡
在Zookeeper中记录每台服务器的访问数让访问数最少的服务器去处理最新的客户端请求 Zookeeper集群搭建
安装包下载
官网地址Apache ZooKeeper 进入下载界面 选择tar包 安装流程
集群一共使用在三台服务器上部署zookeeper服务器名称分别为hadoop102-hadoop104
1.上传安装包到服务器上使用tar -zxvf进行解压到/opt/module/路径下自定义的路径
2.将解压后的apache-zookeeper-3.5.7-bin重命名为zookeeper-3.5.7
3.配置服务器编号
在/opt/module/zookeeper-3.5.7/这个目录下创建 zkData 然后在该目录下创建一个名为myid的文件
文件名称是固定的因为源码中读取的文件名称就是myid
然后在文件中添加与server 对应的编号三台服务器的编号分别为2、3、4
4.配置zoo.cfg文件 重命名/opt/module/zookeeper-3.5.7/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg
然后打开 zoo.cfg
①修改数据存储路径dataDirdataDir/opt/module/zookeeper-3.5.7/zkData
②增加集群配置
server.2hadoop102:2888:3888
server.3hadoop103:2888:3888
server.4hadoop104:2888:3888 配置参数格式server.AB:C:D A 是一个数字表示这个是第几号服务器集群模式下配置一个文件 myid这个文件在 dataDir 目录下这个文件里面有一个数据就是 A 的值Zookeeper 启动时读取此文件拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个 server B 是这个服务器的地址 C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口2888 D 是万一集群中的 Leader 服务器挂了需要一个端口来重新进行选举选出一个新的Leader而这个端口就是用来执行选举时服务器相互通信的端口3888 5.将myid及zoo.cfg的配置分发到所有服务器上注意服务器编号要修改
集群启动
进入zookeeper路径下
启动bin/zkServer.sh start
停止bin/zkServer.sh stop
查看状态bin/zkServer.sh status
(附)zoo.cfg配置参数解读 1.tickTime 2000通信心跳时间Zookeeper服务器与客户端通信心跳时间单位为毫秒
2.initLimit 10LF初始通信时限Leader和Follower初始连接时能容忍的最多心跳数tickTime的数量 当前配置下tickTime 2000initLimit 10则如果Leader和Follower20s内未建立连接就认为通信失败 3.syncLimit 5LF同步通信时限 Leader和Follower之间通信时间如果超过syncLimit * tickTime也就是10sLeader认为Follwer挂掉从服务器列表中删除Follwer 4.dataDirZookeeper中数据存储的路径 不建议使用默认的tmp目录可能会被linux定期删除 5.clientPort 2181客户端连接端口通常不做修改 (附)集群启停脚本
在/home/username/bin如/home/why/bin路径下新建zk.sh文件
#!/bin/bash
case $1 in
start){
for i in hadoop102 hadoop103 hadoop104
doecho ---------- zookeeper $i 启动 ------------
ssh $i /opt/module/zookeeper-3.5.7/bin/zkServer.sh start
done
};;stop){
for i in hadoop102 hadoop103 hadoop104
doecho ---------- zookeeper $i 停止 ------------
ssh $i /opt/module/zookeeper-3.5.7/bin/zkServer.sh stop
done
};;status){
for i in hadoop102 hadoop103 hadoop104
doecho ---------- zookeeper $i 状态 ------------
ssh $i /opt/module/zookeeper-3.5.7/bin/zkServer.sh status
done
};;esac即将bin/zkServer.sh start、bin/zkServer.sh stop、bin/zkServer.sh status等指令封装起来 添加权限chmod ux zk.sh 这样就可以通过zk.sh start、zk.sh stop进行集群的启停了 Zookeeper选举机制
第一次启动
假设集群中一共有5台服务器
1服务器1启动发起一次选举。服务器1投自己一票。此时服务器1票数一票不够半数以上3票选举无法完成服务器1状态保持为LOOKING
2服务器2启动再发起一次选举。服务器1和2分别投自己一票并交换选票信息此时服务器1发现服务器2的myid比自己目前投票推举的服务器1大更改选票为推举服务器2。此时服务器1票数0票服务器2票数2票没有半数以上结果选举无法完成服务器12状态保持LOOKING 根据myid进行投票选择 3服务器3启动发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果服务器1为0票服务器2为0票服务器3为3票。此时服务器3的票数已经超过半数服务器3当选Leader。服务器12更改状态为FOLLOWING服务器3更改状态为LEADING
4服务器4启动发起一次选举。此时服务器123已经不是LOOKING状态不会更改选票信息。交换选票信息结果服务器3为3票服务器4为1票。此时服务器4服从多数更改选票信息为服务器3并更改状态为FOLLOWING
5服务器5启动与服务器4相同
集群中产生leader之后不再继续选举 非第一次启动
当ZooKeeper集群中的一台服务器出现以下两种情况之一时就会开始进入Leader选举
服务器初始化启动服务器运行期间无法和Leader保持连接
而当一台机器进入Leader选举流程时当前集群也可能会处于以下两种状态
集群中本来就已经存在一个Leader。 对于第一种已经存在Leader的情况机器试图去选举Leader时会被告知当前服务器的Leader信息对于该机器来说仅仅需要和Leader机器建立连接并进行状态同步即可 集群中确实不存在Leader 此时的选举规则如下
假设ZooKeeper由5台服务器组成SID分别为1、2、3、4、5ZXID分别为8、8、8、7、7并且此时SID为3的服务器是Leader。某一时刻3和5服务器出现故障因此开始进行Leader选举
SID为1、2、4的机器投票情况EPOCHZXIDSID
181 182 174
选举Leader规则
①EPOCH大的直接胜出
②EPOCH相同事务id大的胜出
③事务id相同服务器id大的胜出 参数说明 ● SID服务器ID。用来唯一标识一台ZooKeeper集群中的机器每台机器不能重复和myid一致。 ● ZXID事务ID。ZXID是一个事务ID用来标识一次服务器状态的变更。在某一时刻集群中的每台机器的ZXID值不一定完全一致这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑有关。 ● Epoch每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加 Zookeeper 命令行操作
命令行语法 命令基本语法 功能描述 help 显示所有操作命令 ls path 使用 ls 命令来查看当前 znode 的子节点 [可监听] -w 监听子节点变化 -s 附加次级信息 create 普通创建znode节点 -s 含有序列 -e 临时重启或者超时消失 get path 获得节点的值 [可监听] -w 监听节点内容变化 -s 附加次级信息 set 设置节点的具体值 stat 查看节点状态 delete 删除节点 deleteall 递归删除节点
命令行实操
首先启动zookeeper集群
然后进入zookeeper安装路径下启动客户端
bin/zkCli.sh -server hadoop102:2181
help
使用help查看帮助 节点数据信息ls
ls /查看zookeeper中所有的znode节点 ls -s /查看更多节点信息 1czxid创建节点的事务 zxid 每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid如果 zxid1 小于 zxid2那么 zxid1 在 zxid2 之前发生 2ctimeznode 被创建的毫秒数从 1970 年开始
3mzxidznode 最后更新的事务 zxid
4mtimeznode 最后修改的毫秒数从 1970 年开始
5pZxidznode 最后更新的子节点 zxid
6cversionznode 子节点变化号znode 子节点修改次数
7dataversionznode 数据变化号
8aclVersionznode 访问控制列表的变化号
9ephemeralOwner如果是临时节点这个是 znode 拥有者的 session id。如果不是临时节点则是0
10dataLengthznode 的数据长度
11numChildrenznode 子节点数量 注意使用ls -s /查看的是整个znode树的根节点 即是该根节点下面所有的子节点要想查看子节点的具体信息使用具体路径即可 例如ls -s /why 节点类型create/get/set
节点类型主要分为以下四种 1持久化目录节点客户端与Zookeeper断开连接后该节点依旧存在
2持久化顺序编号目录节点客户端与Zookeeper断开连接后该节点依旧存在只是Zookeeper给该节点名称进行顺序编号
3临时目录节点客户端与Zookeeper断开连接后该节点被删除
4临时顺序编号目录节点客户端与 Zookeeper 断开连接后 该节点被删除 只 是Zookeeper给该节点名称进行顺序编号。 顺序编号的含义 创建znode时设置顺序标识znode名称后会附加一个值顺序号是一个单调递增的计数器由父节点维护 在分布式系统中顺序号可以被用于为所有的事件进行全局排序这样客户端可以通过顺序号推断事件的顺序 创建普通节点永久节点 不带序号
1.create /bigdata bigdatacreate普通节点/bigdata是路径bigdata是节点值
zookeeper创建节点时需要赋值
2.create /bigdata/test1 test1 查看节点的值
get -s /bigdata get -s /bigdata/test1 创建带序号的节点永久节点 带序号
首先创建一个节点create /bigdata/test2 test2
然后在该节点下创建带序号的永久节点通过 -s 创建 如果原来没有序号节点序号从 0 开始依次递增。如果原节点下已有 2 个节点则再排序时从 2 开始以此类推
创建短暂节点
首先创建一个节点create /bigdata/test3 test3
然后在该节点下创建短暂节点通过 -e 创建create -e /bigdata/test3/e1 e1
可以查看该节点 接下来退出客户端重启zookeeper集群之后重新进入客户端去查看该节点 可以看到该短暂节点已经不存在了
修改节点的值
使用set指令
set /bigdata bigdata_why 监听器原理
客户端注册监听它关心的目录节点当目录节点发生变化数据改变、节点删除、子目录节点增加删除时ZooKeeper 会通知客户端。监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序 工作流程
1首先要有一个main()线程
2在main线程中创建Zookeeper客户端这时就会创建两个线程一个负责网络连接通信connet一个负责监听listener
3通过connect线程将注册的监听事件发送给Zookeeper
4在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
5Zookeeper监听到有数据或路径变化就会将这个消息发送给listener线程
6listener线程内部调用了process()方法将变化通知到客户端 常见的监听
1监听节点数据的变化get path [watch]
2监听子节点增减的变化ls path [watch]
节点的值变化
监听bigdata节点的变化get -w /bigdata
可以看到节点当前的值 在hadoop103上修改节点的值 在hadoop102中即可监听到节点数据的变化 节点的子节点变化监听
在hadoop102中
ls -w /bigdata监听bigdata节点
在hadoop103中新建子节点 在hadoop102中即可监听到子节点的变化 节点删除与状态查看
删除节点delete /bigdata/test4
递归删除deleteall /bigdata/test2 可以看到删除成功
查看节点状态stat /bigdata