《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录

第四章 Zookeeper与Paxos

4.1 Zk是什么

4.1.1 Zk特性

4.1.2 Zk基本概念

4.1.2.1 集群角色(Follower, Leader, Observer)

4.1.2.2 数据模型

4.1.2.3 ZNode(数据节点)

4.1.2.4 Session(会话)

4.1.2.5 ACL(Access Control Lists)

4.1.2.6 Watcher(事件监听器)

4.2 ZAB协议

第七章 Zookeeper技术内幕

7.1 系统模型

7.1.1 数据模型

7.1.2 节点特性

7.1.2.1 节点分类

7.1.2.2 节点数据

7.1.3 版本——保证分布式数据原子性操作

7.1.4 Watcher——数据更变的通知

7.1.5 ACL——保障数据的安全

第四章 Zookeeper与Paxos

4.1 Zk是什么

  • 2010年11月正式成为 Apache 顶级项目

  • Zk是一个分布式数据一致性的解决方案,提供了高效且可靠的分布式协调服务。

    • 应用程序可以基于它实现诸如数据发布/订阅,负载均衡,统一命名服务,分布式协调通知,配置管理,分布式锁,分布式锁等分布式的基础服务(第六章会详细提及)

  • ZooKeeper 并没有直接采用 Paxos 算法,而是采用了名为 ZAB(Zookeeper Atomic Broadcast) 的一致性协议

4.1.1 Zk特性
  • 顺序一致性:所有客户端看到的服务端数据模型都是强一致的;从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到 ZooKeeper 中(可见下文,原子广播)

  • 原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,即整个集群要么都成功应用了某个事务,要么都没有应用(可见下文:事务)

  • 单一视图:无论客户端连接的是哪个 Zookeeper 服务器,其看到的服务端数据模型都是一致的

  • 高性能:ZooKeeper 将数据全量存储在内存中,所以其性能很高。需要注意的是:由于 ZooKeeper 的所有更新和删除都是基于事务的,因此 ZooKeeper 在读多写少的应用场景中有性能表现较好;如果写操作频繁,性能会大大下滑

  • 高可用:ZooKeeper 的高可用是基于副本机制实现的,此外 ZooKeeper 支持故障恢复(可见下文:选举 Leader)

4.1.2 Zk基本概念
4.1.2.1 集群角色(Follower, Leader, Observer)
  • 没有沿用Master / Slave概念,引入Follower, Leader, Observer三种角色

角色

职责

Leader

  • 读写:

    • 提供读写服务:只有Leader会处理集群中所有的写请求,保证数据的一致性

  • 负责维护着系统的最新状态,发起并维护与各 Follwer 及 Observer 间的心跳,并负责将状态变更同步给Follower和Observer节点

  • 所有的写操作必须要通过 Leader 完成再由 Leader 将写操作广播给其它服务器

  • 一个 Zookeeper 集群同一时间只会有一个实际工作的 Leader

Follower

  • 提供读服务;接受写请求,但不能直接处理,而需要将写请求转发给 Leader 处理

  • 响应 Leader 的心跳

  • 将写请求转发给 Leader 处理,并且负责在 Leader 处理写请求时对请求进行投票

  • 一个 Zookeeper 集群可能同时存在多个 Follower

Observer

  • 提供读服务;接受写请求,但不能直接处理,而需要将写请求转发给 Leader 处理

  • 响应 Leader 的心跳

  • 不参与投票

4.1.2.2 数据模型
  • ZooKeeper 的数据模型是一个树形结构的文件系统(ZNode Tree),树中的节点被称为 ZNode。每个节点上都可以保存数据,并挂上子节点

  • 模型的根节点为 /

  • 节点由斜杠(/)进行分割路径,例如/foo/path1

