0


[1] zookeeper基础知识

文章目录

Zookeeper

Zookeeper是一个分布式协调服务,实现同步服务,配置维护和命名服务等分布式应用。它公开了一组简单的原语,分布式应用程序可以基于这些原语实现更高级别同步、配置维护、组和命名服务。使用类似于目录树状结构的数据模型。
zookeeper = 文件系统+监听通知机制。

1. 设计目标

  • 简单数据模型:Zookeeper允许分布式进程通过共享的分层命名空间相互协调,该命名空间的组织方式类似于标准文件系统。分层命名空间就是znodes,Zookeeper的数据保存在内存中,以此提高服务器吞吐、减少延迟的目的。
  • 可以构建集群:Zookeeper可被复制,组成zookeeper服务的服务器必须相互了解。它们维护在内存中状态,以及持久存储事务日志和快照,每台机器之间都互相保持着通信。只要大多数服务器可用,zookeeper服务就可用。 客户端和服务器通过tcp连接。
  • zookeeper是有序的:zookeeper采用反映所有事务的顺序的id(全局唯一递增)标记每个更新。
  • zookeeper速度很快:它在读取为主的工作负载中尤其的快。zookeeper在读写比率10:1的情况下表现最佳。

2. CAP理论

分布式系统,分区容错性是一个必须考虑的关键点。一旦分布式系统丧失分区容错性,也就代表放弃了拓展性。大部分分布式系统都会保证在分区容错性的前提下在一致性和可用性做权衡。

Zookeeper是一个CP(一致性+分区容错性)的,它的职责是保证数据在其管辖下的所有服务之间保持同步、一致。
ZooKeeper的核心实现算法Zab,就是解决了分布式系统下数据如何在多个服务之间保持同步问题的。

主要特点:

  • 顺序一致性:来自客户端的更新将按照它们发送的顺序应用。
  • 可靠性:应用更新后,它将从能够那时起持续存在,直到客户端覆盖更新。
  • 及时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要更新最新的数据,应该在读数据之前调用sync接口。(调用sync接口可以保证从机和主机进行同步,读取最新的消息)。
  • 原子性:更新只能成功或者失败,没有中间状态。
  • 单一系统映像:客户端将看到相同的服务视图,而不管它连接到的服务器如何。即使客户端故障转移到其他相同会话不同服务器,客户端也永远不会看到系统的旧视图。

3. Zookeeper节点特性及节点属性分析

Zookeeper提供类似于文件系统的目录节点树方式的数据存储。它的作用主要是用来维护和监控存储数据的状态变化。通过监听这些数据状态的变化,从而可以达到基于数据的集群管理。

Zookeeper的数据节点称为ZNode,ZNode是Zookeeper中数据的最小单元。每个节点可以存储数据,同时可以挂载子节点。
Zookeeper创建节点时可以指定类型。
ZNode节点类型:

  • PERSISTENT:持久化ZNode节点,一旦创建这个ZNode点存储的数据不会主动消失,除非客户端主动删除。
  • EPHEMERAL:临时ZNode节点,Client连接到Zookeeper Service的时候创建一个Session,之后利用这个连接实例创建该类型的znode,一旦Client关闭Zookeeper连接服务器就会清除这个Session,然后Session创建的ZNode的节点就会从命名空间去除。
  • PERSISTENT_SEQUENTIAL:顺序自动编号的ZNode节点,这种znode节点会根据当前已经存在的ZNode节点编号自动加一,而且不会随着Session断开而消失。
  • EPHEMERAL_SEQUENTIAL:临时自动编号节点,ZNode节点编号会自动增加,但是 会随着Session消失。

Zookeeper的每个节点存储的数据需要原子性的操作,也就是读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。
znode维护一个统计结构,其中包括数据变更的版本号、acl变更和时间戳,以允许缓存验证和协调更新。每次znode的数据更改,版本号都会增加。当客户端检索数据时也会收到数据的版本号。

4. Watcher数据变更通知

客户端可以在znode上设置监视,当znode发生变化时,watch将被触发并移除。当watch被触发时,客户端会收到一个数据包,说明znode已更改。
3.6.0中:客户端可以在znode上设置永久的递归监视,这些监视在触发时不会被删除,并且以递归方式触发已注册znode以及任何子znode上的更改。

Zookeeper使用Watcher机制实现分布式数据的发布/订阅功能。
16386fa1da16f271_tplv-t2oaga2asx-zoom-in-crop-mark_3024_0_0_0.webp
Watcher机制:
Watcher机制主要包括客户端线程,客户端WatcherManager、Zookeeper服务器。客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager中。当Zookeeper服务器出发Watcher事件后,会向客户端发送一个通知(有且仅有一个),客户端线程从WatcherManager中取出对应的Watcher对象执行回调逻辑。

具体交互过程:

  • 客户端调用getData、getChildren等方法时,watch参数设置为true。服务器接到请求,返回节点数据,并且在对应的哈希表中插入被watch的Znode路径。
  • 当被watch的Znode已删除,服务端会查找hash表,找出该Znode对应的所有Watcher,异步通知客户端,然后删除哈希表中对应的key-value(一次性)。

监听事件:

  • NodeDataChanged:节点数据更改。get -w
  • NodeDeleted:节点被删除 get -w
  • NodeChildrenChanged:创建子节点/删除子节点 ls -w
  • NodeCreated :节点创建

zookeeper副本实现:

  • 节点和领导选举:多个服务器节点组成,其中一个被选举成领导者,其它的作为跟随着。领导者负责协调所有写操作,并确保所有的跟随着都有最新的数据。Zab协议。
  • 数据同步:领导者负责所有写操作。当领导者接收到写请求时,他会将请求发送给所有跟随者,并等待它们的确认。跟随者在接收到写请求后,会记录在本地,并向领导者发送确认。只有当超过半数的节点(包括领导者自己)确认后,写操作才被认为是成功的。
  • 读操作:可以由任何跟随者处理,无需进行协调。
  • 故障转移:如果一个跟随者失效,集群可以继续运行,只有超过半数节点可用,集群可以继续提供服务。如果领导者失效,剩余跟随者将立即开始新一轮选举,以选择新的领导者。在新领导者被选出之前,集群无法处理写操作。

如果想要确保读取的数据是最新的(强一致性),每次读取之前可以执行一次"空写操作"。或者显式调用sync.

标签: zookeeper 分布式

本文转载自: https://blog.csdn.net/2401_89097141/article/details/143989625
版权归原作者 2401_89097141 所有, 如有侵权,请联系我们删除。

“[1] zookeeper基础知识”的评论:

还没有评论