漫画:什么是ZooKeeper

转载自 漫画:什么是ZooKeeper














Zookeeper的数据模型


Zookeeper的数据模型是什么样子呢?它很像数据结构当中的树,也很像文件系统的目录。




树是由节点所组成,Zookeeper的数据存储也同样是基于节点,这种节点叫做Znode。


但是,不同于树的节点,Znode的引用方式是路径引用,类似于文件路径:


 / 动物 / 仓鼠


 / 植物 / 荷花


这样的层级结构,让每一个Znode节点拥有唯一的路径,就像命名空间一样对不同信息作出清晰的隔离。









data:

Znode存储的数据信息。


ACL:

记录Znode的访问权限,即哪些人或哪些IP可以访问本节点。


stat:

包含Znode的各种元数据,比如事务ID、版本号、时间戳、大小等等。


child:

当前节点的子节点引用,类似于二叉树的左孩子右孩子。


这里需要注意一点,Zookeeper是为读多写少的场景所设计。Znode并不是用来存储大规模业务数据,而是用于存储少量的状态和配置信息,每个节点的数据最大不能超过1MB。







Zookeeper的基本操作和事件通知


Zookeeper包含了哪些基本操作呢?这里列举出比较常用的API:


create

创建节点


delete

删除节点


exists

判断节点是否存在


getData

获得一个节点的数据


setData

设置一个节点的数据


getChildren

获取节点下的所有子节点



这其中,exists,getData,getChildren属于读操作。Zookeeper客户端在请求读操作的时候,可以选择是否设置Watch。


Watch是什么意思呢?


我们可以理解成是注册在特定Znode上的触发器。当这个Znode发生改变,也就是调用了create,delete,setData方法的时候,将会触发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和最新事务ID(ZXID)。



接下来,节点会用自身的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同步节点信息,实现高可用。



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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异步性能:了解 Async 和 Await 的成本

异步编程长时间以来一直都是那些技能高超、喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调。 随着 Microsoft .NET Framework 4.5 的推出&#xff…

什么叫做在oracle目录下,ORACLE directory 目录

Create directory让我们可以在Oracle数据库中灵活的对文件进行读写操作,极大的提高了Oracle的易用性和可扩展性。其语法为:CREATE [OR REPLACE] DIRECTORY directory AS pathname;本案例具体创建如下:create or replace directory exp_dir as /tmp;目录创建以后&…

银行营业网点管理系统——dao包(BaseDao)

