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