一、Zookeeper简介
Zookeeper是一个高效的分布式协调服务。它暴露了一些公用服务,比如:命名、配置、管理、同步控制、群组服务等(Zookeeper不适合用于存储大量数据,且其是动态实时监控)。Zookeeper可以实现比如:达成共识、集群管理、leader选举等。
Zookeeper是一个高可用的分布式管理与协调框架,基于ZAB协议(原子消息广播协议,所以Zookeeper的节点最好是奇数个)的实现。该框架能够很好地保证分布式环境中的数据一致性。也正是基于这样的特性,是的Zookeeper成为了解决分布式一致性问题的利器。
注:
1、zookeeper选举算法简单了解:https://blog.csdn.net/mweibiao/article/details/80916765
2、一致性问题:
顺序一致性:从一个客户端发起的事务请求,最终将会严格按照其发起的顺序被应用到Zookeeper中去;
此处应当了解一下paxos算法:Paxos算法细节详解(一)--通过现实世界描述算法
https://www.cnblogs.com/endsock/p/3480093.html
原子性:所有事物请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群所有的机器都成功应用了某一事物,要么整个集群所有的机器都没有应用该事物;
单一视图:无论客户端连接的是哪一个Zookeeper服务器,其看到的服务器端数据模型都是一致的;
可靠性:一旦服务器成功的应用了一个事务,并完成对客户端的响应,那么该事物所引起的服务器端状态都将会被一致保留下来,除非有另一个事务对其进行了更改;
实时性:通常所说的实时性就是指一旦事务被成功应用,那么客户端就能立刻从服务器上获取变更后的新数据,Zookeeper仅仅能保证在一段时间内,客户端最终一定能从服务器端读取最新的数据状态。
二、Zookeeper设计目标
1、简单的数据结构。Zookeeper以简单树形结构来进行相互协调(也叫树形名字空间)。
2、可以构建集群。一般Zookeeper集群通常由一组机器构成(3-5台机器即可)。只要集群中超过半数以上的机器能够正常工作,name整个集群就能够正常对外提供服务。
3、顺序访问。对于来自每一个客户端的每一个请求,Zookeeper都会分配一个全局唯一的递增编号,这个编号反应了所有事物操作的先后顺序,应用程序可以使用Zookeeper这个特性来实现更高层次的同步。
4、高性能。Zookeeper将全部数据存储在内存中并直接服务于所有的非事务请求,因此其有其在读操作的应用场景中性能非常突出。
三、Zookeeper的结构
Zookeeper维护着一个具有层次关系的数据结构,非常类似于一个标准的文件系统。如图:
四、Zookeeper的数据模型
1、每个子目录项如NameService都被成为znode,这个znode是其所在路径的唯一标识。
2、zonde可以有子节点目录,并且每个znode都可以存储数据,注意临时节点目录不要有子节点目录。
3、znode是有版本的,每个znode中存储的数据可以有多个版本,即一个访问路径可以存储多份数据。
4、znode的临时节点。一旦创建这个节点的客户端与服务器失去联系,这个节点也将自动删除。Zookeeper的客户端与服务器采用长连接方式,客户端和服务器之间通过心跳来保持连接,这个连接状态被称为session,session失效了,临时节点也就被删掉了。
5、znode的目录名可以自动编号,如APP1已经存在,再次创建时节点名将会自动命名为APP2。
6、znode可以被监控,包括这个目录节点中存储的数据的修改、子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是Zookeeper的核心特性。
备注:
Zookeeper的节点类型(CreateMode):
* EPHEMERAL The znode will be deleted upon the client's disconnect.
* EPHEMERAL_SEQUENTIAL The znode will be deleted upon the client's disconnect, and its name will be appended with a monotonically increasing number.
* PERSISTENT The znode will not be automatically deleted upon client's disconnect.
* PERSISTENT_SEQUENTIAL The znode will not be automatically deleted upon client's disconnect, and its name will be appended with a monotonically increasing number.
五、Zookeeper组成
Zookeeper根据其身份特性分为三种:Leader、Follower、Observer,其中Follower和Observer又统称为Learner(学习者)。
Leader:负责客户端的writer类型请求;
Follower:负责客户端的reader类型请求,参与leader选举等;
Observer:特殊的“Follower”,可以接收reader类型请求,但不能参与选举。(扩容系统支撑能力,提高读取速度,不接收任何同步类型的写入请求,只负责与leader同步数据)
六、Zookeeper应用场景选择
1、配置管理:适合数据量比较小,数据内容在运行时动态发生变化,集群中各个节点信息共享、配置一致;
2、集群管理:希望知道当前集群中究竟有多少及其工作,对集群中每天集群的运行时状态进行数据收集,对集群中每台集群进行上下线操作;
3、发布与订阅;
4、数据库切换;
5、分布式日志收集;
6、分布式场景下高可用;