前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Zookeeper

Zookeeper

作者头像
挽风
发布2023-10-17 15:43:46
2720
发布2023-10-17 15:43:46
举报
文章被收录于专栏:小道小道

Zookeeper是基于观察者模式的分布式服务管理框架。

Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题。ZooKeeper提供的服务包括:分布式消息同步和协调机制、服务器节点动态上下线、统一配置管理、负载均衡、集群管理等。

  ZooKeeper提供基于类似于Linux文件系统的目录节点树方式的数据存储,即分层命名空间。Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化,通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,ZooKeeper节点的数据上限是1MB。

  我们可以认为Zookeeper=文件系统+通知机制

  对于ZooKeeper的数据结构,每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1;

  znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录(因为它是临时节点);

  znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据;

  znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了;

  znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2;

  znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的。

ZooKeeper的部署方式有单机模式和集群模式,集群中的角色有Leader和Follower,集群最少3(2N+1)台,根据选举算法,应保证奇数。对于ZooKeeper集群,过半存活即可使用。

1 ZooKeeper的选举机制

  假设有五台服务器组成的zookeeper集群,它们的myid配置文件为从1到5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的,假设这些服务器依序启动:

在这里插入图片描述
在这里插入图片描述

(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是LOOKING状态。

(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。

(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的Leader,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。

(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它成为Follower。

(5)服务器5启动,同4一样成为Follower。

注意,如果按照5,4,3,2,1的顺序启动,那么5将成为Leader,因为在满足半数条件后,ZooKeeper集群启动,5的Id最大,被选举为Leader。

2 客户端对ZooKeeper的ServerList的轮询机制

  客户端在初始化( new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) )的过程中,将所有Server保存在一个List中,然后随机打散,形成一个环。之后从0号位开始一个一个使用。

两个注意点:

Server地址能够重复配置,这样能够弥补客户端无法设置Server权重的缺陷,但是也会加大风险。(比如:192.168.1.1:2181,192.168.1.1:2181,192.168.1.2:2181).

如果客户端在进行Server切换过程中耗时过长,那么将会收到SESSION_EXPIRED. 这也是上面第1点中的加大风险之处。

3 客户端如何正确处理CONNECTIONLOSS(连接断开) 和 SESSIONEXPIRED(Session 过期)两类连接异常?

  在ZooKeeper中,服务器和客户端之间维持的是一个长连接,在SESSION_TIMEOUT 时间内,服务器会确定客户端是否正常连接(客户端会定时向服务器发送heart_beat),服务器重置下次SESSION_TIMEOUT时间。

  因此,在正常情况下,Session一直有效,并且zk集群所有机器上都保存这个Session信息。在出现问题的情况下,客户端与服务器之间连接断了(客户端所连接的那台zk机器挂了,或是其它原因的网络闪断),这个时候客户端会主动在地址列表(初始化的时候传入构造方法的那个参数connectString)中选择新的地址进行连接。

  以上即为服务器与客户端之间维持长连接的过程,在这个过程中,用户可能会看到两类异常CONNECTIONLOSS(连接断开) 和SESSIONEXPIRED(Session 过期)。

发生CONNECTIONLOSS后,此时用户不需要关心我的会话是否可用,应用所要做的就是等待客户端帮我们自动连接上新的zk机器,一旦成功连接上新的zk机器后,确认之前的操作是否执行成功了。

4 一个客户端修改了某个节点的数据,其他客户端能够马上获取到这个最新数据吗?

ZooKeeper不能确保任何客户端能够获取(即Read Request)到一样的数据,除非客户端自己要求,方法是客户端在获取数据之前调用sync()方法。

  通常情况下(这里所说的通常情况满足:1. 对获取的数据是否是最新版本不敏感,2. 一个客户端修改了数据,其它客户端是否需要立即能够获取最新数据)可以不关心这点。

  在其它情况下,最清晰的场景是这样:ZK客户端A对 /my_test 的内容从 v1->v2, 但是ZK客户端B对 /my_test 的内容获取,依然得到的是 v1. 请注意,这个是实际存在的现象,当然延时很短。解决的方法是客户端B先调用 sync(), 再调用 getData()。

5 ZooKeeper对节点的watch监听是永久的吗?为什么?

  不是。

  官方声明:一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。常见的监听有监听数据的变化和监听增减的变化。

  为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,这太消耗性能了。

  一般是客户端执行getData(“/节点A”,true),如果节点A发生了变更或删除,客户端会得到它的watch事件,但是在之后节点A又发生了变更,而客户端又没有设置watch事件,就不再给客户端发送。

  在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。

  使用watch需要注意的几点:

  ① Watches通知是一次性的,必须重复注册.

  ② 发生CONNECTIONLOSS之后,只要在session_timeout之内再次连接上(即不发生SESSIONEXPIRED),那么这个连接注册的watches依然在。

  ③ 节点数据的版本变化会触发NodeDataChanged,注意,这里特意说明了是版本变化。存在这样的情况,只要成功执行了setData()方法,无论内容是否和之前一致,都会触发NodeDataChanged。

  ④ 对某个节点注册了watch,但是节点被删除了,那么注册在这个节点上的watches都会被移除。

  ⑤ 同一个zk客户端对某一个节点注册相同的watch,只会收到一次通知。

  ⑥ Watcher对象只会保存在客户端,不会传递到服务端。

6 能否为临时节点创建子节点?

  ZooKeeper中不能为临时节点创建子节点,如果需要创建子节点,应该将要创建子节点的节点创建为永久性节点。

7 是否可以拒绝单个IP对ZooKeeper的访问?如何实现?

  ZK本身不提供这样的功能,它仅仅提供了对单个IP的连接数的限制。你可以通过修改iptables来实现对单个ip的限制。

8 创建的临时节点什么时候会被删除,是连接一断就删除吗?延时是多少?

  连接断了之后,ZK不会马上移除临时数据,只有当SESSIONEXPIRED之后,才会把这个会话建立的临时数据移除。因此,用户需要谨慎设置Session_TimeOut。

9 ZooKeeper集群中服务器之间是怎样通信的?

Leader服务器会和每一个Follower/Observer服务器都建立TCP连接,同时为每个F/O都创建一个叫做LearnerHandler的实体。

  LearnerHandler主要负责Leader和F/O之间的网络通讯,包括数据同步,请求转发和Proposal提议的投票等。Leader服务器保存了所有F/O的LearnerHandler。

10 ZooKeeper节点类型?

10.1 Znode有两种类型:

短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除 。

持久(persistent):客户端和服务器端断开连接后,创建的节点不删除 。

10.2 Znode有四种形式的目录节点(默认是persistent )

(1)持久化目录节点(PERSISTENT)

  客户端与zookeeper断开连接后,该节点依旧存在 。

(2)持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)

  客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 。

(3)临时目录节点(EPHEMERAL)

  客户端与zookeeper断开连接后,该节点被删除 。

(4)临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)

  客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号。

11 ZooKeeper使用到的各个端口的作用?

  2888:Follower与Leader交换信息的端口。

  3888:万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

12 ZooKeeper使用的ZAB协议与Paxo算法的异同?

  Paxos算法是分布式选举算法,Zookeeper使用的 ZAB协议(Zookeeper原子广播),两者的异同如下:

① 相同之处:

  比如都有一个Leader,用来协调N个Follower的运行;Leader要等待超半数的Follower做出正确反馈之后才进行提案;二者都有一个值来代表Leader的周期。

② 不同之处:

  ZAB用来构建高可用的分布式数据主备系统(Zookeeper),Paxos是用来构建分布式一致性状态机系统。

13 ZooKeeper对事务性的支持?

  ZooKeeper对于事务性的支持主要依赖于四个函数,zoo_create_op_init, zoo_delete_op_init, zoo_set_op_init以及zoo_check_op_init。每一个函数都会在客户端初始化一个operation,客户端程序有义务保留这些operations。当准备好一个事务中的所有操作后,可以使用zoo_multi来提交所有的操作,由zookeeper服务来保证这一系列操作的原子性。也就是说只要其中有一个操作失败了,相当于此次提交的任何一个操作都没有对服务端的数据造成影响。Zoo_multi的返回值是第一个失败操作的状态信号。

14 讲一讲什么是CAP法则?Zookeeper符合了这个法则的哪两个?(扩展)

在这里插入图片描述
在这里插入图片描述

15 Follower和Leader状态同步

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 ZooKeeper的选举机制
  • 2 客户端对ZooKeeper的ServerList的轮询机制
  • 3 客户端如何正确处理CONNECTIONLOSS(连接断开) 和 SESSIONEXPIRED(Session 过期)两类连接异常?
  • 4 一个客户端修改了某个节点的数据,其他客户端能够马上获取到这个最新数据吗?
  • 5 ZooKeeper对节点的watch监听是永久的吗?为什么?
  • 6 能否为临时节点创建子节点?
  • 7 是否可以拒绝单个IP对ZooKeeper的访问?如何实现?
  • 8 创建的临时节点什么时候会被删除,是连接一断就删除吗?延时是多少?
  • 9 ZooKeeper集群中服务器之间是怎样通信的?
  • 10 ZooKeeper节点类型?
    • 10.1 Znode有两种类型:
      • 10.2 Znode有四种形式的目录节点(默认是persistent )
      • 11 ZooKeeper使用到的各个端口的作用?
      • 12 ZooKeeper使用的ZAB协议与Paxo算法的异同?
      • 13 ZooKeeper对事务性的支持?
      • 14 讲一讲什么是CAP法则?Zookeeper符合了这个法则的哪两个?(扩展)
      • 15 Follower和Leader状态同步
      相关产品与服务
      负载均衡
      负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档