Zookeeper的出现是为了解决分布式系统中,由于网络不确定性所引起的:数据访问顺序不确定、数据访问视角不统一、节点上下线感知滞后等问题。
1、Zookeeper是什么?
Zookeeper是一个分布式的,开放源码的分布式应用程序系诶套服务,是Google的Chubby一个开源的实现。
2、Zookeeper基础单元
zookeeper基础单元称作znode,类似于操作系统中的文件夹。
对zookeeper的所有操作就相当于对节点的增删改查
Znode有4中类型:
PERSISTENT,PERSISTENT_SEQUENTIAL
创建的znode在客户端断开时还存在
EPHEMERAL,EPHEMERAL_SEQUENTIAL
创建的znode在客户端断开时自动删除
SEQUENTIAL类型会在创建的znode文件夹后面增加一个编号
顺序号是一个单调递增的计数器,由父节点维护
创建4个节点
当退出后
3、zookeeper监听机制
zookeeper会监控znode改编情况
由于其他服务器都在访问某znode
--创建znode删除znode的时候,其他服务器会感知到
--某znode种设置的内容改编,其他服务器会感知到
通过对znode的增加删除,设置内容可以对多个节点进行协调
4、zookeeper可以做什么?
1)配置管理
--多台服务器都需要统一配置文件
--配置文件会动态改变的情况下
该种情况可以通过zookeeper进行统一管理
**通过创建znode将配置内容存入znode中,每台机器都查看同一个znode
2)名称服务
--多台服务器访问某地址,直接访问ip显得不友好
--该地址dns对应ip会变化
该种情况可以通过zookeeper进行统一管理
**通过创建znode将dns与ip对应内容存入znode中,每台机器都查看同一个znode
3)分布式锁
--多台服务器访问同一资源
--该资源修改要有顺序性
--同一时间只有一个客户端访问资源
该种情况可以通过zookeeper节点的持有来控制
**多台服务器共同创建同一个znode,哪台机器创建成功,哪台机器访问资源,访问资源后删除节点
**在多台服务器在某个固定znode下创建带序号的子zonde,按照序号小的先访问,访问后删除节点
4)集群管理
--某台服务器上线
--某台服务器上线
该种情况可以通过zookeeper节点下子节点的增加减少来控制
**服务器上线时在约定好的znode中创建对应名称的 临时znode
**服务器下线时对应的znode自动删除
5、Zookeeper设计目的
1). 最终一致性:
client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
2). 可靠性:
具有简单、健壮、良好的性能,如果消息被到一台服务器接受,那么它将被所有的服务器接受
3). 实时性:
Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等
原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口
4. 等待无关(wait-free):
慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
5.原子性:
更新只能成功或者失败,没有中间状态。
6.顺序性:
包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在
消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。
6、Zookeeper角色
--leader:负责投票发起,负责同步数据状态
--learner:负责接收client请求
--follow:隶属learner参与投片
--observer:隶属learner不参与投票,只接收client请求
--client:向zookeeper集群发送请求
7、zookeeper选主流程及数据同步
每台服务器都有属于自己的myid与zxid,投票时先比较zxid,如果相同比较myid
1):集群启动,服务器都是最初状态
--由于服务器都为最初状态,因此每台机器对应的zxid都是0,因此对比myid。
--启动第一台服务器,没有其他服务器,投自己一票,统计票数是否达到了服务器总数
一半以上,服务器为looking状态
--再启动一台服务器,判断两台服务器myid大小,算上自己给myid投2票,统计票数是否满足条件,服务器为looking状态
--按照启动顺序,每台服务器都比较myid大小,最大的得票,统计票数是否满足条件
--当启动到某台服务器,票数相加满足票数达到了服务器总数一半以上,选举此时myid最大的为leader,服务器转为learding状态,其他转为flowing状态
--再启动服务器虽然myid很大由于存在leader,因此成为follower,转为following状态。
2):服务器运行一段时间
--leader断掉,其他节点转变为looking状态
--由于服务器运行一段时间,因此每台机器对应的zxid会有些许不同
--首先所有服务器都投自己一票(相当于定义自己的zxid和myid信息)
--将自己的投票信息(自己对应的zxid和myid)发送给其他服务器
--其他服务器通过对比zxid,更新下次投票的信息(相当于对比所有zxid寻找对大的节点)
--当投票某服务器为leader,票数到半数以上(2/n + 1)时转变状态为learding
--其他服务器转变成following
选主后进行数据同步:
--发送心跳给其他服务器,确定连接状态
--follower连接leader将最大的zxid发送给leader
--leader接收到zxid,确认最大zxid对应数据需要同步的位置(确定哪台机器数据最全)
--将最大zxid对应的数据同步到其他服务器(将最全数据同步)
--当全部同步后,发送同步成功信息给follower
--follower收到同步成功信息后,可以继续接受client请求
8、Zookeeper节点数据操作流程
写操作
--client向某服务器提交写请求
--服务器将写请求转发个leader
--leader将写请求发送给所有follower
--follower将写成功信息发送给leader
--当leader统计超过半数以上follower写成功则完成写操作
读操作
--client向某服务器提交读请求
--由于最终一致性每台服务器数据相同
--不用通过leader进行协调,将follower上数据发送个client