ZooKeeper学习第六期—ZooKeeper机制架构

2024-04-02 06:18

本文主要是介绍ZooKeeper学习第六期—ZooKeeper机制架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ZooKeeper学习第六期—ZooKeeper机制架构

一、ZooKeeper权限管理机制 

1.1 权限管理ACL(Access Control List) 

ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制。ACL的实现和Unix文件访问许可非常相似:它使用许可位来对一个节点的不同操作进行允许或禁止的权限控制。但是和标准的Unix许可不同的是,Zookeeper对于用户类别的区分,不止局限于所有者(owner)、组 (group)、所有人(world)三个级别。Zookeeper中,数据节点没有”所有者”的概念。访问者利用id标识自己的身份,并获得与之相应的不同的访问权限。

ZooKeeper 的权限管理通过Server、Client 两端协调完成:

(1) Server端

一个ZooKeeper 的节点存储两部分内容:数据状态,状态中包含ACL 信息。创建一个znode 会产生一个ACL 列表,列表中每个ACL 包括:

权限perms

验证模式scheme

具体内容expression:Ids

例如,当scheme=”digest” 时, Ids 为用户名密码, 即”root :J0sTy9BCUKubtK1y8pkbL7qoxSw”。ZooKeeper 提供了如下几种验证模式:

① Digest: Client 端由用户名和密码验证,譬如user:pwd

② Host: Client 端由主机名验证,譬如localhost

③ Ip:Client 端由IP 地址验证,譬如172.2.0.0/24

④ World :固定用户为anyone,为所有Client 端开放权限

当会话建立的时候,客户端将会进行自我验证。

权限许可集合如下:

① Create 允许对子节点Create 操作

Read 允许对本节点GetChildren 和GetData 操作

Write 允许对本节点SetData 操作

Delete 允许对子节点Delete 操作

Admin 允许对本节点setAcl 操作

另外,ZooKeeper Java API支持三种标准的用户权限,它们分别为:

ZOO_PEN_ACL_UNSAFE:对于所有的ACL来说都是完全开放的,任何应用程序可以在节点上执行任何操作,比如创建、列出并删除子节点。
ZOO_READ_ACL_UNSAFE:对于任意的应用程序来说,仅仅具有读权限。
ZOO_CREATOR_ALL_ACL:授予节点创建者所有权限。需要注意的是,设置此权限之前,创建者必须已经通了服务器的认证。

Znode ACL 权限用一个int 型数字perms 表示,perms 的5 个二进制位分别表示setacl、delete、create、write、read。比如adcwr=0x1f,—-r=0x1,a-c-r=0x15。

注意的是,exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。

(2) 客户端

Client 通过调用addAuthInfo()函数设置当前会话的Author信息针对Digest 验证模式。Server 收到Client 发送的操作请求除exists、getAcl 之外,需要进行ACL 验证:对该请求携带的Author 明文信息加密,并与目标节点的ACL 信息进行比较,如果匹配则具有相应的权限,否则请求被Server 拒绝。

下面演示一个通过digest(用户名:密码的方式)为创建的节点设置ACL的例子,代码如下:

  1. import org.apache.Zookeeper.*;
  2. import org.apache.Zookeeper.server.auth.DigestAuthenticationProvider;
  3. import org.apache.Zookeeper.data.*;
  4. import java.util.*;
  5. public class NewDigest {
  6. public static void main(String[] args) throws Exception {//new 一个 acl
  7. List<ACL> acls = new ArrayList<ACL>();
  8. //添加第一个id,采用用户名密码形式
  9. Id id1 = new Id(“digest“,DigestAuthenticationProvider.generateDigest(“admin:admin“));
  10. ACL acl1 = new ACL(ZooDefs.Perms.ALL, id1);
  11. acls.add(acl1);
  12. // 添加第二个 id,所有用户可读权限
  13. Id id2 = new Id(“world“, “anyone“);
  14. ACL acl2 = new ACL(ZooDefs.Perms.READ, id2);
  15. acls.add(acl2);
  16. // Zk 用 admin认证,创建/test ZNode。
  17. ZooKeeper Zk = new ZooKeeper(“host1:2181,host2:2181,host3:2181“,2000, null);
  18. Zk.addAuthInfo(“digest“, “admin:admin“.getBytes());
  19. Zk.create(“/test“, “data“.getBytes(), acls, CreateMode.PERSISTENT);
  20. }
  21. }