package BranchesMgr.dao; /*** 数据库操作类* author Administrator**/ import java.sql.*; import java.util.List; public class BaseDao {Connection connnull;PreparedStatement psnull;ResultSet rsnull;public void getConnection(){try {Class.forName("com.micro…

netapp做内网穿透有问题

内网穿透 vue 返回 invalid host header 2019年03月17日 16:05:29 renzhehongyi 阅读数:1926收起 个人分类: 互联网Vue 问题:使用花生壳内网穿透只返回304,invalid host header 原因:新版的webpack-dev-server出于…

Visual Studio 15 Preview 5 发布 大幅提升性能

Visual Studio 15 Preview 5 发布了,该版本包括许多新的提升和 bug 修复。 微软发布了 Visual Studio 15 的第 5 个预览版本。据微软描述,Preview 5 的亮点是在性能和内存效率方面迈进了一大步,尤其是在加载一些插件方面,可以观看…

Spring Boot 单元测试详解+实战教程

转载自 Spring Boot 单元测试详解实战教程Spring Boot 的测试类库 Spring Boot 提供了许多实用工具和注解来帮助测试应用程序,主要包括以下两个模块。 spring-boot-test:支持测试的核心内容。spring-boot-test-autoconfigure:支持测试的自动…

oracle修改filesystem,(转):oracle、filesystem、backup日常巡检脚本

1.总脚本xunjian.codeexport PS1"hostname$"[$PWD] umask 022cd /u02/xunjian#######################xunjian check##################################################----1. filesystem check 文件系统检查rm -f /u02/xunjian/devdb2_xunjian.txtecho "1.fi…

华为校招2019

面试是在一个酒店里面的,人很多,面试和流水线一样有20-30个面试官同时进行,面试分成2轮一轮是技术面,一轮是主面。 一面是技术面是一个比较年轻的面试官,面试时间在30-60分钟,先自我介绍,问了…

EQueue 2.3.2版本发布(支持高可用)

前言 前段时间针对EQueue的完善终于告一段落了,实在值得庆祝,自己的付出和坚持总算有了成果。这次新版本主要为EQueue实现了集群功能,基本实现了Broker的高可用。另外还增加了很多实用的功能,对性能也做了很多优化。总之&#xff…

oracle spacial,Oracle Spacial(空间数据库)geometry元数据结构

geometry元数据内容每一维的名称、上下限和容差值存放在系统表中,用户不能直接访问,通过三个视图来存取:USER_SDO_GEOM_METADATA,可以更新ALL_SDO_GEOM_METADATA,只可以查询DBA_SDO_GEOM_METADATA,DBA可查询…

银行营业网点管理系统——dao包(BranchesDao)

package BranchesMgr.dao;import java.util.List;import BranchesMgr.entity.Branches;/*** 网点信息表的借口* author Administrator**/ public interface BranchesDao {//查询所有网点信息List<Branches> getBranches();//根据id查询指定的网点信息Branches BranchesIn…

这 30 个常用的 Maven 命令你必须熟悉

转载自 这 30 个常用的 Maven 命令你必须熟悉maven 命令的格式为 mvn [plugin-name]:[goal-name]&#xff0c;可以接受的参数如下。-D 指定参数&#xff0c;如 -Dmaven.test.skiptrue 跳过单元测试&#xff1b; -P 指定 Profile 配置&#xff0c;可以用于区分环境&#xff1b…

阿里云服务器本地连接(windows) 阿里云服务器和本地的磁盘共享数据

一、向Windows服务器上传下载文件方式 方法有很多种&#xff0c;此处介绍远程桌面的本地资源共享方法。 1、运行mstsc&#xff0c;连接远程桌面的时候&#xff0c;点“选项>>” 2、“本地资源”-->详细信息。 3、“磁盘驱动器”前面打钩。 4、连接远程电脑后&#…

10月15日 2016中国开源年会期待您的参与

由开源社主办的中国开源年会2016 (COSCon16 - China Open Source Conference 2016) 即将于今年10月15日-16日在北京举办。 这是一场-- 跨社区&#xff0c;跨技术领域&#xff0c;跨国度的年度盛会&#xff01; 您可以与真正的开源贡献者和参与者&#xff0c;直接互动&#xff0…

eclipse 创建ssm spring+springmvc+mybatis 实现登录注册

首先找到菜单栏中的Window 下的Preference 然后找到Server 下的 Runtime Environment 然后点击左侧的Add,因为小编用的是Tomcat 9.0 的&#xff0c;你的就要看自己的了&#xff0c;然后Next 然后找到自己存放Tomcat 的路径&#xff0c;然后Finish &#xff0c;最后Apply…

oracle 10741 trace,RedHat5.3上安装Oracle 10.2.0.1

RedHat 5.3上安装Oracle 10.2.0.11、系统环境&#xff1a;RedHat 5.3内存16G交换分区8G2、必须安装如下包&#xff0c;版本可不一样gcc-3.2.3-2make-3.79binutils-2.11openmotif-2.2.2-16setarch-1.3-1compat-gcc-7.3-2.96.122compat-gcc-c-7.3-2.96.122compat-libstdc-7.3-2.9…

达到年薪 40W 必需掌握的技术

转载自 达到年薪 40W 必需掌握的技术必需掌握的 Java 技术知识点 掌握Java编程语言&#xff0c;包含io/nio/socket/multi threads/collection/concurrency等功能的使用&#xff1b;熟练掌握jvm&#xff08;sun hotspot和ibm j9&#xff09;内存模型、gc垃圾回收调优等技能&…

银行营业网点管理系统——implt包(BranchesDaoImpl )

package BranchesMgr.dao.impl;/*** 网点信息表的实现类*/ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import BranchesMgr.dao.BaseDao; import BranchesMgr.dao.BranchesDao; import BranchesMgr.entity.…

ASP.NET Core 启动方式(Hosting)

之前版本的ASP.NET程序必须依赖IIS来启动&#xff0c;而IIS上会为挂载在其中的ASP.NET 注册一个ISAPI filter。每当http请求过来时&#xff0c;IIS则会启动w3wp的worker process来开始整个ASP.NET runtime程序。相信大家都这样的流程都有相应的了解。在.net core之前&#xff0…

浙江省医院鼻炎

主任医生&#xff1a;做个过敏源检测&#xff0c;看你是否是尘粉过敏&#xff0c;如果是可以做脱敏治疗&#xff0c;先做个皮试&#xff0c;你的特别厉害&#xff0c; 此时去521了 做皮试&#xff0c; 我&#xff1a;以前有医生说要手术割掉&#xff0c; 实习医生&#xff1…