ZooKeeper学习总结 入门、复习ZooKeeper首选
ZooKeeper概念
-
ZooKeeper是Apache Hadoop 项目下的一个子项目,是一个树形目录服务
-
ZooKeeper翻译过来就是动物管理员,它是用来管Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。简称zK
-
ZooKeeper是一个分布式的、开源的分布式应用程序的协调服务。
-
ZooKeeper提供的主要功能包括:
-
配置管理(配置管理作为配置中心使用)
-
-
分布式锁
-
-
集群管理(集群管理作为注册中心使用)
-
-
ZooKeeper数据模型
-
ZooKeeper是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似,拥有一个
层次化结构。
-
-
这里面的每一个节点都被称为:ZNode,每个节点上都会保存自己的数据和节点信息。
-
节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下。
-
节点可以分为四大类
-
PERSISTENT 持久化节点
-
EPHEMERAL 临时节点:-e
-
PERSISTENT_SEQUENTIAL 持久化顺序节点:-s
-
EPHEMERAL_SEQUENTIAL 临时顺序节点:-es
-
ZooKeeper命令操作
ZooKeeper客户端常用命令
-
创建临时节点
create -e /节点path value
-
创建顺序节点
create -s /节点path value
-
查询节点详细信息
ls -s /节点path
- 其他指令
ZooKeeper JavaAPI操作
分布式锁
-
平时在进行单机应用开发,涉及并发同步的时候,往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题
-
但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境,跨JVM之间已经无法通过多线程的锁解决同步问题。
-
那么就需要一种更加高级的锁机制,来处理跨机器的进程之间的数据同步问题——分布式锁
ZooKeeper分布式锁原理
-
核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。
-
客户端获取锁时,在lock节点下创建临时顺序节点。(为什么是创建临时的节点呢?答:因为持久化节点在宕机时不会自动删除,临时节点会在宕机时自动删除)
-
然后获取lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁,使用完锁后,将该节点删除。
-
如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。
-
如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应的通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
ZooKeeper集群搭建
ZooKeeper集群介绍
Leader选举:
-
Serverid:服务器ID
比如有三台服务器,编号分别是1,2,3。
编号越大在选择算法中的权重就越大。
-
Zxid:数据ID
服务器中存放的最大数据ID,值越大说明数据越新,在选举算法中数据越新权重越大。
-
在Leader选举的过程中,如果某台ZooKeeper获取了超过半数的选票,则此ZooKeeper就可以成为Leader了。
ZooKeeper集群角色
在ZooKeeper集群服务中有三个角色:
-
Leader领导者:
-
处理事务请求
-
集群内部各服务器的调度者
-
-
Follower跟随者:
-
处理客户端非事务请求,转发事务请求给Leader服务器
-
参与Leader选举投票
-
-
Observer观察者:
-
处理客户端非事务请求,转发事务请求给Leader服务器
-
总结
ZooKeeper本质上就是一个解决分布式系统一致性,为分布式应用程序提供高性能协调服务的工具。现在已经成为了越来越多分布式应用不可或缺的组件。
特点有:
-
高性能
-
高可用
-
严格有序的访问
我会在本专栏里分享与后端有关的知识