1.2 ZooKeeper SuperDigest

(1) 一次Client 对Znode 进行操作的验证ACL 的方式为:

a) 遍历znode的所有ACL:

对于每一个ACL,首先操作类型与权限(perms)匹配

只有匹配权限成功才进行session 的auth 信息与ACL 的用户名、密码匹配

b) 如果两次匹配都成功,则允许操作;否则,返回权限不够error(rc=-102)

(2) 如果Znode ACL List 中任何一个ACL 都没有setAcl 权限,那么就算superDigest 也修改不了它的权限;再假如这个Znode 还不开放delete 权限,那么它的所有子节点都将不会被删除。唯一的办法是通过手动删除snapshot 和log 的方法,将ZK 回滚到一个以前的状态,然后重启,当然这会影响到该znode 以外其它节点的正常应用。

(3) superDigest 设置的步骤:

启动ZK 的时候( zkServer.sh ) , 加入参数: Java”-Dzookeeper .DigestAuthenticationProvider.superDigest=super:D/InIHSb7yEEbrWz8b9l71RjZJU=”(无空格)。

在客户端使用的时候, addAuthInfo(“digest”, “super:test”, 10, 0, 0); ” super:test” 为”super:D/InIHSb7yEEbrWz8b9l71RjZJU=”的明文表示,加密算法同setAcl。

二、 Watch机制

Zookeeper客户端在数据节点上设置监视,则当数据节点发生变化时,客户端会收到提醒。ZooKeeper中的各种读请求,如getDate(),getChildren(),和exists(),都可以选择加”监视点”(watch)。”监视点”指的是一种一次性的触发器(trigger),当受监视的数据发生变化时,该触发器会通知客户端。

(1) 监视机制有三个关键点:

“监视点”是一次性的,当触发过一次之后,除非重新设置,新的数据变化不会提醒客户端。

“监视点”将数据改变的通知客户端。如果数据改变是客户端A引起的,不能保证”监视点”通知事件会在引发数据修改的函数返回前到达客户端A

对于”监视点”,ZooKeeper有如下保证:客户端一定是在接收到“监视”事件(watch event)之后才接收到数据的改变信息。

(2)监视点”保留在ZooKeeper服务器上,则当客户端连接到新的ZooKeeper服务器上时,所有需要被触发的相关”监视点”都会被触发。当客户端断线后重连,与它的相关的”监视点”都会自动重新注册,这对客户端来说是透明的。在以下情况,”监视点”会被错过:客户端B设置了关于节点A存在性的”监视点”,但B断线了,在B断线过程中节点A被创建又被删除。此时,B再连线后不知道A节点曾经被创建过。

(3) ZooKeeper的”监视”机制保证以下几点:

“监视”事件的触发顺序和事件的分发顺序一致。

客户端将先接收到”监视”事件,然后才收到新的数据

“监视”事件触发的顺序与ZooKeeper服务器上数据变化的顺序一致

(4) 关于ZooKeeper”监视”机制的注意点:

“监视点”是一次性的。

由于”监视点”是一次性的,而且,从接收到”监视”事件到设置新”监视点”是有延时的,所以客户端可能监控不到数据的所有变化。

一个监控对象,只会被相关的通知触发一次。如果一个客户端设置了关于某个数据点exists和getData的监控,则当该数据被删除的时候,只会触发”文件被删除”的

通知。

当客户端断开与服务器的连接时,客户端不再能收到”监视”事件,直到重新获得连接。所以关于Session的信息将被发送给所有ZooKeeper服务器。由于当连接断开时收不到”监视”,所以在这种情况下,模块行为需要容错方面的设计。

三、Session机制

3.1 会话概述

