做网站设计能赚钱吗,柳州市住房和城乡建设局网站首页,张家口全景网站建设,网站返回500错误页面文章目录 为甚么需要Zookeeper一、Zookeeper 介绍1.1 介绍1.2 Zookeeper中的一些概念1.2.1 集群角色1.2.2 会话 session1.2.3 数据节点 Znode1.2.4 版本1.2.5 事件监听器 Watcher1.2.6 ACL 权限控制表(Access Control Lists) 二、 Zookeeper的系统模型2.1.1 ZNode节点2.1.2 ZNo… 文章目录 为甚么需要Zookeeper一、Zookeeper 介绍1.1 介绍1.2 Zookeeper中的一些概念1.2.1 集群角色1.2.2 会话 session1.2.3 数据节点 Znode1.2.4 版本1.2.5 事件监听器 Watcher1.2.6 ACL 权限控制表(Access Control Lists) 二、 Zookeeper的系统模型2.1.1 ZNode节点2.1.2 ZNode的分类2.1.3 事务ID2.1.4 ZNode的状态信息2.1.5 Watcher 数据变更通知2.1.6 ACL 保障数据的安全 Zookeeper最主要的使用场景是作为分布式系统的分布式协同服务 资料 zookeeper官方文档 https://zookeeper.apache.org/doc/r3.7.0/zookeeperInternals.html#sc_consistency 其他 3.5支持动态节点扩容之前要么全部停止要么一个一个停止更新zookeeper的核心 zab协议是一个最终一致性的协议因为除了主节点外其他节点都是异步写入的数据客户端如果在未同步完成前读取数据就有可能出现数据不一致。如果要保证强一致性那么写入性能将大受影响。如过要保证最新的值那么客户端API提供了sync()方法读取节点数据前调用一下节点就会和主节点进行最新的同步。 为甚么需要Zookeeper
分布式系统的信息传输不可靠可能导致信息不一致 分布式系统使用n个服务器组成集群可以增强系统的计算能力但是服务器之间的信息传输协调依靠的是不可靠的网络传输。需要考虑网络延迟、中断、服务器之间的信息不对等等问题。所以需要通过某种方式让每个服务器之间能够信息同步和共享。 让分布式系统信息同步和共享
方式1通过网络进行信息共享 通过网络进行信息共享每次有数据变动时直接通知给每台服务器。出现网络问题的话可能就会数据不一致并且后续加入的服务器无法得知之前的消息。**方式2通过共享存储进行信息共享 **例如对于需要共享的数据放在可以共享访问的数据库中各个服务器定期主动拉取数据。方式2优化 对于需要共享的数据放在所有服务器都能共享访问的地方。并且当数据发生改变时主动通知关注的服务器这样各个服务器都能第一时间获取到最新的数据。Zookeeper就是这种方式实现的对分布式系统的协调。
一、Zookeeper 介绍
1.1 介绍
zookeeper 是一个开源的**分布式协调服务**是一个典型的分布式数据一致性的解决方案。实现了分布式数据的强一致性基于Zookeeper可以实现数据发布/订阅负载均衡、命名服务、集群管理、分布式锁、分布式队列等功能。
1.2 Zookeeper中的一些概念
1.2.1 集群角色
在通常的集群方式中最典型的就是Master/Slave模式(主备) 这种模式对能够处理写操作的机器称为Master通过异步复制获取最新数据的称为Slave机器。Zookeeper没有直接使用M/S模式引入了Leader、Follower、Observer三种角色。Zookeeper集群中所有机器通过Leader选举选出Leader、Leader能提供事务写入服务其他节点则仅提供读取服务并且负责转发客户端写入事务到Leader节点。Observer和Follower节点的区别就是Observer节点不参与投票也不参与选举。Observer类型节点可以提升选举和投票的效率。
1.2.2 会话 session
Session指的是客户端会话zookeeper使用的是基于TCP的自己实现的通信协议。会话指的就是客户端和服务端之间的一次TCP长连接的创建和销毁。客户端通过这个TCP长连接来和服务器保持有效的会话也能向服务器发送请求接受响应同时还能接受来自服务器的Watch事件。
1.2.3 数据节点 Znode
在分布式系统中“节点”往往是指代一台机器但是 Zookeeper中节点可以指代构成集群的机器称为“机器节点”,另外往往指代zookeeper的一中数据模型的数据单元**** 称为数据节点。Zookeeper 将所有数据存储在内存中数据模型是一棵树 ZNode Tree由斜杠 / 进行分割的路径就是一个Znode例如 /lock/app 。每个ZNode可以保存自己的数据内容同时还会保存一系列属性信息。
1.2.4 版本
每个Znode会存储数据并且Zookeeper会为其维护一个叫做叫做Stat的数据结构Stat记录了这个ZNode的三个数据版本。version 指代当前的 Znode 保存的数据内容版本。cversion 指代当前ZNode子节点的版本aversion 当前ZNode的ACL版本
1.2.5 事件监听器 Watcher
Watcher是Zookeeper很重要的特性Zookeeper允许客户端在指定节点上注册一些Watcher并且在对应事件触发时主动通知到监听的客户端。这也是Zookeeper实现分布式协调服务的重要特性。
1.2.6 ACL 权限控制表(Access Control Lists)
Zookeeper 使用ACL (Access Control Lists) 策略来进行权限控制其包含了下面五种权限
CREATE 创建子节点的权限READ 获取子节点和子节点列表的权限WRITE 更新节点数据的权限DELETE 删除子节点的权限ADMIN 设置节点ACL的权限
二、 Zookeeper的系统模型
2.1.1 ZNode节点
ZooKeeper中数据信息被保存在一个个的数据节点上这些节点称为znodeZNode是Zookeeper中最小的数据单位ZNode一层层可以往下挂Znode最后形成一颗ZNode树类似文件系统的层级树状结构。ZNode使用 / 来分割/ 也表示根目录。
2.1.2 ZNode的分类
ZooKeeper 的节点类型可以分为三类
持久性节点 Presistent 是Zookeeper中最常见的一种节点类型节点被创建后除非主动删除否则会一直存在ZooKeeper服务中。临时性节点 Ephemeral 会被自动清理的节点生命周期和客户端会话绑定一旦会话结束节点就会被删除。并且临时节点无法再创建子节点。顺序节点 Sequential 顺序节点也分为临时顺序节点和持久顺序节点顺序节点在创建后会自动加上数字后缀能体现节点的顺序。
2.1.3 事务ID
什么是事务这里的事务不是指数据库的事务而是指能够改变ZooKeeper服务器状态的操作。称之为 实务操作或者更新操作一般包含数据节点的创建、删除、更新等等。对于每一个事务请求ZooKeeper 都会为其分配一个全局唯一的事务ID事务ID用ZXID来标识通常是一个64位的数字每一个ZXID对应一次更新操作从这些XZID中可以间接的识别出ZooKeeper处理这些更新操作请求的全局顺序。
2.1.4 ZNode的状态信息
[zk: localhost:15881(CONNECTED) 8] stat /zk-premament
cZxid 0x100000006
ctime Fri Jun 30 11:02:24 CST 2023
mZxid 0x100000008
mtime Fri Jun 30 11:03:38 CST 2023
pZxid 0x100000006
cversion 0
dataVersion 1
aclVersion 0
ephemeralOwner 0x0
dataLength 3
numChildren 0查看ZNode的状态 stat /zk-premamentcZxid Create ZXID 节点被创建时的事务IDctime Create Time 标识节点创建的事件mZxid Modified ZXID 节点最后一次被修改时的事务IDmtime Modified Time 节点最后一次被修改的事件pZxid 子节点列表最后一次被更新时的事务ID。注意子节点内容变化这个id不会改变。cversion 标识子节点的版本号dataVersion 表示节点内容版本号acVersion 表示acl策略版本号ephemeralOwner 表示创建该临时节点的会话 sessionId 如果是持久性节点那么值为0dataLength 表示数据长度numChildren 表示直系子节点数
2.1.5 Watcher 数据变更通知
ZooKeeper使用Watcher机制实现了分布式数据发布/订阅功能在 ZooKeeper 中引⼊了 Watcher 机制来实现这种分布式的通知功能。ZooKeeper 允许客户端向服务端注册⼀个 Watcher 监听当服务端的⼀些指定事件触发了这个 Watcher那么就会向指定客户端发送⼀个事件通知来实现分布式的通知功能。Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分具体⼯作流程为 客户端在向Zookeeper服务器注册的同时会将Watcher对象存储在客户端的WatcherManager当中。当Zookeeper服务器触发Watcher事件后会向客户端发送通知客户端线程从WatcherManager中取出对应的Watcher对象来执⾏回调逻辑。
2.1.6 ACL 保障数据的安全 Zookeeper作为⼀个分布式协调框架其内部存储了分布式系统运⾏时状态的元数据这些元数据会直接影响基于Zookeeper进⾏构造的分布式系统的运⾏状态因此如何保障系统中数据的安全从⽽避免因误操作所带来的数据随意变更⽽导致的数据库异常⼗分重要在Zookeeper中提供了⼀套完善的ACLAccess Control List权限控制机制来保障数据的安全。 我们可以从三个⽅⾯来理解ACL机制 权限模式Scheme授权对象ID权限Permission 通常使⽤scheme: id : permission来标识⼀个有效的ACL信息。
**权限模式 Scheme ** 用来确定权限验证过程中使用的检验策略可以分成IP/IP段和账号密码细分的话可以分为如下四种。
IP 通过ip地址的粒度来进行权限控制可以配置某个IP也可以配置某个ip网段。**Digest **是最常用的权限控制模式更符合我们对权限控制的认识使用“username:password”形式的权限标识来进行权限配置可以区分不同的应用来进行权限控制。当我们通过username:password”配置了权限标识后Zookeper会对其进行SHA-1加密和BASE64编码**World **是一种开放的权限控制模式即数据节点的权限对所有用户开放。也可以看成Digest的一种特殊形式。即 “world:anyone”super 就是超级用户授权启动zookeeper时修改zkServer.sh的启动命令脚本开启super模式登录后添加超级管理员账户即可操作管理所有节点。**Auth **授权用户用户名:密码 需要先添加ACL账户
#1添加ACL账户
# addauth digest 用户名密码
[zk: localhost:2181(CONNECTED) 4] addauth digest test:test123#2创建测试节点
# create 测试节点 测试节点值
[zk: localhost:2181(CONNECTED) 3] create /test_acl value_of_test_acl#3给测试节点设置Auth权限
# setAcl 测试节点 auth:用户名:crawd 权限
[zk: localhost:2181(CONNECTED) 5] setAcl /test_acl auth:test:crawd
#第一步将要设置的密码进行base64编码可以使用linux命令也可以使用其他语言自己实现
echo -n test:test | openssl dgst -binary -sha1 | openssl base64
V28q/NynI4JI3Rk54h0r8O5kMug#第二步创建测试节点
[zk: localhost:2181] create /digest user
#第三步给节点设置 digest授权
[zk: localhost:2181] setAcl /digest digest:test:V28q/NynI4JI3Rk54h0r8O5kMug:rwadc
#第四步查询ACL
[zk: localhost:2181] getAcl /digest
#ACL输出结果
[zk: localhost:2181] addauth digest user:passwd#开启SuperDigest超级管理员举例 #1、修改zkServer.sh加入super权限设置
SUPER_ACL-Dzookeeper.DigestAuthenticationProvider.superDigestsuper:gG7s8t3oDEtIqF6DM9LlI/R9Ss#2、重新启动Zookeeper
# ./zkServer.sh restart# 添加认证前无法访问节点
[zk: localhost:2181] ls /test
Authentication is not valid : /test#3、使用super:super进行认证添加super认证
[zk: localhost:2181) ] addauth digest super:super
#获得了节点权限
[zk: localhost:2181) ] ls /test
[]
[zk: localhost:2181)] get /test权限ID 就是权限模式对应的内容例如权限模式是IP那么对应的ID就是IP地址或网段
**权限Permission ** zookeeper中权限可以分为五大类
CREATEC数据节点的创建权限允许授权对象在该数据节点下创建⼦节点DELETED⼦节点的删除权限允许授权对象删除该数据节点的⼦节点。READR数据节点的读取权限允许授权对象访问该数据节点并读取其数据内容或⼦节点列表等。WRITEW数据节点的更新权限允许授权对象对该数据节点进⾏更新操作。ADMINA数据节点的管理权限允许授权对象对该数据节点进⾏ ACL 相关的设置操作。