Zookeeper 快速理解
转自:http://blog.csdn.net/colorant/article/details/8444283
== 是什么 ==
目标Scope(解决什么问题)
为分布式系统提供高可靠性的协同工作机制
官方定义
ZooKeeper is acentralized service for maintaining configuration information, naming,providing distributed synchronization, and providing group services.
个人理解
基本上ZooKeeper提供了一个简化并支持特定功能的分布式文件系统接口,加上数据同步,变更通知,客户端Cache等辅助机制。基于这样的接口,用户可以自己在此之上构建逻辑,来实现各种分布式系统系统工作所需的各种功能,如配置管理,名称服务,Master选举,同步,锁等,类似于google的Chubby,但是没有内建锁的支持。
== 如何实现 ==
核心思路,架构
zookeeper的核心思想是提供一个非锁机制的Wait Free的用于分布式系统同步的核心服务,提供简单的文件创建读写操作接口,其系统核心本身对文件读写并不提供加锁互斥的服务,但是提供基于版本比对的更新操作,客户端可以基于此自己实现加锁逻辑。客户端可以连接任意zookeeper服务节点来读写数据,zookeeper内部会分为Leader和Follower角色。

Zookeeper使用简单的同步策略,通过以下两条基本保证来实现数据的一致性:
- 全局串行化所有的写操作
- 保证同一客户端的指令被FIFO执行(以及消息通知的FIFO)
客户端尽可能通过Cache和消息通知机制来减少与服务器之间不必要的信息沟通,来减轻服务器负担

数据更新操作需要服务器Leader节点协同Slave节点通过ZAB协议(基本就是两阶段提交)进行全局广播来实现,因此随着Slave节点增加,性能是下降的。
数据读操作可以由任意服务器节点提供,如果不是Lead节点,读操作本身不保证数据是最新的,但是可以通过一个Sync(大概就是一个空的写操作)+read的模式来实现对最新数据的读取(由前述两条基本保证可推得)
Zookeeper自身文件系统维护在内存中,通过定期Snapshot和Log记录来实现灾难恢复
zookeeper对用户暴露简单的API接口,读写创建Znode数据节点,Znode节点分为普通节点和临时节点,零时节点当创建它的客户端连接结束/丢失以后会自动删除。API主要包括
Create : 创建node
Delete : 删除node
Exists : 判断node是否存在
get data : 读取node内存储的数据
set data : 向node写数据
get children : 获取一个node的子node列表
Sync : 等待数据更新的同步完成
适用领域
需要一个中心服务提供协同工作原语支持的分布式系统。能够将协同工作部分简单的剥离(或者添加)使用外部服务的场合。
细节
Snapshot创建时不Block数据更新操作,因此不保证精确再现zookepper某一个特定时间点的状态,不过由于串行化更新操作和数据更新的幂等特性,只要完整数量的LOG被顺序更新(可以重复),由非精确状态再现的Snapshot是可以恢复得到精确的最新状态的。
== 相关项目 ==
上下游项目
Hbase : 使用Zookeeper做Master选举等
Hadoop2.0 (YARN)
BookKeeper: Zookeeper内置项目,基于Zookeeper实现的一个Log记录系统
类似项目
chubby
== 相关文献 ==
项目主页
Paper 论文
ZooKeeper: Wait-freecoordination for Internet-scale systems
A simple totallyordered broadcast protocol
Zookeeper 快速理解的更多相关文章
- 【转】快速理解Kafka分布式消息队列框架
from:http://blog.csdn.net/colorant/article/details/12081909 快速理解Kafka分布式消息队列框架 标签: kafkamessage que ...
- Storm快速理解
转自:http://blog.csdn.net/colorant/article/details/8256039 更多云计算相关项目快速理解文档 http://blog.csdn.net/color ...
- Spark机器学习 Day2 快速理解机器学习
Spark机器学习 Day2 快速理解机器学习 有两个问题: 机器学习到底是什么. 大数据机器学习到底是什么. 机器学习到底是什么 人正常思维的过程是根据历史经验得出一定的规律,然后在当前情况下根据这 ...
- 快速理解web语义化
什么是Web语义化 Web语义化是指使用恰当语义的html标签.class类名等内容,让页面具有良好的结构与含义,从而让人和机器都能快速理解网页内容.语义化的web页面一方面可以让机器在更少的人类干预 ...
- zookeeper快速入门
一.zookeeper简介 zookeeper 是apache旗下的hadoop子项目,它一个开源的,分布式的服务协调器.同样通过zookeeper可以实现服务间的同步与配置维护.通常情况下,在分布式 ...
- 快速理解高性能HTTP服务端的负载均衡技术原理(转)
1.前言 在一个典型的高并发.大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此 ...
- 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)
本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...
- 字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享. 1.引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料. 这个问题比我想象 ...
- [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!
十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...
随机推荐
- Mac 设置环境变量
前天配置好了SVN,这里赞下Versions,确实好用! CO了淘宝的TAE,跑startServer.sh时报错: JAVA_HOME does not point at a JDK or JRE. ...
- Subclipse和TortoiseSVN版本不一致导致升到高版本的project后,低版本svn客户端无法使用。
- 【Unity】7.1 Input类的方法和变量
分类:Unity.C#.VS2015 创建日期:2016-04-21 一.简介 在Input类中,Key与物理按键对应,例如键盘.鼠标.摇杆上的按键,其映射关系无法改变,程序员可以通过按键名称或者按键 ...
- 【iOS XMPP】使用XMPPFramewok(五):好友列表
转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/17/3082226.html 好友列表 好友列表,在 XMPP 中被称为 roster,花名 ...
- python 三元表达式 if for 构建List 进阶用法
1.简单的for...[if]...语句 Python中,for...[if]...语句一种简洁的构建List的方法,从for给定的List中选择出满足if条件的元素组成新的List,其中if是可以省 ...
- 【Windows】windows核心编程整理(下)
windows核心编程整理(上) windows核心编程整理(下) 线程的堆栈 每当创建一个线程时,系统就会为线程的堆栈(每个线程有他自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个以保 ...
- 【Ubuntu】服务器状态命令
序号 命令名称 命令 1 查看Ubuntu版本 cat /etc/issue2 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| s ...
- poj1988(判断一个结点下面有多少个结点,推荐)
题意:有n个元素,开始每个元素自己一栈,有两种操作,将含有元素x的栈放在含有y的栈的顶端,合并为一个栈.第二种操作是询问含有x元素下面有多少个元素. 6 M 1 6 C 1 M 2 4 M 2 6 C ...
- Liunx下Intel无线网卡驱动安装
原文: https://blog.csdn.net/u014157776/article/details/78272611 首先查看网卡型号,指令: lspci | grep -i net 如果是In ...
- 使用 Trace 将日志输入到文件中
工具没有好坏,只有适不适用.由于项目中用 Log4Net 过重,所以使用 Trace 代替了 Log4Net 输入一些简单的日志信息: 自定义监听文件 using System; using Syst ...