ZooKeeper是一个开源的分布式协调服务,由雅虎创建,是Google Chubby的开源实现。ZooKeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用;

分布式一致性特性:
    顺序一致性:严格按照其发起顺序
    原子性
    单一视图:无论连接的是哪个ZK服务器,数据模型都是一致
    可靠性
    实时性:保证在一定的时间段内,Client最终能从Server读取到最新的数据状态
集群角色:
    Leader (提供读和写服务)
    Follower(提供读服务)
    Observer(提供读服务,不参与Leader选举,也不参与写操作的『过半写成功』策略)

1.数据模型

树形结构,每个节点ZNode,通过其路径唯一标识,跟Unix文件系统有些类似。ZNode可存储少量数据(默认是1M,可以通过配置修改,不建议ZNode上存储大量数据),还存储了其Acl信息;

2.重要概念

节点
ZNode可以分为持久节点(persistent)和临时节点(ephemeral)两类;

Session
Client与Zookeeper之间的通信会创建一个Session,通过心跳检测和服务器保持有效的会话,有超时时间,集群会持久化连接的Session信息;

Watcher
事件监听器,用于监听znode事件(create、delete、update、get),一次性的,即触发一次就会被取消

3.ZK特性

1.读写模式(读性能好,写需要Leader进行请求广播并有半数以上成功的ACK — 『过半写成功』策略)
2.WAL和Snapshot(i.write-ahead-log:先写WAL, 然后再对内存中的数据做更新,然后向Client通知更新结果;ii.定期将内存中的目录树进行Snapshot,落地到磁盘上;)
3.FIFO(i.通信基于TCP;ii.请求是按照FIFO顺序)
4.Linearizability(有严格的偏序关系,更新操作是串行执行)

4.Client API

create、delete、exists、getData、setData、getChildren、sync、setAcl、getAcl

5.应用场景

1. 命名服务(NameService) :通过简单的名字来访问指定的HDFS机群
2. 配置管理(Configuration Management) :统一配置(比如Job的多个实例配置信息),也就是数据发布与订阅;
3. 组员管理(Group Membership):新增节点和Slave宕机的调整
4. 简单互斥锁(Simple Lock) :broadcast(会造成羊群效应(Herd Effect))
5. 互斥锁(Simple Lock without Herd Effect):next(临时的顺序结点)
6. 读写锁(Read/Write Lock) :多个读可以并发执行,但写读写写互斥
7. 屏障(Barrier) :等待多个进程完成各自的任务,然后继续往前进行下一步
8. 双屏障(Double Barrier):它可以用来同步一个任务的开始和结束,当有足够多的进程进入屏障后,才开始执行任务;当所有的进程都执行完各自的任务后,屏障才撤销;

ZooKeeper是一个典型的分布式数据一致性的解决方案。具有数据发布/订阅、负载均衡、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能;

6.ZAB协议

ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeeper Atomic Broadcast(ZAB,ZooKeeper原子广播协议)的协议作为其数据一致性的核心算法;
    ZAB协议并不像Paxos算法和Raft协议一样,是通用的分布式一致性算法,它是一种特别为ZooKeeper设计的崩溃可恢复的原子广播算法。
    ZAB协议的两种基本模式:崩溃恢复和消息广播;
    崩溃恢复模式包括两个阶段:

i.Leader选举和数据同步;

ii.退出恢复模式后进入消息广播模式;

Leader选举:

利用ZooKeepr的强一致性,能够很好地保证在分布式高并发情况下节点的创建一定能够保证全局唯一性,即ZooKeeper将会保证客户端无法创建一个已经存在的ZNode;
实现过程:多个客户端请求创建同一个临时节点,那么最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很容易地在分布式环境中进行Master选举了;
Leader(Master) 选举的具体步骤:
    1、客户端连接时,在指定的目录(这里假定为"/leader")创建一个EPHEMERAL_SEQUENTIAL的节点,把内网的IP数据存入创建节点。
    2、获取目录的子点节,并取得序列号最小的节点,我们把这个节点设置为leader。当此节点被删除时,证明leader断线。
    3、其它机器监听leader节点,当leader节点的删除时,再取目录的最小子点节作为leader。

ZooKeeper原理及使用:http://www.wuzesheng.com/?p=2609

ZooKeeper原理与应用:https://www.jianshu.com/p/84ad63127cd1

Leader(Master)选举:https://blog.csdn.net/massivestars/article/details/53894551

 

最新文章

  1. 深入理解javascript的getTime方法
  2. 在tmux中的vi 上下左右键变为了ABCD等字符
  3. SWT布局管理器
  4. supervisor安装配置与使用
  5. mybatis0210 mybatis和ehcache缓存框架整合
  6. linux切换用户
  7. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-005-Bean的作用域@Scope、ProxyMode
  8. Java系列--第八篇 基于Maven的SSME之定时邮件发送
  9. POJ2485——Highways
  10. SQL server 2000安装时“以前的某个程序安装已在安装计算机上创建挂起”
  11. 深度学习caffe:Ubuntu16.04安装指南(1)
  12. Python 接口测试(四)
  13. 基础数据类型的补充和深浅copy
  14. 一次jdk1.7升级jdk1.8后导致redis运行时blocked_clients过多问题解决
  15. TableExport导出失败问题
  16. day 4 Socket 和 NIO Netty
  17. wcf 使用sqlMembership证书认证
  18. DLRS(近三年深度学习应用于推荐系统论文汇总)
  19. bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm
  20. IE6下出现横向滚动条问题的解决方案

热门文章

  1. python – 如何禁用Django的CSRF验证?
  2. sqli--labs(25)
  3. android sp文件一个键值保存多条信息
  4. .net framework4.6项目的dll升级后,未找到方法“System.String.GetPathsOfAllDirectoriesAbove”解决
  5. scss 用法 及 es6 用法讲解
  6. open jdk卸载
  7. Python Module_openpyxl_处理Excel表格
  8. 测开之路一百四十五:SQLAlchemy与后台模板整合之新增、查询、删除
  9. python对象的引用
  10. Jmeter之检查点