荆门网站建设电话,如何制作网页链接二维码,一个网站做多有几种颜色,网站建设客户问题转载自 漫画#xff1a;什么是ZooKeeperZookeeper的数据模型Zookeeper的数据模型是什么样子呢#xff1f;它很像数据结构当中的树#xff0c;也很像文件系统的目录。树是由节点所组成#xff0c;Zookeeper的数据存储也同样是基于节点#xff0c;这种节点叫做Znode。但是什么是ZooKeeperZookeeper的数据模型Zookeeper的数据模型是什么样子呢它很像数据结构当中的树也很像文件系统的目录。树是由节点所组成Zookeeper的数据存储也同样是基于节点这种节点叫做Znode。但是不同于树的节点Znode的引用方式是路径引用类似于文件路径/ 动物 / 仓鼠/ 植物 / 荷花这样的层级结构让每一个Znode节点拥有唯一的路径就像命名空间一样对不同信息作出清晰的隔离。data
Znode存储的数据信息。ACL
记录Znode的访问权限即哪些人或哪些IP可以访问本节点。stat
包含Znode的各种元数据比如事务ID、版本号、时间戳、大小等等。child
当前节点的子节点引用类似于二叉树的左孩子右孩子。这里需要注意一点Zookeeper是为读多写少的场景所设计。Znode并不是用来存储大规模业务数据而是用于存储少量的状态和配置信息每个节点的数据最大不能超过1MB。Zookeeper的基本操作和事件通知Zookeeper包含了哪些基本操作呢这里列举出比较常用的APIcreate
创建节点delete
删除节点exists
判断节点是否存在getData
获得一个节点的数据setData
设置一个节点的数据getChildren
获取节点下的所有子节点这其中existsgetDatagetChildren属于读操作。Zookeeper客户端在请求读操作的时候可以选择是否设置Watch。Watch是什么意思呢我们可以理解成是注册在特定Znode上的触发器。当这个Znode发生改变也就是调用了createdeletesetData方法的时候将会触发Znode上注册的对应事件请求Watch的客户端会接收到异步通知。具体交互过程如下1.客户端调用getData方法watch参数是true。服务端接到请求返回节点数据并且在对应的哈希表里插入被Watch的Znode路径以及Watcher列表。2.当被Watch的Znode已删除服务端会查找哈希表找到该Znode对应的所有Watcher异步通知客户端并且删除哈希表中对应的Key-Value。Zookeeper的一致性Zookeeper的集群长成什么样呢就像下图这样Zookeeper Service集群是一主多从结构。在更新数据时首先更新到主节点这里的节点是指服务器不是Znode再同步到从节点。在读取数据时直接读取任意从节点。为了保证主从节点的数据一致性Zookeeper采用了ZAB协议这种协议非常类似于一致性算法Paxos和Raft。在学习ZAB之前我们需要首先了解ZAB协议所定义的三种节点状态Looking 选举状态。Following Follower节点从节点所处的状态。Leading Leader节点主节点所处状态。我们还需要知道最大ZXID的概念最大ZXID也就是节点本地的最新事务编号包含epoch和计数两部分。epoch是纪元的意思相当于Raft算法选主时候的term。假如Zookeeper当前的主节点挂掉了集群会进行崩溃恢复。ZAB的崩溃恢复分成三个阶段1.Leader election选举阶段此时集群中的节点处于Looking状态。它们会各自向其他节点发起投票投票当中包含自己的服务器ID和最新事务IDZXID。接下来节点会用自身的ZXID和从其他节点接收到的ZXID做比较如果发现别人家的ZXID比自己大也就是数据比自己新那么就重新发起投票投票给目前已知最大的ZXID所属节点。每次投票后服务器都会统计投票数量判断是否有某个节点得到半数以上的投票。如果存在这样的节点该节点将会成为准Leader状态变为Leading。其他节点的状态变为Following。这就相当于一群武林高手经过激烈的竞争选出了武林盟主。2.Discovery发现阶段用于在从节点中发现最新的ZXID和事务日志。或许有人会问既然Leader被选为主节点已经是集群里数据最新的了为什么还要从节点中寻找最新事务呢这是为了防止某些意外情况比如因网络原因在上一阶段产生多个Leader的情况。所以这一阶段Leader集思广益接收所有Follower发来各自的最新epoch值。Leader从中选出最大的epoch基于此值加1生成新的epoch分发给各个Follower。各个Follower收到全新的epoch后返回ACK给Leader带上各自最大的ZXID和历史事务日志。Leader选出最大的ZXID并更新自身历史日志。3.Synchronization同步阶段把Leader刚才收集得到的最新历史事务日志同步给集群中所有的Follower。只有当半数Follower同步成功这个准Leader才能成为正式的Leader。自此故障恢复正式完成。什么是Broadcast呢简单来说就是Zookeeper常规情况下更新数据的时候由Leader广播到所有的Follower。其过程如下1.客户端发出写入数据请求给任意Follower。2.Follower把写入数据请求转发给Leader。3.Leader采用二阶段提交方式先发送Propose广播给Follower。4.Follower接到Propose消息写入日志成功后返回ACK消息给Leader。5.Leader接到半数以上ACK消息返回成功给客户端并且广播Commit请求给Follower。Zab协议既不是强一致性也不是弱一致性而是处于两者之间的单调一致性。它依靠事务ID和版本号保证了数据的更新和读取是有序的。Zookeeper的应用1.分布式锁这是雅虎研究员设计Zookeeper的初衷。利用Zookeeper的临时顺序节点可以轻松实现分布式锁。2.服务注册和发现利用Znode和Watcher可以实现分布式服务的注册和发现。最著名的应用就是阿里的分布式RPC框架Dubbo。3.共享配置和状态信息Redis的分布式解决方案Codis就利用了Zookeeper来存放数据路由表和 codis-proxy 节点的元信息。同时 codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy。此外Kafka、HBase、Hadoop也都依靠Zookeeper同步节点信息实现高可用。