4.1.2.3 ZNode(数据节点)
  • ZNode 通过路径被引用,ZNode 节点路径必须是绝对路径

  • 每个ZNode上都会保存自己的数据内容,及一系列属性信息,大小被限制在 1MB 以内

  • ZNode 两种类型

    • 临时节点(EPHEMERAL):生命周期和客户端会话绑定,会话失效后,这个客户端创建的所有临时节点都会被删除

    • 持久节点(PERSISTENT):持久节点一旦被创立,除非客户端主动删除,否则会一直存在 ZooKeeper 上

  • ZNode 属性

    • SEQUENTIAL:ZNode 上还有一个特殊属性 (SEQUENTIAL,也称顺序标志)。如果在创建 ZNode 时,设置了SEQUENTIAL,那么 ZooKeeper 会使用计数器为该ZNode的节点名后面添加一个单调递增的整型数字(该数字由父节点维护),即 zxid。ZooKeeper 正是利用 zxid 实现了严格的顺序访问控制能力

    • Stat(版本):Zk为每个ZNode维护了一个叫Stat的数据结构,里面记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本),cversion(当前ZNode子节点的版本),aversion(当前ZNode的ACL版本)

4.1.2.4 Session(会话)
  • 在Zk中,客户端启动时,首先通过一个 TCP 长连接连接到 ZooKeeper 服务集群,端口默认2181

  • Session 从第一次连接开始就已经建立,之后客户端通过心跳检测机制来与服务端保持有效的会话状态。通过这个连接,客户端可以发送请求并接收响应,同时也可以接收到 Watch 事件的通知。

  • 一旦客户端与一台服务器建立连接,这台服务器会为这个客户端创建一个新的会话。每个会话都会有一个超时时间,若服务器在超时时间内没有收到任何请求,则相应会话被视为过期(这段时间内如果连回来了仍视为有效)一旦会话过期,就无法再重新打开,且任何与该会话相关的临时 ZNode 都会被删除

4.1.2.5 ACL(Access Control Lists)

ZooKeeper 采用 ACL策略来进行权限控制。Zk定义了5种权限,每个 ZNode 创建时都会带有一个 ACL 列表,用于决定谁可以对它执行何种操作

  • CREATE:允许创建其子节点

  • READ:允许从节点获取数据并列出其子节点

  • WRITE:允许为节点设置数据

  • DELETE:允许删除其子节点

  • ADMIN:允许为节点设置权限

ACL 依赖于 ZooKeeper 的客户端认证机制。ZooKeeper 提供了以下几种认证方式

  • digest: 用户名和密码 来识别客户端

  • sasl:通过 kerberos 来识别客户端

  • ip:通过 IP 来识别客户端

4.1.2.6 Watcher(事件监听器)
  • Watcher(事件监听器)是Zk的一个重要特性。Zk允许用户在指定ZNode上注册一些Watcher,并在特定事件触发时,Zk服务端会将事件通知到注册的客户端。该机制是Zk实现分布式协调服务的重要特性。

4.2 ZAB协议

全称Zookeeper Atomic Broadcast(原子消息广播协议),与Paxos算法类似。比较复杂,不赘述。


第七章 Zookeeper技术内幕

7.1 系统模型

7.1.1 数据模型
  • 树:ZooKeeper 的数据模型是一个树形结构的文件系统(ZNode Tree),树中的节点被称为 ZNode,每个节点上都可以保存数据,并挂上子节点

  • 事务ID

    • 在Zk中,事务是指能改变服务器状态的操作。包括节点创建,节点删除,节点内容更新,客户端会话创建,客户端会话失效

    • 对于每一个事务请求,Zk会为其分配一个全局事务ID,用ZXID表示,通常是64位数字。每一个ZXID对应一次更新操作,可以根据值识别出各个操作的执行顺序

7.1.2 节点特性
7.1.2.1 节点分类

在Zk中,节点类型可以分为三类:持久节点(P),临时节点(E),顺序节点(S)节点有以下特性

节点特性

备注

默认

持久(P) / 临时(S)

必选,二选一

持久(P)

