ZooKeeper 系列(一)—— ZooKeeper核心概念详解

一、Zookeeper简介

Zookeeper是一个开源的分布式协调服务,目前由Apache进行维护。Zookeeper可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。它具有以下特性:

  • 顺序一致性:从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到Zookeeper中;
  • 原子性:所有事务请求的处理结果在整个集群中所有机器上都是一致的;不存在部分机器应用了该事务,而另一部分没有应用的情况;
  • 单一视图:所有客户端看到的服务端数据模型都是一致的;
  • 可靠性:一旦服务端成功应用了一个事务,则其引起的改变会一直保留,直到被另外一个事务所更改;
  • 实时性:一旦一个事务被成功应用后,Zookeeper可以保证客户端立即可以读取到这个事务变更后的最新状态的数据。

二、Zookeeper设计目标

Zookeeper致力于为那些高吞吐的大型分布式系统提供一个高性能、高可用、且具有严格顺序访问控制能力的分布式协调服务。它具有以下四个目标:

2.1 目标一:简单的数据模型

Zookeeper通过树形结构来存储数据,它由一系列被称为ZNode的数据节点组成,类似于常见的文件系统。不过和常见的文件系统不同,Zookeeper将数据全量存储在内存中,以此来实现高吞吐,减少访问延迟。

2.2 目标二:构建集群

可以由一组Zookeeper服务构成Zookeeper集群,集群中每台机器都会单独在内存中维护自身的状态,并且每台机器之间都保持着通讯,只要集群中有半数机器能够正常工作,那么整个集群就可以正常提供服务。

2.3 目标三:顺序访问

对于来自客户端的每个更新请求,Zookeeper都会分配一个全局唯一的递增ID,这个ID反映了所有事务请求的先后顺序。

2.4 目标四:高性能高可用

ZooKeeper将数据存全量储在内存中以保持高性能,并通过服务集群来实现高可用,由于Zookeeper的所有更新和删除都是基于事务的,所以其在读多写少的应用场景中有着很高的性能表现。

三、核心概念

3.1 集群角色

Zookeeper集群中的机器分为以下三种角色:

  • Leader :为客户端提供读写服务,并维护集群状态,它是由集群选举所产生的;
  • Follower :为客户端提供读写服务,并定期向Leader汇报自己的节点状态。同时也参与写操作“过半写成功”的策略和Leader的选举;
  • Observer :为客户端提供读写服务,并定期向Leader汇报自己的节点状态,但不参与写操作“过半写成功”的策略和Leader的选举,因此Observer可以在不影响写性能的情况下提升集群的读性能。

3.2 会话

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

关于会话中另外一个核心的概念是sessionTimeOut(会话超时时间),当由于网络故障或者客户端主动断开等原因,导致连接断开,此时只要在会话超时时间之内重新建立连接,则之前创建的会话依然有效。

3.3 数据节点

Zookeeper数据模型是由一系列基本数据单元Znode(数据节点)组成的节点树,其中根节点为/。每个节点上都会保存自己的数据和节点信息。Zookeeper中节点可以分为两大类:

  • 持久节点 :节点一旦创建,除非被主动删除,否则一直存在;
  • 临时节点 :一旦创建该节点的客户端会话失效,则所有该客户端创建的临时节点都会被删除。

临时节点和持久节点都可以添加一个特殊的属性:SEQUENTIAL,代表该节点是否具有递增属性。如果指定该属性,那么在这个节点创建时,Zookeeper会自动在其节点名称后面追加一个由父节点维护的递增数字。

3.4 节点信息

每个ZNode节点在存储数据的同时,都会维护一个叫做Stat的数据结构,里面存储了关于该节点的全部状态信息。如下:

状态属性 说明
czxid 数据节点创建时的事务ID
ctime 数据节点创建时的时间
mzxid 数据节点最后一次更新时的事务ID
mtime 数据节点最后一次更新时的时间
pzxid 数据节点的子节点最后一次被修改时的事务ID
cversion 子节点的更改次数
version 节点数据的更改次数
aversion 节点的ACL的更改次数
ephemeralOwner 如果节点是临时节点,则表示创建该节点的会话的SessionID;如果节点是持久节点,则该属性值为0
dataLength 数据内容的长度
numChildren 数据节点当前的子节点个数

3.5 Watcher

Zookeeper中一个常用的功能是Watcher(事件监听器),它允许用户在指定节点上针对感兴趣的事件注册监听,当事件发生时,监听器会被触发,并将事件信息推送到客户端。该机制是Zookeeper实现分布式协调服务的重要特性。

3.6 ACL

Zookeeper采用ACL(Access Control Lists)策略来进行权限控制,类似于UNIX文件系统的权限控制。它定义了如下五种权限:

  • CREATE:允许创建子节点;
  • READ:允许从节点获取数据并列出其子节点;
  • WRITE:允许为节点设置数据;
  • DELETE:允许删除子节点;
  • ADMIN:允许为节点设置权限。

四、ZAB协议

4.1 ZAB协议与数据一致性

ZAB协议是Zookeeper专门设计的一种支持崩溃恢复的原子广播协议。通过该协议,Zookeepe基于主从模式的系统架构来保持集群中各个副本之间数据的一致性。具体如下:

Zookeeper使用一个单一的主进程来接收并处理客户端的所有事务请求,并采用原子广播协议将数据状态的变更以事务Proposal的形式广播到所有的副本进程上去。如下图:

具体流程如下:

所有的事务请求必须由唯一的Leader服务来处理,Leader服务将事务请求转换为事务Proposal,并将该Proposal分发给集群中所有的Follower服务。如果有半数的Follower服务进行了正确的反馈,那么Leader就会再次向所有的Follower发出Commit消息,要求将前一个Proposal进行提交。

4.2 ZAB协议的内容

ZAB协议包括两种基本的模式,分别是崩溃恢复和消息广播:

1. 崩溃恢复

当整个服务框架在启动过程中,或者当Leader服务器出现异常时,ZAB协议就会进入恢复模式,通过过半选举机制产生新的Leader,之后其他机器将从新的Leader上同步状态,当有过半机器完成状态同步后,就退出恢复模式,进入消息广播模式。

2. 消息广播

ZAB协议的消息广播过程使用的是原子广播协议。在整个消息的广播过程中,Leader服务器会每个事物请求生成对应的Proposal,并为其分配一个全局唯一的递增的事务ID(ZXID),之后再对其进行广播。具体过程如下:

Leader服务会为每一个Follower服务器分配一个单独的队列,然后将事务Proposal依次放入队列中,并根据FIFO(先进先出)的策略进行消息发送。Follower服务在接收到Proposal后,会将其以事务日志的形式写入本地磁盘中,并在写入成功后反馈给Leader一个Ack响应。当Leader接收到超过半数Follower的Ack响应后,就会广播一个Commit消息给所有的Follower以通知其进行事务提交,之后Leader自身也会完成对事务的提交。而每一个Follower则在接收到Commit消息后,完成事务的提交。

五、Zookeeper的典型应用场景

5.1数据的发布/订阅

数据的发布/订阅系统,通常也用作配置中心。在分布式系统中,你可能有成千上万个服务节点,如果想要对所有服务的某项配置进行更改,由于数据节点过多,你不可逐台进行修改,而应该在设计时采用统一的配置中心。之后发布者只需要将新的配置发送到配置中心,所有服务节点即可自动下载并进行更新,从而实现配置的集中管理和动态更新。

Zookeeper通过Watcher机制可以实现数据的发布和订阅。分布式系统的所有的服务节点可以对某个ZNode注册监听,之后只需要将新的配置写入该ZNode,所有服务节点都会收到该事件。

5.2 命名服务

在分布式系统中,通常需要一个全局唯一的名字,如生成全局唯一的订单号等,Zookeeper可以通过顺序节点的特性来生成全局唯一ID,从而可以对分布式系统提供命名服务。

5.3 Master选举

分布式系统一个重要的模式就是主从模式(Master/Salves),Zookeeper可以用于该模式下的Matser选举。可以让所有服务节点去竞争性地创建同一个ZNode,由于Zookeeper不能有路径相同的ZNode,必然只有一个服务节点能够创建成功,这样该服务节点就可以成为Master节点。

5.4 分布式锁

可以通过Zookeeper的临时节点和Watcher机制来实现分布式锁,这里以排它锁为例进行说明:

分布式系统的所有服务节点可以竞争性地去创建同一个临时ZNode,由于Zookeeper不能有路径相同的ZNode,必然只有一个服务节点能够创建成功,此时可以认为该节点获得了锁。其他没有获得锁的服务节点通过在该ZNode上注册监听,从而当锁释放时再去竞争获得锁。锁的释放情况有以下两种:

  • 当正常执行完业务逻辑后,客户端主动将临时ZNode删除,此时锁被释放;
  • 当获得锁的客户端发生宕机时,临时ZNode会被自动删除,此时认为锁已经释放。

当锁被释放后,其他服务节点则再次去竞争性地进行创建,但每次都只有一个服务节点能够获取到锁,这就是排他锁。

5.5 集群管理

