什么是ZooKeeper
ZooKeeper是Java语言编写的开源框架,用以协调分布式的一个工具。
ZooKeeper存储结构与特性
类似于树形结构,同一层节点名称不能重复。节点类型分为临时节点与持久节点
Zookeeper以节点方式进行存储,类似于xml树状结构;
a、节点又分为节点名称(全路径不能重复)和 节点值
b、 节点类型有持久节点(持久化在硬盘上)和临时节点(会话与临时节点同死同生)
c、节点功能:每个节点都有通知功能,当这个节点增删改的时候都会有事件通知
Zookeeper主要有一下特性
a、一致性:数据按照顺序分批入库;
b、原子性:事务要么成功要么失败,不会局部化;
c、单一视图:客户端连接集群中任何一个zk节点,数据都是一致的;
d、可靠性:每次对zk的操作状态都会保存在服务端;
e、实时性:客户端可以读取到zk服务器的 新数据;
ZooKeeper中临时节点与持久节点区别
持久节点是持久化在硬盘上,会话断开后节点也能查到;
临时节点与会话保持连接,会话在节点在,会话断开,节点也会删除;
ZooKeeper应用场景
A、服务注册与发现的中心
B、利用临时节点特性解决分布式锁
C、分布式配置中心
D、基于哨兵机制实现选举策略
E、实现本地负载均衡
F、基于节点事件通知特性可做消息中间件
G、分布式事务
什么场景下会导致ZooKeeper发生延迟通知
watch事件延迟:节点被修改后,会有事件通知发往观察者,直到接收到watch事件,观察者才会知道节点被修改了;当管擦着接到watch事件的那一刻,该节点又被其他修改者修改了,而 近的watch事件还没有通知到观察者,就会造成延迟通知。
分布式锁有那些实现方案
a、基于setNx实现分布式锁(麻烦,需要考虑死锁及释放问题)
b、redission实现分布式锁
c、zookeeper实现分布式锁(基于临时节点,实现简单,效率高,失效时间容易控制)
ZooKeeper实现分布式锁的原理
多个jvm在同一个zookeeper上创建同一个节点(临时节点),哪个jvm能创建成功,就表示它拿到了锁,剩下的jvm保持对这个节点的监听,一旦发现这个节点被删除了,那么剩下的jvm就重新再创建这个节点,谁能创建成功谁能拿到锁,依次循环下去。
ZooKeeper实现分布式锁与Redis实现分布式锁区别
Zookeeper通过创建临时节点和利用监听事件实现分布式锁,Redis使用setnx命令创建相同的key,因为Redis的key保证唯一,先创建的先获取锁。
不断的去尝试,去获取锁,比较耗性能
Zookeeper实现分布式锁,即使获取不到锁,创建对锁的监听即可,不需要不断去尝试获取 锁,性能开销小
Redis实现分布式锁,如果客户端获取到锁的时候遇到bug或挂了,还需要等到超时时间过了以后才能重新获取锁
Zookeeper实现分布式锁,创建的是临时节点,客户端挂了,节点自然删除,也就达到了自动释放锁的效果
使用Zookeeper实现服务Master选举原理
多个服务器在启动时候,会在Zookeeper上创建相同的临时节点,谁如果能够创建成功,谁就为主。如果主服务器宕机,其他备用节点获取监听信息,重新创建节点,选出主服务器。
ZooKeeper集群选举原理
每台Zookeeper服务器启动时会发起投票,每次投票后,服务器统计投票信息,如果有机器获取半数以上的投票数则leader产生。