高效编程:ZooKeeper分布式协同技术详解(一)

本文详细介绍了ZooKeeper在分布式系统中的作用,包括其主要功能、节点类型、会话机制、监视机制以及API使用。ZooKeeper提供了一种类似文件系统的数据存储结构,并通过会话管理和监视机制确保了分布式协调的可靠性。文章还讨论了ZooKeeper的API调用,包括同步和异步方法,以及在处理异常情况时的策略。
摘要由CSDN通过智能技术生成

ZooKeeper简介

ZooKeeper的主要作用是在分布式系统中协调多个任务。一个任务是指包含多个进程的任务,这个任务可以是协作或者竞争性质,协作意味多个进程需要一同处理某些事情,竞争则是多个进程不能同时处理工作,一个进程必须等待另一个进程。

ZooKeeper不适用于海量数据存储,海量数据存储可以使用数据库或者分布式文件系统。

分布式系统中的进程通信有两种方式:1、直接网络信息交换;2、共享读取空间。

在实际真实的系统中,需要考虑:消息延迟,处理器性能,以及时钟偏移问题

以主从应用架构为例,需要考虑一下几个问题:

1、           消息延迟:主节点崩溃,从节点崩溃,以及通信中断;

2、           处理器性能:任务分配

3、           时钟偏移:系统时间不同步

主从应用需要考虑的需求:

1、           主节点选举;

2、           崩溃检测(主节点必须有检测从节点崩溃或失去连接的能力);

3、           组成员关系管理;

4、           元数据管理

基础

ZooKeeper是以类似文件系统结构来存储数据,这样就可以保有文件系统的特性。针对ZooKeeper的znode节点,用户可以进行create /path data,delete /path ,exists /path, setData /path data,getData /path, getChildren /path等API方法。

Znode节点包括临时有序,临时无序,持久有序,持久无序四种节点。

此外,临时znode不允许拥有子节点。为什么不能拥有子节点?因为节点存在随时可能删除的情况,子节点如何处理呢?是不是要经常检测父节点,是不是要监视全部上级节点的变化,情况会变得异常复杂,另外如果子节点是持久的,在临时节点下的持久子节点怎么处理?

ZooKeeper的监视机制,监视点是一个单次触发的操作,必须在每次通知后设置设置新的监视点。

另外,Zookeeper采用版本的方式(乐观锁)机制完成ZooKeeper节点上的数据更新顺序。

ZooKeeper服务端运行在独立和仲裁两种模式。

ZooKeeper客户端与服务端的连接,必须在会话的机制之上。为什么需要会话机制?个人理解是:客户端和服务端时通过通信连接通道(例如TCP/IP)完成连接的,但是这种连接时存在闪断,断开等于业务无关的异常场景,不可能因为这些通用异常让业务层次上的通信重新断开和再初始化;那么就需要在业务层次上形成业务的通信连接(屏蔽掉底层通信异常),甚至可以形成会话之间的服务端与客户端之间的连接发生迁移,例如,服务端与客户端A之间的会话,可以运行在服务端与客户端B之间,只要客户端B可以识别会话即可。此外,服务端与客户端的连接可以生成多个会话而不仅仅说一个通信连接只有一个会话,这也就为业务复用连接提供了基础。

下面,我们就来理解会话。

ZooKeeper的会话实质就是业务的通信,那么会话必然存在一个声明周期(包括创建(NOT_Connected),连接中(Connecting),连接(Connected),终止(Closed))。

对于会话,还有存在超时机制,这样就为支持临时和持久机制奠定机制基础。对于服务端来说,如果客户端在设置的超时时限T时间内无消息传递过来,那么就假定会话超时失效;对于客户端来说,如果t/3时间没有接收到服务端信息,则客户端主动发起请求,在2t/3的时候还是没有请求,那么会寻找其他候选的服务器进行通信,维持会话。为什么是客户端需要多次确认,而不是服务端发起,显然考虑到的是服务端的压力比客户端的大(服务端接纳多个客户端)。

在选择服务器连接的时候,客户端的session里头会存在一个事务标识符(zkid,判定现在的信息到了哪一个时刻),客户端持久的zkid(zxid1)必须小于它要连接的服务端的指定会话中的zkid(zxid2)。如果zxid1>zxid2则服务端和客户端之间不能建立连接。  

使用API

ZooKeeper的API围绕ZooKeeper的句柄(Handler,代表与ZooKeeper服务端之间的一个会话)而构建。每隔API调用都需要传递这个句柄。

创建ZooKeeper句柄的构造函数是ZooKeeper(StringconnString,int SessionTimeOut,Watcherwatcher)。

其中,connString:连接URL;sessionTimeOout:标识ZK服务端等待客户端通信的最长时间,最后会生命会话已死;watcher:用于接收会话事件的一个对象,这个对象需要自己创建。

在创建ZooKeeper的节点时,需要处理的异常主要包括KeeperException和InterruptdException。

ConnectionLossException异常: 在客户端和ZooKeeper服务失去连接,客户端不知道服务端是否已经完成了节点的创建;在失去连接时,ZooKeeper的客户端库会后续请求重新建立连接,但是进程是必须要知道一个未知的请求是否已经处理了还是需要再次发送请求。可以在创建发生异常后通过getData请求获取是否已经自身已经创建成功。

InterruptedException异常:来源于客户端线程调用了Thread.interupt,通常是着因为应用程序关闭,但还在被其他相关应用方法使用。从字面来看这个异常,进程会中断本地客户端的请求处理的过程,并使得该请求处于未知状态。InterruptedException异常的处理依赖于程序的上下文环境。

ZooKeeper 同步与异步方法

在ZooKeeper中,所有的同步调用方法都有对应的异步调用方法。通过异步调用方法,我们可以在单线程中同时进行多个调用。例如:

异步操作的方法:1、提供了回调方法的对象,2、用户指定上下文信息(即回调方法调用是传入的对象实例)。【后面在研究CreateMode的类型?】。


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值