您的位置:首页 > 其它

Hbase-0.98.6源码分析--Nonce管理机制源码分析

2016-06-19 11:10 337 查看
       在《Hbase-0.98.6源码分析--Put写操作Client端流程》这篇文章中,我们介绍了Put写操作在Client端的操作流程,在介绍其中submit()方法的时候,出现了一个陌生的名词——Nonce机制,今天就来仔细的介绍下不可或缺的Nonce管理机制。

        HBase具有很强大的容错特性,而在网络世界,网络出现不稳定状况是默认一定,HBase肯定对此进行了针对性的容错处理,即客户端提交RPC请求之后,由于各种原因,服务器端的响应很可能会超时,会出现服务端已经处理完毕,但是无法通知客户端的情况。此时客户端没有收到回应,会将申请重新发送,直到重试次数达到指定参数之后,才退出申请逻辑。但这样的处理方式也会引发如下的一系列问题:拿append操作为例,原本客户端只想添加一条KeyValue数据到数据库,但由于服务端响应超时,会导致append申请重复多次发送,造成的结果是是目标数据在服务端被多次添加,出现append操作冗余的情况。

       那么HBase是如何解决上述的问题呢?

       为了防止该情况发生,HBase对外声明了Nonce管理功能(通过ServerNonceManager类),客户端的每次申请及重复申请使用同一个nonce进行描述,发送到服务端以后,服务端会首先判断该nonce是否存在,如果不存在则可放心执行nonce所对应操作(如append或increment)。否则需要根据当前nonce的状态进行相应的回调处理:

       1、如果nonce处于WAIT状态,表明该nonce所对应的操作正在被执行,当前线程需等待其执行结束,在根据其执行结果做进一步的处理;

       2、如果nonce处于PROCEED状态,表明该nonce所对应的操作已经被执行,只不过执行结果以失败而告终,因此在这里可重新执行;

       3、如果nonce处于DONT_PROCEED状态,表明该nonce所对应的操作已经成功被执行,这里无需在做处理。

       因此,当nonce进入DONT_PROCEED状态以后,所有通过它来执行的操作都将被忽略掉,从而防止了操作冗余的情况发生。需要注意的是当nonce计入DONT_PROCEED或PROCEED状态后,其可存活的时间是受参数控制的(hbase.server.hashNonce.gracePeriod),默认为30分钟。30分钟之后,ServerNonceManager会将该nonce进行删除,通过其cleanUpOldNonces方法。

       在HRegionServer中,有一个ServerNonceManager类型的成员变量nonceManager,由它负责管理该RegionServer上的nonce。其定义如下:



       在ServerNonceManager类内部,存在一个内部类OperationContext,它定义了nonce的三种状态:



       ServerNonceManager类中有一个十分重要的方法,用于当一个操作在服务端执行后未及时反馈响应给客户端,客户端重新发起携带相同nonceGroup和nonce的同一操作的请求时,服务端根据nonceGroup和nonce做相应的判断。定义如下:



      在HRegionServer的append()方法中,就采用了Nonce管理:



       其中,startNonceOperation()方法会调用RegionServer上nonceManager的startOperation()方法,确定是否可以执行该操作。源码如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: