一.Zookeeper是什么?
Zookeeper是一个开源的分布式协调服务,其致力于分布式数据一致性解决方案。因此,分布式应用程序可以基于zookeeper实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、master选举、分布式锁和分布式队列等功能。
Zookeeper也可以作用于服务生产者和服务消费者的注册中心,即服务生产者可以将服务注册到zookeeper中心,服务消费者在调用服务的时候会先到zookeeper中心查找服务,获取到服务生产者的详细信息后,再调用服务生产者的数据。
二.zookeeper概念
2.1 读在前面
Zookeeper本身就是一个分布式程序,所以只要半数的节点存活,那么zookeeper就能正常提供服务。
为了保证高可用,需要以集群的形式来部署zookeeper,这样即使某台机器发生故障,zookeeper也是可用的。
Zookeeper将数据保存在内存中,这样可以保证高吞吐和低延迟。
Zookeeper的高性能体现在"读",由于"写"存在服务器间数据及状态的同步,因此"写"性能低于"读"性能。
Zookeeper存在临时节点的概念,当创建临时节点的客户端会话一直保持活动,则临时节点就会一直存在,而当会话终结后,临时节点则会被删除。
持久节点一旦被创建,除非主动执行节点(ZNode)的移除操作,否则这个节点将一直保存在zookeeper上。
Zookeeper提供了以下功能,一是存储、读取用户程序提交的数据,二是为用户程序提交数据节点监听服务。
2.2 会话(Session)
Session指的是zookeeper服务器与客户端会话。在zookeeper中,一个客户端连接是指客户端和服务端之间的一个TCP长连接。
客户端启动的时候,首先会与zookeeper服务器建立一个tcp长连接,从第一次连接建立开始,客户端会话的生命周期也开始。通过这个连接,客户端能够通过心跳机制与服务器保持有效的会话,也能够向zookeeper服务器发送请求病接收响应,同时还能够通过该连接接收来自服务器的watch事件通知。
SessionTimeout值用来设置客户端会话的超时时间,当由于服务器压力过大、网络故障或客户端主动断开连接等各种原因所导致客户端连接断开的,只要在sessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,则之前创建的会话仍然有效。
在为客户端创建会话前,服务端会为每个客户端都分配一个全局唯一的sessionID,此sessionID是zookeeper会话的重要标识,许多与会话相关的运行机制都是基于此的。
2.3 ZNode
在zookeeper中,节点可以分为两类,一是构成集群的机器,称之为机器节点,二是数据模型中的数据单元,称之为数据节点(ZNode)。
Zookeeper将所有数据存储内存中,数据模型是一棵树(Znode Tree),其是由斜杠(/)进行分割的路径,如/foo/path就是一个Znode。每个Znode都会保存自己的数据内容,同时还会保存一系列属性信息。
Zookeeper还允许用户为每个节点添加一个特殊的属性:SEQUENTIAL,一旦节点被标记上这个属性,那么在这个节点被创建的时候,zookeeper会自动在其节点名后面追加一个整型数字,这个整型数字是一个由父节点维护的自增数字。
2.4 version
对于每个ZNode,zookeeper都会维护一个stat的数据结构
Stat记录ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)、aversion(当前ZNode的ACL版本)
2.5 Watcher(事件监听器)
Zookeeper允许用户在指定节点上注册一些watcher,并且在一些特定事件触发的时候,zookeeper服务端会将事件通知到感兴趣的客户端去,该机制是zookeeper实现分布式协调服务的重要特性。
2.6 ACL(AccessControlLists)
zookeeper采用ACL(AccessControlLists)策略来进行权限控制。
CREATE:创建子节点的权限(针对子节点)
READ:获取节点数据和子节点列表的权限
WRITE:更新节点数据的权限
DELETE:删除子节点的权限(针对子节点)
ADMIN:设置节点ACL的权限
2.7 zookeeper特性
顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到zookeeper中。
原子性:所有事务请求的处理结果在整个集群中的所有机器上的应用情况是一致的,要么整个集群中所有的机器都成功应用了某个事务,要么都没有应用。
单一系统映像:无论客户端连到哪个zookeeper服务器上,其看到的服务端数据模型都是一致的。
可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
三.zookeeper设计目标
3.1 简单的数据模型
命名空间由Znode组成,类似于文件和目录。
3.2 构建集群
客户端在使用zookeeper时,需要知道集群中机器列表,通过与集群中的某一台机器建立TCP连接来使用服务。
客户端使用这个TCP连接来发送请求、获取结果、获取监听事件以及发送心跳包,如果这个连接异常断开了,那么客户端就可以连接到另一个机器上。
上图中每一个 Server 代表一个安装 ZooKeeper 服务的服务器。组成 ZooKeeper 服务的服务器都会在内存中维护当前的服务器状态,并且每台服务器之间都互相保持着通信。
集群间通过 Zab 协议(Zookeeper Atomic Broadcast)来保持数据的一致性。
3.3 顺序访问
对于来自客户端的每个更新请求,ZooKeeper 都会分配一个全局唯一的递增编号。
这个编号反应了所有事务操作的先后顺序,应用程序可以使用 ZooKeeper 这个特性来实现更高层次的同步原语。这个编号也叫做时间戳—zxid(ZooKeeper Transaction Id)。
四.zookeeper集群角色
Zookeeper集群角色可分为Leader、Follower、Observer
Follower和Observer唯一的区别在于Observer机器不参与Leader的选举过程,也不参与写操作的"过半写成功"策略,因此,Observer机器可以在不影响写性能的情况下提升集群的读性能。
Leader(领导者),负责进行投票的发起和决议,更新系统状态
Follower(跟随者),用于接收客户请求并向客户端返回结果,在选主过程中参与投票
Observer(观察者),接收客户端连接,将写请求转发给Leader节点,但不参与选主的投票,只同步Leader的数据状态。
您的关注是我的持续动力,咱们下期再见bye~
本文暂时没有评论,来添加一个吧(●'◡'●)