Zookeeper是一个开源的分布式的,为分布式框架(比如Haddop)和微服务框架(Dubbo)提供协调服务的Apache项目
一,Zookeeper的工作机制和特点
Zookeeper从设计模式角度是一个基于观察者设计模式的分布式服务管理框架,它负责存储和管理服务都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应
本质上Zookeeper是一个文件系统(K-V形式)和通知机制的结构,其他框架的核心信息会保存在Zookeeper的K-V中,Zookeeper对信息进行监听,当数据发生变动,Zookeeper会进行通知,其他框架服务也可以对Zookeeper中的数据进行获取和调用
特点:
1,Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群
2,集群中只要有半数以上节点存活,Zookeeper集群就能正常服务,所以Zookeeper适合安装奇数台服务器
3,全局数据一致:每一个Zookeeper集群节点保存一份相同的数据副本,Client无论连接那个机器的zookeeper服务,数据都是一致的
4,更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行
5,数据更新原子性,一次更新要么成功,要么失败
6,实时性,在一定的时间范围内,Client能读到最新数据(因为zookeeper中保持的数据量很小)
二,Zookeeper的数据结构和应用场景
一,ZK数据结构
Zookeeper数据模型的结构与Linux文件系统很相似,整体可以看作是由一个个节点组成的树,每一个节点称作ZNode,每一个ZNode默认能够存储1MB的数据,每一个ZNode节点都有唯一的标识
Zookeeper数据模型是节点组成的树,实际存储数据结构是K-V型的,每个节点存储的数据量很小
注:Zookeeper数据结构不像Redis支持5种基本类型,它只有一种K-V型
数据模型:Node树
数据结构:K-V
二,ZK的应用场景
Zookeeper提供的服务包括:
-
统一命名服务
-
统一配置管理
-
统一集群管理
-
服务器节点动态上下线
-
软负载均衡
一,统一命名服务
在分布式环境下,经常需要对应用服务进行统一命名,便于识别,例如:IP不容易记住,而域名容易记住
二,统一配置管理
1,分布式环境下,经常需要配置文件同步操作
①,一般要求集群中所有的节点配置信息是一致的,比如:Haddop集群,Kakaf集群
②,对配置文件修改后,希望能够快速同步到各个节点上
2,配置管理交由zookeeper实现
①,可以将配置信息写入Zookeeper上的Znode节点中
②,各个客户端服务器监听这个Znode,
③,一旦Znode中的数据发生修改,Zookeeper将通知各个客户端服务器,他们再进行同步
三,统一集群管理
1,分布式环境中,实时掌握每一个节点的状态是很重要的
① 根据节点的实时状态对集群做出调整
2,Zookeeper可以实现实时监控节点的状态变化
① 将节点信息写入Zookeeper上的ZNode
② 监听这个ZNode可获取它的实时状态变化
四,软负载均衡
在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求
注:使用zookeeper做负载均衡可以使用其他负载策略,不局限于最小活跃数(这是使用Zookeeper最适合做的负载均衡策略)
三,Zookeeper的选举机制
Zookeeper的选举机制分两种情况:
- 第一次启动时选举
- 非第一次启动时选举
一, 第一次启动时Zookeeper选举机制
设有五台服务器
1)服务器1启动时,发起一次选举,服务器1投自己一票,此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1保存LOOKING状态
注:LOOKING是一个特殊的
2)服务器2启动,再发起一次选举,服务器1和2分别投自己一票并交换选票信息,此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票推荐服务器2,此时服务器1票数为0,服务器2票数为2,都没有到达半数以上,选举无法完成,服务器1,服务器2都保存LOOKING状态
注:当服务器1投票后发现自己成不了Leader,就会把选票给下一个选举服务器,因而需要比较myid,当myid比自己大,直接把选票全部给下一个服务器
3)服务器3启动,发起一次选举,此时服务器1和2都会更该选票为服务器3,此时投票结果:服务器1为0,服务器2为0,服务器3为3超过半数,服务器3当选Leader,服务器1和服务器2为Follower
4)服务器4启动,发起一次选举,此时服务器1,2,3都已经不是LOOKING状态,不会交换选票信息,因此服务器4只有1票,为Follower
5)服务器5启动和服务器一样
Zookeeper的三大ID:
-
SID:服务器ID,用来唯一标识一台Zookeeper集群中的机器,每一台机器不能重复(myid文件就是标明SID)
-
ZXID:事务ID,用来标识一次服务器状态的变更(对zookeeper的读写),在某一时刻,集群中的每一台机器的ZXID值不一定完全一致这和服务端和客户端的处理逻辑有关
-
Epoch:每一个Leader任期的代号,没有Leader时同一次投票过程中的逻辑时钟值是相同的,每投完一票这个值就会增加
二,非第一次启动时Zookeeper选举机制
集群中的一台机器出现以下情况就会进行Leader选举:
-
服务器初始化:就是启动时选举
-
服务器运行期间Leader宕机无法连接
当一台机器进入Leader选举流程时,当前集群也可能处于两种状态:
-
集群本来已经存在一个Leader
对于已经存在Leader的情况,机器尝试去选举Leader时,会被告知当前集群的Leader信息(IP地址,端口信息),机器不再进行选举,仅仅需要和Leader机器建立连接,进行状态同步即可
-
集群中不存在Leader
假设Zookeeper由5台服务器组成,SID分别为1,2,3,4,5,ZXID分别为8,8,8,7,7,并且此时SID为3的服务器是Leader,某一时刻3和5机器发生故障宕机,Leader宕机,剩下的3台机器1,2,4进行选举
此时三台机器的信息:(EPOCH,ZXID,SID)
-
机器1:(1,8,1)
-
机器2:(1,8,2)
-
机器4:(1,7,4)
此时选举的规则:需要判断三个值(优先级依次递减)
-
EPOCH大的直接胜出
-
EPOCH相同,事务ZXID大的胜出
-
ZXID相同,服务器SID大的胜出
最终机器2成为新大Leader
四,Zookeeper的安装
Zookeeper的下载地址:https://archive.apache.org/dist/zookeeper
一般用3.5.7稳定版本
一,Zookeeper本地安装
一,zookeeper底层是java编写的,需要安装JDK环境
① 下载JDK
注:下载类型为tar.gz的linux tar压缩包类型
② 上传文件到linux中
文件上传主要有两种方式:
1,通过FTP文件传输客户端(需要单独下载XFTP工具)
2,通过linux的rz文件传输命令(一些轻量级安装的iso镜像没有自带,需要单独安装)
安装RZ:yum install lrasz
传输命令:
-
rz:从本地上传到服务器
-
sz filename:从服务器下载到本地
③ 解压文件
命令:tar -zxvf 压缩包名
④ 配置环境变量
在 /etc/profile 文件下配置环境变量
配置内容:要修改为对应的JDK路径
export JAVA_HOME=/home/JDK export PATH=$PATH:$JAVA_HOME/bin
⑤ 重启配置
命令:source /etc/profile
⑥ 检查java是否安装成功
命令:java -version
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109