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()方法,确定是否可以执行该操作。源码如下:
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()方法,确定是否可以执行该操作。源码如下:
相关文章推荐
- win7删除一些顽固的文件夹
- B+树|MYSQL索引使用原则
- B+树|MYSQL索引使用原则
- B+树|MYSQL索引使用原则
- 3498 小木棍
- myeclipse 实现框架 spring+springmvc+springsecurity+myibatis+mysql用户认证和人员增删改查
- python+selenium识别验证码并登录
- 感受异或的神奇
- 第12周 数据结构和算法 线性表-5 栈-压入和弹出运算
- Linux下ln命令使用
- 第二阶段冲刺第十天
- Python介绍
- 1011
- freebsd 修改 ports 下载源
- 包和接口
- 设计模式系列1:单体模式(Singleton)
- ACM第四次练习—1009
- Geekband STL与泛型编程 第二周笔记 暗影行者
- info
- Linux下find命令使用