Hbase在小米中的应用

简介

1、在hbase上层开发结构化存储和对象存储服务。

2、基础架构图

Hbase在小米中的应用

Hbase上层为存储服务,其中OpenTSDB为时序数据存储服务

3、数据备份机制:热备、冷备、Point-in-time

热备:通过replication将主hbase集群的数据备份到备hbase集群

冷备:对用户的一些表定期的进行snapshot,通过MR任务把snapshot拷贝到一个异构的其他存储服务中(如S3)

Point-in-time:通过Point-in-time recovery存储服务,由于snapshot只能备份某个时间点之前的数据,对于这个时间点之后的数据修改通过replication同步到消息队列中,然后sink到其他存储服务中,这时,便有了这个时间点之前的数据备份和之后对于数据的修改日志,可以进行数据恢复等操作

Hbase在小米中的应用

4、提供平台化服务,离不开多租户
对于多租户,使用物理隔离和Quota限流
物理隔离:Hbase独享HDFS,在线和离线分开,在线分为SSD和HDD,根据请求选择不同集群进行接入

Quota和throttling(限流)

一、rpc限流模型
Hbase在小米中的应用

linstener会监听已经就绪的channel
reader会把请求从lintener读出来并交给scheduler进行分发
scheduler会根据不同的请求分发给不同的queue
queue会将请求交给handler进行具体的计算

在shceduler在分发请求之前,会根据用户设置的quota和当前的系统的负载情况对请求进行限流

二、quota类型:
Hbase在小米中的应用

每一种组合为一种quota

可以为regionServer设置quota,防止RegionServer因为热点数据挂掉

将number和size相乘为quota

以上为hard limit

也可以为soft limit,也就是在集群资源使用率不高数可以允许请求超过设置的quota,可以提供集群资源利用率

三、改进:

1、为quota设置开关,之前开关quota需要重启整个集群
2、改进了一些异常
3、离线任务发生throtting时可以自动的进行sleep + retry
4、对大的请求进行惩罚

同步复制

一、hbase自带的异步复制
Hbase在小米中的应用
客户端向hbase写数据时会同时向RegionServer的mem和位于HDFS上的WAL写数据,都写入成功时才告诉客户端写入成功

在active cluster中的每个RegionServer上,都会开启一个独立的线程,不断的读取WAL文件,并将数据复制到standby cluster中的RegionServer上。

但是,当active集群挂掉时,有一些数据没复制过去,这事切换到standby时会发生用户刚写入成功的数据查询不到

二、改进:

Hbase在小米中的应用

客户端向hbase写数据时会同时向RegionServer的mem和位于HDFS上的WAL写数据,同时还会向standby写入Remote WAL,三者都写入成功时才告诉客户端写入成功

三、集群在系统中的三种状态:
Hbase在小米中的应用

standby需要先提升到Downgrade Active然后在升到Active

四、创建同步复制:

Hbase在小米中的应用

第一步:两个集群均为Downgrade Active

第二步:备集群降级为standby
第三步:主集群升级为active

通过DualAsyncFSWAL向两边同时写WAL和remote WAL

五、写数据结果:
客户端在写入数据时可能会收到三种结果:
成功、失败、超时
发生超时时,可能是主集群的WAL写入成功,备集群的remote WAL写入超时,这时主的数据多于备的数据
也可能是主的WAL超时,备的remote WAL成功,这时主的数据少于备的数据
也可能都发生超时,谁多不一定

同步复制要求保证主备集群的数据最终是一致的

六:具体问题解决办法:

1、主集群的一个RegionServer挂掉时:

正常情况下RegionServer挂掉可以:

1.对WAL进行split
2.将这个RegionServer上的region放到其他RegionServer上
3.其他RegionServer在打开这个region时会与WAL合并,从而恢复数据

在同步复制时:

需要在split之前。将WAL文件复制到备集群的remote WAL下,替换掉之前的remote WAL(可以保证主备之间数据一致)
后续都一样

2、备集群挂掉时:

这时主备之间的异步复制会中断

第一步:把主集群降级为Downgrade Active,这时写数据时不会再写备集群了

第二步:等备集群恢复时,再讲Downgrade Active升级为Active

3、主机群挂掉时:

需要切换集群

第一步:将standby的集群升级为Downgrade Active
在这步需要把remote WAL目录rename,防止主集群突然正常又可以写的情况出现,重命名之后即使主集群正常了也无法写remote WAL。还需要读取remote WAL进行回放,将数据合并。还需要这个Downgrade Active集群不允许接受异步复制了。

第二步:将Downgrade Active提升为Active,当之前挂掉的Active恢复后降级为standby