顺序(S)

是 / 否

非顺序

具体在节点的创建过程中,通过组合使用,可以生成以下四种组合型节点类型

  • 持久节点(Persistent):被创建后一直存在于服务器上,直至被删除操作主动清除。最常见的节点。

  • 持久顺序节点(Persistent_Sequential):在创建节点时可以设置这个标记,则每个父节点会维护子节点的先后顺序。即在创建过程中,自动为节点加上一个数字后缀,作为节点名,上限是Integer.MAX

  • 临时节点(Ephemeral)

    • 临时节点的生命周期与客户端会话Session绑定在一起,会话失效,则节点被自动清理

    • Zk规定了不能基于临时节点来创建子节点,即临时节点只能是叶子节点

  • 临时顺序(Ephemeral_Sequential):在临时节点的基础上,添加了顺序的特性

7.1.2.2 节点数据

节点的存储包含两部分

  • 用户写入节点的数据内容

  • 节点自身的一些状态信息,这些状态信息存在Stat的结构体中,包括事务ID、版本信息、子节点个数

7.1.3 版本——保证分布式数据原子性操作
  • Zk为数据节点引入了版本的概念,Zk中version的含义是:对数据节点的数据内容、子节点列表、节点ACL信息的修改次数

    • 节点第一次创建时,version=0;对数据内容更变后,version=1

    • 需要注意的是,即使前后的数据内容没变,version依然会变,version强调的是更变次数

  • 每个节点状态中都有三类version,对节点的任何操作都会引起这三个版本号的变化

    • version:当前数据节点数据内容的修改次数

    • cversion:当前数据节点子节点的修改次数

    • aversion:当前数据节点ACL更变的修改次数

  • 设计version的意义:基于CAS乐观锁的思想进行更新

    • 从源码来看,request里会带上请求的version,Zk服务端处理request时会校验version

      • request中的version=-1:表示客户端不要求使用乐观锁,因此会忽略版本对比;

      • request中的version!=-1:表示客户端要基于乐观锁更新

        • Zk服务端会比较请求的version和当前节点的currentVersion,一致则更新,不一致就抛异常

7.1.4 Watcher——数据更变的通知
  • 在Zk中,引入了Watcher来实现分布式数据的发布/订阅功能,整体通知如下

    • ①客户端向Zk服务器注册Watcher,并将Watcher存储在自身的WatcherManager中

    • ②Zk服务器触发Watcher事件后,向客户端发送通知

    • ③客户端线程从WatcherManager中取出对应的Watcher对象,执行回调逻辑

  • 整体代码与逻辑:TODO

  • Watcher特性总结如下

    • 一次性:一旦一个Watcher被触发,Zk会将其移除。因此开发者需要反复注册。这种设计有利于减轻服务端压力

    • 客户端串行执行:客户端Watcher回调是一个串行同步的过程,因此保证了顺序

    • 轻量:Watcher通知非常轻量,只会告诉客户端发生了某种事件,不会传达事件详情。这点需要客户端收到事件后主动重新拉取。有利于网络和内存开销