Zookeeper还能解决大多数分布式系统中的问题:

  • 如可以通过创建临时节点来建立心跳检测机制。如果分布式系统的某个服务节点宕机了,则其持有的会话会超时,此时该临时节点会被删除,相应的监听事件就会被触发。
  • 分布式系统的每个服务节点还可以将自己的节点状态写入临时节点,从而完成状态报告或节点工作进度汇报。
  • 通过数据的订阅和发布功能,Zookeeper还能对分布式系统进行模块的解耦和任务的调度。
  • 通过监听机制,还能对分布式系统的服务节点进行动态上下线,从而实现服务的动态扩容。

参考资料

  1. 倪超 . 从Paxos到Zookeeper——分布式一致性原理与实践 . 电子工业出版社 . 2015-02-01

更多大数据系列文章可以参见个人 GitHub 开源项目: 大数据入门指南

原文地址:https://www.cnblogs.com/danrenying/p/11073414.html

时间: 2024-10-21 13:54:57

ZooKeeper 系列(一)—— ZooKeeper核心概念详解的相关文章

Storm 系列(二)—— Storm 核心概念详解

一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的 Storm 流处理程序被称为 Storm topology(拓扑).它是一个是由 Spouts 和 Bolts 通过 Stream 连接起来的有向无环图,Storm 会保持每个提交到集群的 topology 持续地运行,从而处理源源不断的数据流,直到你将主动其杀死 (kill) 为止. 1.2 Streams(流) Stream 是 Storm 中的核心概念.一个 Stream 是一个无界的.以分布式方式并行创建和处理的

深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)[转]

上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, 本篇继续讲剩下的配置节点之一:typeAliases. typeAliases节点主要用来设置别名,其实这是挺好用的一个功能, 通过配置别名,我们不用再指定完整的包名,并且还能取别名. 例如: 我们在使用 com.demo.entity. UserEntity 的时候,我们可以直接配置一个别名user, 这样

&quot;MindManager&quot;学习iOS系列之&quot;CAAnimation-核心动画&quot;详解,让你的应用“动”起来。

"MindManager"学习iOS系列之"CAAnimation-核心动画"详解,思维导图内展示了CAAnimation-核心动画的大多数基本功能和知识,每个part都有代码讲解,展示出CAAnimation-核心动画的清晰轮廓,编者提供了"JPG"."SWF"."PDF"."Word"."Mmap"格式的源文件供给使用.注意:JPG格式仅为图片总览,SWF格式使用

进行概念详解 多线程上篇(二)

操作系统是程序与硬件交互的中间层,现代操作系统将程序的一次执行抽象为进程和线程的概念. 进程作为资源分配的基本单位,线程作为执行的基本单位. 进程和线程其实就是操作系统程序本身实现控制一个程序运行的数据项描述 所有的程序都是面向语言进行开发的,而语言本身是面向操作系统的,线程是操作系统对程序一次运行的抽象 所以,所有的多线程编程模型,必然遵从操作系统的大逻辑,必然是符合操作系统的对线程的抽象概念,操作系统在抽象之上提供了API供应用程序调用 简言之,应用程序的底层是借助于操作系统来完成多线程编程

LINUX 信号概念详解

LINUX 信号概念详解 我们运行如下命令,可看到Linux支持的信号列表: # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

第二十天 TCP 及socket通信原理、http协议及web服务、httpd核心配置详解

一.TCP及socket通信原理详解 二.http协议及web服务原理(一) 三.http协议及web服务原理(二) 四.httpd核心配置详解 1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      众所周知:0-1023:管理员才有权限使用,永久地分配给某应用使用(由IANA分配)      注册端口:1024-41951:只有一部分被注册,分配原则上非特别严格.      动态端口或私有端口:41952-65535:由内核分配临时端口,

varnish基础概念详解

varnish基础概念详解 比起squid更加轻量级,大致有以下几个特点: ·可以基于内存缓存,也可以在磁盘上缓存,但是就算存放在磁盘上,也不能实现持久缓存 只要进程崩溃,此前缓存统统失效,无论是在内存还是在磁盘,但是现在已经具备持久缓存功能,但是仍然在实验阶段,经常容易崩溃,而且最大大小不能超过1G 如果期望内存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或SSD X 2 做RAID 避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如

RAID0 RAID1 RAID3 RAID5 RAID6 RAID10 RAID50概念详解

RAID0 RAID1 RAID3 RAID5 RAID6 RAID10 RAID50概念详解摘要:RAID 0又称为Stripe或Striping(条带卷),它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求.这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能RAID 1又称为Mirror或Mirroring(镜像卷),它的宗旨是最大