大神们,zookeeper setAcl之前设置了权限设置,这个权限设置怎么取消掉呢?

1.相对于分布式还有集中式适用於中小型项目,请求量成百上千数据量百万级。

2.通常普通的tomcat(16G内存、4核CPU)最高支持几千的并发请求

    对于配额不是硬性的提示超过配额還是可以继续创建,只不过在日志里面有提示

10. stat path查看节点的状态(与get相比 不显示节点保存的数据)

currentEpoch(比喻:当前的年号):当前的年号

history:当湔节点接受到事务提议的log

低32位:0000f 事务的自增序列(单调递增的序列)只要客户端有请求就+1

当产生新Leader的时候,就从这个Leader服务器上取出本地logΦ最大事务zxid从里面读出epoch+1,作为一个新epoch并将低32位置0(保证id绝对自增)。

崩溃恢复(投票过程):

2. 搜集各个服务器的投票

3. 比较投票,比较逻輯:优先比较zxid然后才比较myid。

 4. 改变服务器状态(崩溃恢复=》数据同步或者崩溃恢复=》消息广播)

消息广播(类似2P提交):

1. Leader接受请求后,讲这個请求赋予全局的唯一64位自增Id(zxid)

3. 所有的follower接受到议案后,想将议案写入硬盘后马上回复Leader一个ACK(OK)。

ps:到了这个阶段ZK集群才正式对外提供服务,并且Leader可以进行消息广播如果有新节点加入,还需要进行同步

2. 找到对应zxid的数据,进行同步(数据同步过程保证所有follower一致)

Curator连接ZK应用最广泛的工具。

场景:每1分钟重试一次如果网络出现阻塞。

退避算法按照指数间隔重试比如第一次1分钟,第二次2分钟......随着时间嘚推移重试间隔越长,避免网络阻塞后通顺后出现的一些问题

备注:假如master1并没有挂掉,只有由于网络延时导致当网络顺畅的时候就會出现“脑裂”状态。都认为自己是active

脑裂的代码(作为课后作业)

1. 持久节点(除非主动删除,zk不会做清理工作)

2. 临时节点(随着session会话消亡而消亡)

       分布式锁主要用于在分布式环境中包括跨主机、跨进程、跨网络,导致共享资源不一致的问题保证数据的一致性。

树模型(采用文件系统的形式只不过去掉文件和目录),叫数据节点

对于一个节点可操作的权限设置有5种:

ADMIN(节点管理权限设置)

1. world:开放模式。意思所有人都可以访问

生成密文命令(执行目录在zk根目录):

zookeeper版本的含义:版本指的是变更的次数。

1. 事务请求(可能引起数据不一致性的请求)的唯一调度者和处理者保证事务处理的顺序性。

2. 集群内部各服务器之间的调度者

事务请求:除了提交给CommitProcessor,还会根据对应嘚请求创建对应的Proposal并发送给所有的Follower服务器进行一次集群内部事务投票。

非事务请求:直接发送给CommitProcessor不再做其他处理。

处理事务并且将事務记录到日志文件中同时触发数据快照(有条件的触发)

处理完事务并且记录事务日志后,向Proposal的投票收集器发送ACK反馈通知投票收集器當前服务器已经完成对Proposal事务日志记录。

CommitProcessor等待集群内针对于该Proposal的投票直到该Proposal可以被提交(多数派协议)并且将请求交给下一个处理器。

在姠所有的Follower发送Commit必须保证Commit执行顺序。同时把请求交给下一个处理器然后从队列中将Commit移除。

1. 处理客户端的非事务请求事务请求必须转发給Leader服务器

处理client请求队列,用take方法逐个取出然后交付给下一RequestProcessor。如果事务请求那么必须转发给Leader。

在实际运行中它只是负责读,Leader不会将事務的投票发送给Obsserver

Jute是zk序列化、反序列化协议。

tag 代表表示对象的标识

基于TCP/IP协议,所以是一个长连接zookeeper在这个基础上完成客户端和服务器,垺务器和服务器之间的通信

运行时,不停地有数据写入

当日志的剩余空间不足4K(4096),日志就做扩充扩充64M,后面以“0”填充

log都是使鼡zxid作为文件名的后缀。

快照数据:在某一时刻内存所有全量数据的一个磁盘文件如:当快照阈值100000,触发快照数据快照数据都是使用zxid作為文件名的后缀。

快照触发机制:非“半数机制”过半随机策略。

snapcount: 多少次事务日志记录后触发一次数据快照

主要为了对业务进行隔离性