7.1.5 ACL——保障数据的安全
  • ACL的重要性:通过ACL(Access Control List)权限控制机制保障数据的安全

  • ACL介绍:可以从三方面理解该机制:权限模式(Scheme),授权对象(ID),权限(Permission),通常使用 "scheme:id:permission" 来标识一个有效的ACL信息

  • 权限模式(Scheme):权限验证过程中使用哪个策略,开发人员使用最多的是以下四种权限

    • IP:针对IP地址维度进行控制

      • 例1:"ip:192.168.0.110":表示控制权限只针对这个IP

      • 例2:"ip:192.168.0.1/24":表示针对192.168.0.*这个IP段进行权限控制

    • Digest:最常用的,类似于"username:password"的形式

      • Zk会对其进行编码,将这种形式编码成无法辨识的字符串,避免明文

    • World:开放者模式,不校验权限,权限对所有用户开放

      • 可以看作是特殊的Digest模式,即"world:anyone"

    • Super:也是一种特殊的Digest模式,相当于管理员(超级用户)模式,超级用户可以操作所有节点

  • 授权对象(ID):与上述的权限模式配合使用。在不同的scheme下,id是不同的。见下图

  • 权限(Permission):权限就是通过了权限检查后可以被允许执行的操作。在Zk中操作可分以下5类

    • CREATE:允许 授权对象 创建该节点的子节点

    • READ:允许 授权对象 从该节点读取数据 或 子节点列表 等

    • WRITE:允许 授权对象 对该节点进行更新操作

    • DELETE:允许 授权对象 删除该节点的子节点

    • ADMIN:允许 授权对象 为该节点设置ACL权限

  • ACL的管理

    • ACL设置:在Zk服务端有两种方式能对ACL进行设置

      • 方式

        例子

        方式一:创建节点的同时设置ACL参数,命令格式如下:【create [-s] [-e] path data acl】

        image.jpeg

        方式二:通过setAcl命令,单独对已存在的节点进行设置:【setAcl path acl】

        image.jpeg

    • 如何使用Super模式

      • Super模式由来:如果一个持久数据节点的创建者客户端已下线,那么该如何清理?需要一个超级管理员

      • 使用方式:

        • ①在ZK服务器上开启Super模式:在服务端启动时,添加以下属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/581498.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

测试开发 | 相比 Selenium,Web 自动化测试框架 Playwright 有哪些强大的优势?

Playwright 是由微软的研发团队所开发的一款 Web 自动化测试框架,这个框架具有多平台、跨语言的特点。除了基本的自动化测试能力之外,同时它还具备非常强大的录制功能、追踪功能。以下是 Playwright 与 Selenium 的对比。 ​ 由此可见,Play…

HTML5(2)

目录 一.列表、表格、表单 1.列表标签 2.表格 4.无语义的布局标签 5.字符实体 6.综合案例--1 7.综合案例--表单 一.列表、表格、表单 1.列表标签 1.1 无序列表 1.2 有序列表 1.3 定义列表 定义列表一般用于网页底部的帮助中心 2.表格 2.1 2.2 表格结构标签 shiftaltf 格…

chrome 安装devtools

chrome 安装devtools 下载安装 链接:https://github.com/vuejs/devtools 选择对应版本: 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

简单的图像处理算法

本笔记参考crazy_Bingo 基础: 图像处理都是用卷积矩阵对图像卷积计算,如3X3 的矩阵对640 X 480分辨率的图像卷积,最终会得到638 X 478 的图像。卷积过程是这样的: 一、中值滤波 : 找出矩阵中的最中间值作为像素点 中…

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…

数据库常考理论

1 笛卡尔积X与自然连接∞的区别 2 求候选键 3 无损连接及函数依赖 4 范式判断 笛卡尔积&#xff1a;S1*S2,产生的结果包括S1和S2的所有属性列&#xff0c;并且S1中每条记录依次和S2中所有记录 组合成一条记录&#xff0c;最终属性列为S1S2属性列&#xff0c;记录数为S1*S2记…

mamba 和conda 安装R包

