1.zookeeper是什么
简介:是一个开放源码的分布式协调服务,主要为了解决分布式架构下数据一致性问题,是集群的管理者,监视着集群中各个节点的状态,根据节点的反馈进行下一步合理操作。
最终将简单易用的接口和性能高效、功能稳定的系统提供给用户
应用场景:分布式配置中心、分布式注册中心、分布式锁、分布式队列、集群选举、分布式屏障、发育/订阅等场景
2.zookeeper数据结构
简介: zookeeper数据模型类似于文件系统,是树状结构,每个树节点(目录)对应一个Znode节点。这些目录节点和普通的目录节点一样,可新建、删除、修改
常用数据格式,常用有以下四种类型的Znode
持久化目录节点,PERSISTENT,客户端与zookeeper断开连接后,该节点依旧存在,除非手动删除节点
持久化顺序编号目录节点,PERSISTENT_SEQUENTIAL,客户端与zookeeper断开连接后,节点依然存在,只是zookeeper给该节点名称进行顺序编号
临时目录节点,EPHEMERAL,客户端与zookeeper断开连接后,删除节点
临时顺序编号目录节点,EPHEMERAL_SEQUENTIAL,客户端与zookeeper断开连接后,删除节点,只是zookeeper给该节点名称进行顺序编号
zookeeper客户端常用命令:
./zkCli.sh -server ip:host #连接zookeeper服务端
quit #断开zookeeper服务器连接
help #查看帮助
ls / #查询所有目录节点
create 节点名 值(写不写都行) #创建目录节点
set 节点名 值 #设置目录节点的值
delete 节点名 #删除节点
deleteall 节点名 #删除节点及其子节点
create -e /节点名 值(可写可不写) #创建临时目录节点
create -s /节点名 值(可写可不写) #创建持久化目录节点
ls -s /节点名 #查看目录节点的详细信息
3.zookeeper java api(Curator)
简介:apache Curator 是一个用于apache zookeeper的java客户端框架。Curator提供了一组易于使用的api和工具,简化了与zookeeper的交互,同时提供更高级别的抽象和功能
搭建和使用cluator
pom.xml引入cluator支持(org.apache.curator.curator-recipes,org.apache.curator.curator-framework)
连接zookeeper客户端,通过CuratorFrameworkFactory.newClient
创建节点、查询节点、更新节点、删除节点
watch事件监听
zookeper允许用户在指定节点上注册一些watcher,并且在一些特定事件触发的时候,zookeeper服务端会将事件通知到感兴趣的客户端,该机制是zookeeper实现分布式协调服务的重要特性
zookeeper中引入了watcher机制来实现了发布/订阅功能,可让多个订阅者同时监听某一个对象,当一个对象自身状态发生变化时,会通知所有订阅者
zookeeper提供了三种watcher:
NodeCache:只是监听某一个特定的节点
PathChildrenCache:监听一个Znode的子节点
TreeCache:监听整个树上的所有节点,类似于 NodeCache和 PathChildrenCache的组合
分布式锁实现
在进行单机应用开发时,涉及并发同步的问题,往往采用synchronized或lock的方式来解决多线程的代码同步问题,此时多线程运行在一个JVM上,没问题
但是当应用是分布式集群工作的情况下,属于多JVM下的工作环境,跨JVM已经无法通过多线程的锁同步来解决线程安全问题,
便需要一种更高级的锁机制,来处理跨服务器的进程之间的同步问题,这就是分布式锁。
分布式锁原理
核心思想:当客户端获取锁时,创建节点,释放锁时,删除节点
当客户端获取锁时,在lock节点下创建临时顺序节点
然后获取lock下所有的子节点,客户端获取到所有的子节点后,发现如果自己创建的子节点序号最小,那么便认为客户端获取到了锁,使用完锁后,将节点删除
如果发现自己创建的子节点序号并非最小,说明还未获取到锁,此时客户端需要找到比自己小的节点,同时对其注册事件监听器,监听删除事件
如果发现比自己小的子节点被删除,则客户端的watcher会收到通知,此时再次判断自己创建的子节点是否是序号最小的,如果是则获取锁,
否则继续监听比自己小的一个节点并注册监听
Curator中有五种锁方案
InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)
InterProcessMutex:分布式可重入排它锁
InterProcessReadWriteLock:分布式读写锁
InterProcessMultiLock:将多个锁作为单个实体管理的容器
InterProcessSemaphoreV2:共享信号量
4.zookeeper集群搭建
zookeeper集群介绍:
leader选举:
ServerId:服务器ID,编号越大在算法中的权重越大
Zxid:数据ID,服务器中存放的最大数据ID,值越大说明数据越新,在数据算法中数据越新,数据权重越大
在leader选举过程中,如果某台zookeeper获取超过半票的票数,则此zookeeper就可以称为leader了
5.zookeeper核心理论
zookeeper集群服务中有三个角色
leader:领导者:处理事务请求,集群内部各服务器的调度者
Follower:跟随者:处理客户端非事务请求,转发事务请求给Leader服务器,参与leader选举投票
Observer:观察者:处理客户端非事务请求,转发事务请求各leader服务器