1.zookeeper
1.1zookeeper概述
zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性问题。
zookeeper本质上是一个分布式的小文件的存储系统。提供类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效的管理,从而用来维护和监控存储数据的状态变化,通过监控这些数据的变化,从而可以达到基于数据的集群管理。
诸如:统一命名服务,分布式配置管理、分布式消息队列、分布式锁、分布式协调等功能。
1.2 zookeeper特性
1.全局数据一致性
2.可靠性
3.顺序性
4.数据更新原子性:要么成功,要么失败
5.实时性
1.3zookeeper集群角色
leader:
zookeeper集群工作的核心。
事务请求(写操作)的唯一调度者和处理者;集群内部各个服务器的调度者。
follower:
处理客户端的非事务性(读操作)请求,转发事务请求给leader
参与集群leader的选举投票
observer:
观察zookeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会发给leader服务器进行处理。不参与投票,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。
1.4zookeeper集群搭建
zookeeper运行需要java环境,所以需要提前安装jdk
安装leader+
2.zookeeper shell
2.1客户端连接
运行zkCli.sh -server ip 进入命令行工具,输入help,输出zk shell提示
2.2shell基本操作
创建节点:create [-s] [-e] path data acl
-s -e:分别指节点特性,顺序或者临时节点,若不指定,则表示持久节点,cal用来进行权限控制。
删除节点:delete path [version]
其他命令:history:列出命令历史
3.zookeeper的数据模型
树形层次结构、zookeeper树中的每个节点被称为一个znode。
1.znode兼具文件和目录两种特点
2.znode具有原子性操作
3.znode存储数据大小有限,通常为KB级别
4.znode通过路径引用
3.1数据结构图
3.2节点类型
znode有两种,分别为临时节点和永久节点。
3.3节点属性
dataversion:数据版本号;eversion:子节点的版本号;aclversion:ACL的版本号;czxid:znode创建的事务ID;mzxid:znode被修改的事务ID,即每次对znode修改就会更新mzxid;ephemeralowner:如果该节点是临时节点。
4.zookeeper watcher
zookeeper提供了分布式数据发布/订阅功能。引入watcher机制来实现这种分布式的通知功能
watcher三个过程:客户端向服务器注册watcher、服务端事件发生触发watcher、客户端回调watcher得到事件的情况
4.1 watch机制特点
一次性触发、事件封装、event异步发送、先注册再触发
4.2通知状态和事件类型
4.3shell客户端设置watcher
5.zookeeper java API
org.apache.zookeeper.Zookeeper
Zookeeper是在java中客户端主类,负责建立与zookeeper集群的会话,提供方法进行操作
org.apache.zookeeper.Watcher
watcher接口表示一个标准的事件处理器,定义了事件的回调方法process(watchedEvent event)
5.1基本使用
打开编译器,创建一个maven工程,下一步
finish创建得到
加入依赖,
点击import自动连网下载
构造类的实例
在包下创建class类
加载主类
查看参数
点进去查看参数
根据参数进行编写
构造java zk客户端,编写事件通知回调的方法
在没有操作(增删改查)的情况下测试回调的发生以及回调的类型。main右键
得到
5.2更多操作实例:
注意,监听触发一次
6.zookeeper选举制度
zookeeper默认的算法是FastLeaderElection,采用投票数大于半数则胜出的逻辑
6.1概念
6.2全新jiqunxuan
6.3非全新集群选举
选举过程中需要加入数据ID、服务器ID、逻辑时钟
选举标准:1.逻辑时钟小的选举结果被忽略,重新投票
2.统一逻辑时钟后,数据id大的胜出
3.数据id相同的情况下,服务器id大的胜出
根据这个标准选出leader
7.zookeeper典型应用
7.1数据发布与订阅(配置中心)
发布者将数据发布到zk节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。适合数据量特别小的场景。
7.2命名服务(naming service)
在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。
阿里巴巴集团开源的分布式服务框架Dubbo中使用zookeeper来作为其命名服务,维护全局的服务地址列表。
7.3分布式锁
分布式锁,主要得益于zookeeper保证了数据的强一致性。锁服务分为两类,一个是保持独占,另一个是控制时序