每个ZooKeeper客户端的配置中都包括集合体中服务器的列表。在启动时,客户端会尝试连接到列表中的一台服务器。如果连接失败,它会尝试连接另一台服务器,以此类推,直到成功与一台服务器建立连接或因为所有ZooKeeper服务器都不可用而失败。

图 3.1 ZooKeeper体系结构

一旦客户端与一台ZooKeeper服务器建立连接,这台服务器就会为该客户端创建一个新的会话。每个会话都会有一个超时的时间设置,这个设置由创建会话的应用来设定。如果服务器在超时时间段内没有收到任何请求,则相应的会话会过期。一旦一个会话已经过期,就无法重新打开,并且任何与该会话相关联的短暂znode都会丢失。会话通常长期存在,而且会话过期是一种比较罕见的事件,但对应用来说,如何处理会话过期仍是非常重要的。

只要一个会话空闲超过一定时间,都可以通过客户端发送ping请求(也称为心跳)保持会话不过期。ping请求由ZooKeeper的客户端库自动发送,因此在我们的代码中不需要考虑如何维护会话。这个时间长度的设置应当足够低,以便能档检测出服务器故障(由读超时体现),并且能够在会话超时的时间段内重新莲接到另外一台服务器。

3.2 故障切换

ZooKeeper客户端可以自动地进行故障切换,切换至另一台ZooKeeper服务器。并且关键的一点是,在另一台服务器接替故障服务器之后,所有的会话和相关的短暂Znode仍然是有效的。在故障切换过程中,应用程序将收到断开连接和连接至服务的通知。当客户端断开连接时,观察通知将无法发送;但是当客户端成功恢复连接后,这些延迟的通知会被发送。当然,在客户端重新连接至另一台服务器的过程中,如果应用程序试图执行一个操作,这个操作将会失败。这充分体现了在真实的ZooKeeper应用中处理连接丢失异常的重要性。

四、ZooKeeper实例状态

(1) ZooKeeper状态

ZooKeeper对象在其生命周期中会经历几种不同的状态。你可以在任何时刻通过getState()方法来查询对象的状态:

public States getState()

States被定义成代表ZooKeeper对象不同状态的枚举类型值(不管是什么枚举值,一个ZooKeeper的实例在一个时刻只能处于一种状态)。在试图与ZooKeeper服务建立连接的过程中,一个新建的ZooKeeper实例处于CONNECTING状态。一旦建立连接,它就会进入CONNECTED状态。 

图 3.2 ZooKeeper状态转换

通过注册观察对象,使用了ZooKeeper对象的客户端可以收到状态转换通知。在进入CONNECTED状态时,观察对象会收到一个WatchedEvent通知,其中KeeperState的值是SyncConnected。

(2) Watch与ZooKeeper状态

ZooKeeper的观察对象肩负着双重责任:

可以用来获得ZooKeeper状态变化的相关通知;

可以用来获得Znode变化的相关通知。

监视ZooKeeper状态变化:可以使用ZooKeeper对象默认构造函数的观察。

监视Znode变化:可以使用一个专用的观察对象,将其传递给适当的读操作。也可以通过读操作中的布尔标识来设定是否共享使用默认的观察。

ZooKeeper实例可能失去或重新连接ZooKeeper服务,在CONNECTED和CONNECTING状态中切换。如果连接断开,watcher得到一个Disconnected事件。学要注意的是,这些状态的迁移是由ZooKeeper实例自己发起的,如果连接断开他将自动尝试自动连接。

如果任何一个close()方法被调用,或是会话由Expired类型的KeepState提示过期时,ZooKeeper可能会转变成第三种状态CLOSED。一旦处于CLOSED状态,ZooKeeper对象将不再是活动的了(可以使用states的isActive()方法进行测试),而且不能被重用。客户端必须建立一个新的ZooKeeper实例才能重新连接到ZooKeeper服务。

本文作者:Sunddenly(⊙_⊙)
本文转载自:http://www.cnblogs.com/sunddenly/p/4143306.html。我是【thver】。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

这篇关于ZooKeeper学习第六期—ZooKeeper机制架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869200

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss