学习SpringCloud中要用到Zookeeper就又跑过来学了。。
全局一致性
每个server保存的数据副本均是一致的,Client不管连哪个展示的数据都是一致的。
可靠性:
如果消息被其中一台服务器接收,那么将被所有服务器接收
顺序性:
包括全局有序和偏序两种
全局有序:如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布。
偏序:如果一个消息b在消息a后被同一个发送者发布,a必然排在b前面。
Leader:Zookeeper集群工作的核心
事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性
Follower: 处理客户端非事务(读操作)请求,转发事务请求给Leader;
针对于访问量比较大的zookeeper集群,还可新增观察者角色
Observer:观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给leader服务器进行处理。(不越权!)
通常由2n+1台servers组成。为了保证leader的选举能得到多数的支持,所以Zookeeper集群数量一般为奇数!
Zookeeper运行需要java环境,所以需要提前安装jdk。(以为我之前搞了redis,所以就不用弄了。。)
我用的是xshell,准备三台服务器搭集群,先打开三个服务器
然后 查看-快速命令
在快速命令处输入date命令查看三台服务器时间是否一致,不一致自行修改!
我是Centos7的系统,Centos6和7的命令并不相通(7上6下)
直接systemctl disable firewalld
。。懒得写了,网上都有
如果是单机搭建的伪集群可看:(网上找的。。)
https://blog.csdn.net/qq_38787653/article/details/91860664
如果看到这里的人给个小建议,建议一步一步搭,先搭一个单机的zookeeper能启动了,在复制修改!(我可是搭了一下午啊我真是个脑残)
①stat:状态信息,描述Znode的版本,权限等信息
②data:与该Znode关联的数据
③children: 该Znode下的子节点
Zookeeper树的特点:
Znode有两种,分别为临时节点和永久节点
临时节点:生命周期依赖于会话,会话结束,临时节点自动删除。一般不允许临时节点下拥有子节点。(因为如果临时节点下有永久节点,那么临时节点过期了,永久节点怎么办,产生谬论了。)
永久节点:生命周期不依赖与会话。永久存在,只有客户端执行删除操作时候才能被删除。
Znode还有一个序列化的特性,可以记录每个子节点创建的先后顺序。
由以上所述,节点属性分为4种:
zookeeper/bin/zkCli.sh -server ip #进入Zookeeper客户端
create默认创建永久节点,如果要创建临时节点加 -e 的参数,创建序列化节点 -s 参数
create [-e/-s] path data acl #创建节点格式
ls path [watch] #ls可列出指定节点下的所有子节点(仅第一级)
get path [watch] #get可以查看指定节点的数据内容
stat path [watch] #可以查看属性信息
Tips:我是看视频学习的,但是视频上的get方法表现的像是我这里的stat方法一样,我觉得应该是版本原因,视频中还有个ls2方法,但是我这个版本用help找不到有这个方法,不过这都是小细节,应该影响不大!
补充:
set path data [version] #data表要更新的内容,version表数据版本
delete path [version] #删除节点
Rmr path #递归删除(慎重使用)
Tips:若删除的节点下有子节点,必须先删除子节点,在删除父节点。
setquota -n|-b val path #对节点增加限制
n:表示子节点的最大个数(自己算一个!)
b:表示数据值的最大长度
val:子节点最大个数或数据值的最大长度
path:节点路径
listquota path #列出指定节点的quota
delquota [-n|-b] path #删除quota
是一个软限制,如果客户端的个数超过最大个数,不会报错,只会在日志中进行警告。
history #列出命令历史
redo #该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看
Zookeeper提供了分布式数据发布/订阅功能,Zookeeper中引入了Watcher机制来实现这种分布式的通知功能。
Zookeeper允许客户端向服务端注册一个Watcher监听,当服务端的一些事件(节点创建,节点删除。。)触发了这个Watcher,那么就会向指定客户端发送一个时间通知来实现分布式的通知功能。
总的来说,Watcher可以概况为以下三个过程:客户端向服务端注册Watcher、服务端事件发生触发Watcher、客户端回调Watcher得到触发事件情况。
一次性触发
事件触发监听,一个watcher event被发送到客户端,后续再次发生同样的事情不会再次触发。(我说了你不听那就没办法了)
事件封装
Zookeeper使用WatcherEvent对象来封装服务端事件并传递
WatcherEvent包含事件的三大属性:
通知状态(keeperState)、事件类型(EventType)、节点路径(path)
event异步发送
watcher的通知事件从服务端发送到客户端是异步的。
先注册在触发
Zookeeper中的watch机制,必须客户端先去服务端注册监听。
如果连接状态事件(type=None,path=null)不需要客户端注册,客户端只需要直接处理就可以了。
stat -w path #设置监听
在SpringCloud中写吧。。(反正这里不写)
zookeeper默认的算法是FastLeaderElection,采用投票数大于半数则胜出的逻辑。 所以集群的服务器一般为奇数个。
服务器ID
编号越大,在选择算法中的权重越大。
选举状态
LOOKING: 竞选状态
FOLLOWING: 小弟
OBSERVING: 观察状态(不投票),只参与非事务请求的处理
LEADING: 老大
数据ID
服务器中存放的最新数据version
值越大说明越信,在选举算法中数据越新权重越大
逻辑时钟
又叫投票次数,同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,然后与接收到的其他服务器返回的投票信息中的数值相比,根据不同的值做出不同的判断。
5台机器(1,2,3,4,5)
1投全部,自己共一票
2投2以上全部,自己共两票
3投3以上全部,共三票,超半数,故3号机当选leader。
1、逻辑时钟小得选举结果被忽略,重新投票(过滤到之前有没参与投票的服务器,或者出故障没投票的机器)
2、统一逻辑时钟后,数据id大的胜出(最新)
3、数据id相同,服务器id大的胜出
发布与订阅模型,即所谓的配置中心,就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。
分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。
锁可以分为两类,一个是保持独占,另一个是控制时序。
UDP(用户数据报协议)
TCP(传输控制协议)