SessionID嘚分配(初始化)函数策略如下:

1. 取时间,并且左移24位得到的结果再右移8位(高8位低16位都是0)

3. 和第一步的结果做或运算

Session分桶:按照Session会話过期时间进行分区块保存。

2. 计算会话下一次超时时间

3. 定位会话的所在区块

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

  (1)列表中每个ACL 包括

  ①权限设置:perms
  ②验证模式:scheme
  ③具体內容:Ids

  (2)ZooKeeper 提供了如下几种验证模式

  (3)权限设置许可集合如下,注意的是exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节點的状态节点的ACL

验证:对该请求携带的Author 明文信息加密,并与目标节点的ACL 信息进行比较如果匹配则具有相

应的权限设置,否则请求被Server 拒绝

  基于上一节的内容,本节介绍Digest 验证模式下通过用户名、密码的方式进行节点权限设置管理需要的相关接口。

  Znode 存储ACL 的内容為密文所以在setAcl 时必须将明文的用户名、密码(user:pwd)加密,结果为:

  设置author 信息之后该session 的每次操作都带有该author 标识。如果想用不同的author 信息操莋只需再调用一次zoo_add_auth ,Client 端以最后一次设置的信息为有效author 信息

  (1)遍历znode的所有ACL:

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

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

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

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

(1)启动ZK 的时候加入参数



Leader选举之后Learner会向Leader服务器进行注册。当Learner服务器向Leader完成注册后就进入数据同步环节,简单地讲数据同步过程就是Leader服务器将那些没存在Learner服务器上提交过的事务请求同步给Learner服務器,大体上如下图所示


        在开始数据同步之前,Leader服务器会进行数据同步初始化首先会从ZooKeeper的内存数据库中提取出事务请求对应的提议缓存队列(下面我们用“提议缓存队列”来指代该队列):proposals,同时完成对以下三个ZXID值的初始化。

同步)在初始化阶段Leader服务器会优先初始化以铨量同步方式来同步数据,当然这并非最终的数据同步方式,在以下步骤中会根据Leader和Learner服务器之间的数据差异情况来决定最终的数据同步方式。

Leader服务器都会通过发送两个数据包来完成分別是PROPOSAL内容数据包和COMMIT指令数据包,这和ZooKeeper运行时Leader和Follower之间的事务请求的提交过程是一致的

垺务器的数据包发送顺序,Learner会首先接收到一个DIFF指令于是便确定了接下来进入DIFF同步阶段。然后依次收到上表中的四个数据包Learner会依次将其應用到内存数据库中。Learner还会接收到来自Leader的NEWLEADER指令此时Learner就会反馈给Leader —个ACK消息,表明自己确实完成了对提议缓存队列中Proposal的同步

  Leader在接收到来Learner的這个ACK消息以后,就认为当前Learner已经完成数据同步同时进入“过半策略”等待阶段——Leader会和其他Learner服务器进行上述同样的数据同步流程,直到集群中有过半的Learner机器响应了Leader这个ACK消息一但满足“过半策略”后,Leader服务器就会向所有已经完成数据同步的Learner发送一个UPTODATE指令用来通知Learner已经完荿数据同步,同时集群中已经有过半机器完成数据同步集群已经具备了对外服务的能力了。


        场景:针对上面的场景我们已经介绍了直接差异化同步的详细过程。但是在这种场景中会有一个罕见但是确实存在的特殊场景:设有 A 、 B 、 C 三台机器,假如某一时刻 B 是 Leader 服务器此時的Leader_Epoch为 5 ,同时当前已经被集群中绝大部分机器都提交的 ZXID 包括: Leader 选举假设此次选举产生的新的 Loader 是 A ,同时Leader_Epoch 变更为 6 之后 A 和 C 两台服务器继续对外进行服务,又提交了 0x 和 0x 两个事务此时,服务器 B 再次启动井开始数据同步。

        先回滚再差异化同步的数据同步方式在具体实现上和差异囮同步是一样的都是会将差异化的Proposal发送给 Learner 。同步过程中的数据包发送顺序如下表所示

Learner进行数据同步,因此只能进行全量同步(SNAP 同步)

        所谓全量同步就是 Leader服务器将本机上的全量内存数据都同步给Learner。Leader服务器首先向Learner发送一个 SNAP指令通知Learner即将进行全量数据同步。随后 Leader 会从内存数据库中获取到全量的数据节点和会话超时时间记录器,将它们序列化后传输给Learner Learner服务器接收到该全最数据后,会对其反序列化后载入箌内存数据库中

参考资料

 

随机推荐