Table of Contents
- RegionServer功能职责
-
- 租约管理
- Nonce管理
- 堆内存监控
- 健康检测
RegionServer功能职责
租约管理
HBase的租约管理功能主要应用在scan查询上,如果客户端执行scan操作以后,在60秒内没有将Scanner进行关闭,也没有显示的将租约移除,这时查询租约将会过期,RegionServer会强行关闭与之对应的Scanner,来防止无效连接数过多的情况发生。查询租约的过期时间可通过hbase.client.scanner.timeout.period参数来声明,默认为60秒。
在功能实现上租约管理逻辑主要是通过Leases类来封装的,其对内声明了如下数据结构用于存储所有的租约信息(租约信息通过Lease对象来封装)
leases : Map<String, Lease>
同时其还对外声明了createLease和cancelLease方法用于向leases集合中添加/删除租约。Leases线程启动后,其会循环遍历leases集合,一旦发现有租约已经过期,便通知其LeaseListener进行回调处理。而Lease对象主要实现了java的Delayed接口,可通过其getDelay方法来返回当前租约还有多久过期。
Nonce管理
客户端提交RPC申请之后,如果服务端的响应超时,其会将该申请重新发送,直至重试次数达到指定参数值之后,在退出申请逻辑。经过这样处理之后,服务端有可能出现如下问题:
拿append操作举例,原本客户端只想添加一条KeyValue数据到数据库中,但由于服务端的响应超时,会导致append申请重复多次发送,造成的结果是目标数据在服务端被多次添加,出现append操作冗余的情况。
为了防止该情况发生,HBase对外声明了nonce管理功能(通过ServerNonceManager类),客户端的每次申请及重复申请使用同一个nonce进行描述,发送到服务端以后,服务端会首先判断该nonce是否存在,如果不存在则可放心执行nonce所对应操作(如append或increment)。否则需要根据当前nonce的状态进行相应的回调处理:
- 如果nonce处于WAIT状态,表明该nonce所对应的操作正在被执行,当前线程需等待其执行结束,在根据其执行结果做进一步的处理;
- 如果nonce处于PROCEED状态,表明该nonce所对应的操作已经被执行,只不过执行结果以失败而告终,因此在这里可重新执行;
- 如果nonce处于DONT_PROCEED状态,表明该nonce所对应的操作已经成功被执行,这里无需在做处理。
因此,当nonce进入DONT_PROCEED状态以后,所有通过它来执行的操作都将被忽略掉,从而防止了操作冗余的情况发生。需要注意的是当nonce计入DONT_PROCEED或PROCEED状态后,其可存活的时间是受参数控制的(hbase.server.hashNonce.gracePeriod),默认为30分钟。30分钟之后,ServerNonceManager会将该nonce进行删除,通过其cleanUpOldNonces方法。
堆内存监控
- 当用于MemStore和BlockCache的堆内存百分比达到80%时,系统将会抛出异常。
因此在设置相关参数时,应满足如下判断条件:
hfile.block.cache.size + hbase.regionserver.global.memstore.size <= 0.8
- 堆内存的使用空间达到95%时,系统将会打印警告信息
95%的参数值是通过hbase.heap.occupancy.low_water_mark来设置的,相关警告信息如下:
heapOccupancyPercent is above heap occupancy alarm watermark
- 弹性调整MemStore和BlockCache的空间比例,但总大小不能大于堆内存的80%
当指定如下4个参数时,RegionServer会根据当前堆内存的使用情况对MemStore和BlockCache的大小做动态调整(通过HeapMemoryTuner来实现)。
memstore弹性空间:[hbase.regionserver.global.memstore.size.min.range, hbase.regionserver.global.memstore.size.max.range]
blockcache弹性空间:[hfile.block.cache.size.min.range,hfile.block.cache.size.max.range]
- 监控因GC所导致的应用暂停时间
如果暂停时间大于1秒(jvm.pause.info-threshold.ms参数控制),打印如下输出信息:
Detected pause in JVM or host machine (eg GC): pause of approximately...
如果暂停时间大于10秒(jvm.pause.warn-threshold.ms参数控制),同样打印上面的输出信息,只不过信息级别为WARN。具体的监控逻辑可参考org.apache.hadoop.hbase.util.JvmPauseMonitor.Monitor类的实现(HADOOP-9618)。
健康检测
RegionServer进程启动以后,会在后台开启HealthCheckChore线程,默认情况下会每隔10秒钟对RegionServer进行一次健康检测,看其是否处于健康状态,检测周期是通过hbase.node.health.script.frequency参数来声明的。
在检测过程中主要是执行hbase.node.health.script.location参数对应的脚本(示例脚本可参考hbase-examples/src/main/sh/healthcheck/healthcheck.sh),如果脚本在执行过程中出现以下异常情况:
(1)脚本执行的返回值不为0;
(2)脚本执行超时(超时时间通过hbase.node.health.script.timeout参数设置,默认为60秒);
(3)脚本执行过程中,打印了以ERROR开头的文字信息;
则RegionServer的健康检测将以失败而告终。而如果HealthCheckChore线程在循环过程中出现了3次(hbase.node.health.failure.threshold参数控制)健康检测失败的情况,并且前后两次失败的时间间隔小于30秒,其会认为RegionServer没有处于健康状态,会强行将其关闭,并打印如下信息:
The node reported unhealthy {threshold} number of times consecutively.
30秒的时间间隔是通过如下方式计算得出的:
hbase.node.health.script.frequency * hbase.node.health.failure.threshold
版权声明:本文为博主原创文章,未经博主允许不得转载。