**1. 下载miniconda3 ** wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh这个命令是在linux终端中输入的,miniconda3管理起来更方便。 2. 安装miniconda3 sh Miniconda3-latest-Linux-x86_64.sh接下来会有一些回车(ente…

「C++ 内存管理篇 1」C++动态内存分配

目录 〇、C语言的动态内存分配方式 一、C的动态内存分配方式 1. 什么是C的动态内存分配&#xff1f; 2. 为什么需要C的动态内存分配&#xff1f; a. new的优势 b. new的不足 c. delete的优势 d. 总结 3. 怎么使用new和delete? a. 对于内置类型 b. 对于自定义类型 c. 为什么ne…

牛客NC242 单词搜索【中等 递归DFS C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2 思路 递归&#xff1a;以word第一个字符为起点&#xff0c;在矩阵中 递归搜索&#xff0c;检查是否存在完整的word路径&#xff0c; 注意恢复现场&#xff0c;又叫回溯&#…

物联网通信网关的主要功能体现在哪些方面?-天拓四方

在信息化、智能化的时代&#xff0c;物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备&#xff0c;将现实世界与数字世界紧密相连&#xff0c;从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分&#xff0c;物联网通信…

MySQL:飞腾2000+Centos7.6 aarch64 部署MySQL8.0.36

目录 1.硬件环境 2.MySQL选择 Bundle版本【全部文件】​编辑 3.下载并安装 4.安装完成后检查mysql 5.初始化MySQL 6.那就问了&#xff0c;都初始化了啥&#xff1f; 7.尝试启动MySQL 8.给mysql文件授权 9.再次尝试启动正常 10.mysql初始化目录出现了mysql.sock 11.找…

VS2022 配置OpenCV开发环境详细教程

OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;由Intel开发并首先发布于1999年。OpenCV被广泛用于实时图像处理、视频分析、物体检测、面部识别、机器人视觉以及许多其他领域。它支持C、Pytho…

Flutter应用开发-几种保存简单配置的方式

文章目录 简单配置保存的几种方式使用 shared_preferences 插件优点缺点 使用 hive 插件优点 缺点使用文件存储&#xff1a;优点缺点 简单配置保存的几种方式 在 Flutter 开发的 Android 应用中&#xff0c;保存应用配置并下次启动时读取&#xff0c;有以下几种比较合适的方式…

rust疑难杂症解决

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

Docker | 入门:安装与配置

Docker | 入门&#xff1a;安装与配置 Docker 和传统虚拟机区别 对于传统虚拟机&#xff1a; 虚拟出一套硬件&#xff0c;运行一个完整的操作系统&#xff0c;并在这个操作系统上安装和运行软件。 对于 Docker: 将一个个容器隔离开。 容器内的应用直接运行在宿主机的内容&am…

软件模型(简洁明了)

《 软件测试基础持续更新中》 一、软件开发模型 1.1 大爆炸模型 优点&#xff1a;思路简单&#xff0c; 通常可能是开发者的“突发奇 想” 缺点&#xff1a;开发过程是非工程化的&#xff0c;随意性大&#xff0c;结果不可预知 测试&#xff1a;开发任务完成后&#xff0c;…

一个自卑的人怎么变得自信

一个自卑的人怎么变得自信 自卑感是一种常见的心理状态&#xff0c;它可能源于个人对自己能力、外貌、价值等方面的负面评价。自卑感不仅会影响一个人的情绪状态&#xff0c;还可能阻碍其在生活、学习和工作中的表现。然而&#xff0c;自信并非一蹴而就的品质&#xff0c;它需要…

基础款:Dockerfile 文件

# bash复制代码# 使用 Node.js 16 作为基础镜像 # 指定一个已经存在的镜像作为模版&#xff0c;第一条必须是from FROM node:16# 将当前工作目录设置为/app # WORKDIR /app# 方法一&#xff1a;用dockerfile命令&#xff1a;进行下载打包文件 # 将 package.json 和 package-loc…

MySQL 之 主从复制

1. 主配置文件&#xff08;win下是my.ini&#xff0c;linux下是my.cnf&#xff09; #mysql 服务ID,保证整个集群环境中唯一 server-id1 #mysql binlog 日志的存储路径和文件名 log-bin/var/lib/mysql/mysqlbin #错误日志,默认已经开启 #log-err #mysql的安装目录 #basedir #mys…

Linux软件包管理器——yum

文章目录 1.什么是软件包1.1安装与删除命令1.2注意事项1.3查看软件包1.3.1注意事项&#xff1a; 2.关于rzsz3.有趣的Linux下的指令 -sl 1.什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一…