1.HBase常见故障
导致RegionServer故障的起因:
1、FullGc引起长时间进展 2、HBase对Jvm堆内存治理不善,未正当应用堆外内存 3、Jvm启动参数配置不合理 4、业务写入或吞吐量太大 5、写入读取字段太大 HDFS异样: 读取写入数据都是间接操作hdfs的,若hdfs产生异样,会导致region server间接宕机 机器宕机: 1、物理节点间接宕机 2、虚构云主机不稳固,包含网络环境等 HBase Bug
2.HBase故障复原
Master复原:
1、Master次要负责实现集群的负载平衡和读写调度,没有直接参与用户的申请,所以整体负载并不高 2、热备形式实现Master高可用,zookeeper上进行注册 3、active master会接管整个零碎的元数据管理工作,zk以及meta表中的元数据,相应用户的治理指令,创立、删除、批改,merge region等
regionServer复原:
1、RegionServer宕机,HBase会检测到 2、Master将宕机RegionServer上所有region重新分配到集群中其它失常的RegionServer上 3、依据HLog进行失落数据恢复,复原之后对外提供服务
大略流程:
1、master通过zk实现对RegionServer的宕机检测。RegionServer会周期性的向zk发送心跳,超过肯定工夫,zk会认为RegionServer离线,发送音讯给master 2、切分为长久化的日志,所有region的数据都混合存储在同一个hlog文件里,为了使这些数据可能依照region进行组织回放,须要将hlog日志进行切分再合并, 同一个region的数据合并在一起,不便后续依照region进行数据恢复。 3、master重新分配宕机regionserver上的所有region,regionserver宕机后,所有region处于不可用状态,所有路由到这些region上的申请都会返回异样。 异常情况比拟短暂,master会将这些region调配到其它regionserver上。 4、回放HLog日志补救数据 5、复原实现,对外提供读写服务
具体流程:
1、master检测regionserver宕机 regionserver启动后会在zk的 /rs节点上注册一个长期子节点,超时后长期节点会主动隐没,并告诉watch在该长期节点上的其它客户端。 master会watch在/rs节点上,子节点一旦离线会告诉master。 长时间的FullGc也会使得心跳进行。zookeeper.session.timeout,默认180s。对提早要求高,参数设短。迅速检测到异样,离线集群设置长。 2、切分未长久化数据的HLog 对HLog中的region进行分组,每个region的数据合并放在一起,不便后续依照region进行回放,这个分组过程称为HLog切分。 2.1、LogSplitting策略: 某台regionserver宕机,/hbase/WALs/bj-hadoop01,123456,789456 为HLog存储在hdfs上的门路。 日志切分就是将这个目录下所有HLog文件的所有kv依照region进行分组。 2.1.1、将/hbase/WALs/bj-hadoop01,123456,789456 重命名为 /hbase/WALs/bj-hadoop01,123456,789456-splitting 因为某些场景region server并没有真正宕机,region server与zk网络异样,与外网之间的网络失常,用户并不知道 region server宕机,写入更细操作还会持续发送到该region server上。该region server还能持续工作,接管用户 申请,不重命名日志文件夹,回放生master曾经在应用hlog进行故障复原了,但region server还在一直的写入hlog,数据不统一。 重命名后用户的写申请会异样终止,不会呈现数据不统一的状况。 客户端失落数据 2.1.2、启动读线程一次读取每个HLog中的数据,写入不同的buffer中,每个buffer对应一个region 2.1.3、切分实现后写成文件。 该办法效率差,切分过程只有master参加,集群宕机,须要复原大量数据,可能有几百G,master单机切分可能须要几小时。 切分过程中一旦出现异常会导致整个集群故障复原不能失常实现。 2.2、Distributed Log Splitting: master和所有region server的计算能力进行日志切分,master是协调者,region server是理论工作者。 2.2.1、不同region server抢不同的hlog,抢到后发给hlogsplitter线程进行解决,对日志执行具体切分。将数据进行region归类。 2.2.2、将buffer中的数据写入文件,对数据进行回放。 Distributed Log Splitting 放慢故障复原过程,能够将故障复原工夫降到分钟级别。但会产生很多小文件。 小文件数: M * N, M:待切分的总Hlog数量 N:一个宕机region server上的region个数 一台region server上200个region,90个hlog。宕机后复原过程会创立18000个小文件。若多个region server宕机,小文件会更多。 2.3、Distributed Log Replay: 在2.2的根底上不进行文件的写入,而是读取出数据后间接进行回放,大大减少小文件的读写IO耗费。
3.故障耗费工夫优化
HBase故障复原流程:
- 故障检测
- 数据切分
- region上线
- 数据回放
4.优化点
region server在为5000个region切分hlog时,须要为每个region关上一个writer。不同region的数据写到不同writer,HBase的每一个writer须要耗费3个不同的DataNode各一个Xceiver线程。Xceiver线程次要接管
hdfs客户端发过来的数据包。hdfs上的Xceiver线程个数是有的,默认4096。2台region server宕机,须要消
耗5000 3 2 = 30000个Xceiver线程,超过了hdfs集群的限度,datanode会报错给hbase,耗尽整个hdfsd
集群的Xceiver线程而始终无奈复原。
优化思路:
管制writer的个数,即便一个region server上的region有5000个,也不能关上5000个writer。
为每个Region设置一个缓冲池,每个region的缓冲池有一个阈值下限,如果遇到一条新的HLog Entry,
发现对应的region缓冲池没有达到下限,则间接写缓冲池,否则选出以后所有缓冲池中超过阈值的缓冲池集
合,将这个集群中的缓冲池一次刷新成hdfs上一个新文件。这个过程是放到writer池中实现的,能保障在任意
时刻最多只有指定个数的writer在写数据文件。不会造成Xceiver耗尽。