[Hbase]Hbase章3 Hbase单点故障
很长一段时间以来,一个region同一时间只能在一台RS(Region Server)中打开。如果一个region同时在多个RS上打开,就是multi-assign问题,会导致数据不一致甚至丢数据的情况,这是要避免和解决的。对于正常情况而言,region本质上是单点服务的,当RS宕机时,这个RS上的region无法提供服务,直到他们在另外的RS上重新上线为止。我们首先讨论这种单点服务会导致哪些问题,然后,看看有什么解决方案。
region单点导致的问题
从正常和异常两个方面对region单点可能导致的问题进行分析。因为region只在一台RS上assign,那这台RS直接决定了这个region的服务质量,RS发生的任何问题或多或少都会对region产生影响。
对于RS日常工作时出现的各种问题,导致的region服务质量问题,我们可以简单的将其称为“抖动”。导致抖动的原因包括:
- 非人为因素(不可预期的)
- GC问题:GC一直是java应用的老大难问题,尤其是对HBase这种高吞吐的后台系统,更是需要优化到极致
- 网络问题:TCP重传,丢包,closewait过多,队列满,网络硬件问题等等,都会导致RT升高或者请求超时
- 磁盘问题:坏盘,慢盘,io排队,通常会同时影响读和写。单个datanode变慢甚至会影响整个hdfs集群
- 其他硬件或操作系统问题:cpu,内存,系统时钟,OS内存管理,任何部件出现问题都会导致RS抖动
- 同RS的其他region有问题:有些region有问题,可能会把RS打爆,从而这个RS上所有的region都被影响了
- 人为因素(可预期的)
- balance:手工move/split/merge region,会导致短暂的服务停止
- 扩容/缩容:会产生大量的region move操作
- 升级:不同的升级手段会有不同的影响,通常比较温柔的升级策略都是把RS上的region移动到其他机器上,然后再重启。而不是直接暴力重启
- 误操作:这个就多了。。。
硬件和OS的问题可以暂时丢在一边,region本身的操作在高吞吐场景下会带来非常明显的影响。例如region做flush,意味着memstore的snapshot操作会锁住所有的请求。此时,新到达的读写请求会被阻塞,直到正在执行的读写请求全部完成。如果单个请求的平均执行时间都非常短(1ms至几个ms),那整个region锁住的时间也可以非常短;如果有比较大的batch写,或者scan,那锁住的时间就会变长,从而对单region的整体吞吐产生极大的影响。
考虑到HBase的设计目标是少量的大表,一个大表通常有很多的region(少则数百,多则几十万),单个region的吞吐被影响对于整体而言,通常不会导致明显的流量波动。但如果一个表有相当比例的region出现同时无法服务的情况,则这个影响就无法忽略。一个典型的场景就是修改表属性。比如修改压缩或者ttl之类的,此时master会对表的所有region进行批量reopen。同时有十几到几十个region在做reopen是非常正常的。
另外,如果是RS有问题(硬件问题,或者RS被某些region打爆了),则这个RS上所有的region会同时被影响。这时,影响域就会扩大,甚至产生连锁反应。比如一个以写吞吐为主的日志型或者监控型业务,通常都是大batch写入。一个batch写操作通常会写多个RS,那一个RS慢了,整个batch都会被拖慢。从而导致客户端排队,GC加重,整体吞吐下跌。
上面讲的都是RS日常工作中可能发生的问题,下面我们看一下RS宕机时的情况。RS的宕机处理的简要流程如下:
- master检测到RS宕机:zk临时节点超时,通常要30秒-1.5分钟
- 故障RS上的region重新assign到其他RS,很快,几秒
- HLog的split和replay:1分钟或者更长,取决于有多少数据要replay,以及集群的规模
一个比较难理解的事情是宕机检测居然需要这么久的时间。为什么zk超时时间要设置这么长?设置成几秒不行吗?这里主要的考虑是RS可能会假死,一个典型的假死场景就是RS发生FGC。对于比较大的堆,一次FGC做个几十秒甚至数分钟都是有可能的。如果zk超时设置过短,一次几十秒的FGC就可导致RS“被宕机”。而RS从FGC中恢复后,可以立即服务,但如果被认为是宕机,那后续的处理时间会更长,影响更大。
对于region的单点assign,从RS实际发生宕机到宕机处理完毕,通常需要数分钟甚至更长的时间,在这段时间里,故障机器上的region都无法提供服务。虽然HBase能够在宕机时能够自动恢复,但宕机带来的影响是确实存在的,对于业务来说,往往几分钟的不可用时间就足以带来困扰(比如网络游戏,服务器卡一下你都不能忍,更不要说卡几分钟了)。
可能的解决方案
对于抖动和宕机导致的region服务质量下降,我们可以有两个思路:
- 优化系统,减少抖动和宕机处理时间:
- 比如优化GC,系统参数调优,使用更高配置的机器和网络,将HDD更换为SSD
- 减少宕机检测时间,优化log split和replay,提高速度。
- 副本(冗余),一个reigon有问题时,切换到该region的其他副本中
第一条是必须做的,因为抖动问题就像卡在喉咙里的一根鱼刺,没有问题还好,一旦有问题,就让你疼的不行,甚至还会流点血。不小心扎破颈部大血管,就要打110了。减少宕机恢复时间是有上限的,在当前的硬件体系和能力下,软件做的再好通常也不能在几秒的时间里处理完宕机。所以,必须诉诸于副本方案。一个典型的副本方案就是主备集群。两个集群互为主备,一个挂了就切另一个。一般可以做到秒级检测和切换。但双集群部署会增加额外的成本,所以,HBase 1.x系列提供了单集群的冗余策略,region replica方案,即一个region同时在多个RS上打开,有主备,一写多读。原理上跟mysql的一写多读是类似的。
多副本方案要解决的难题就是一致性问题。目前比较常见的是基于paxos或者raft的一致性算法,在多个副本之间进行数据同步,比如tidb。
从长远来看,第一条是每个分布式存储系统的长期任务,第二条是现代系统要做到高可用所必须具备的能力,或者说目前的技术水平下,可以商用的最好方案。原理都差不多,各家拼的就是工程实现的优劣,即成本,一致性和性能。
[Hbase]Hbase章3 Hbase单点故障的更多相关文章
- CentOS6安装各种大数据软件 第六章:HBase分布式集群的配置
相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...
- hbase的常用的shell命令&hbase的DDL操作&hbase的DML操作
前言 笔者在分类中的hbase栏目之前已经分享了hbase的安装以及一些常用的shell命令的使用,这里不仅仅重新复习一下shell命令,还会介绍hbase的DDL以及DML的相关操作. hbase的 ...
- Hbase_02、Hbase的常用的shell命令&Hbase的DDL操作&Hbase的DML操作(转)
阅读目录 前言 一.hbase的shell操作 1.1启动hbase shell 1.2执行hbase shell的帮助文档 1.3退出hbase shell 1.4使用status命令查看hbase ...
- Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结
转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...
- HBase(四)HBase集群Shell操作
一.进入HBase命令行 在你安装的随意台服务器节点上,执行命令:hbase shell,会进入到你的 hbase shell 客 户端 [admin@node21 ~]$ hbase shell S ...
- 大数据技术之_11_HBase学习_02_HBase API 操作 + HBase 与 Hive 集成 + HBase 优化
第6章 HBase API 操作6.1 环境准备6.2 HBase API6.2.1 判断表是否存在6.2.2 抽取获取 Configuration.Connection.Admin 对象的方法以及关 ...
- HBase学习笔记之HBase的安装和配置
HBase学习笔记之HBase的安装和配置 我是为了调研和验证hbase的bulkload功能,才安装hbase,学习hbase的.为了快速的验证bulkload功能,我安装了一个节点的hadoop集 ...
- 【HBase】HBase Getting Started(HBase 入门指南)
入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程- ...
- HBase vs. BigTable Comparison - HBase对比BigTable
HBase vs. BigTable Comparison HBase is an open-source implementation of the Google BigTable architec ...
- hbase基本概念和hbase shell常用命令用法
1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...
随机推荐
- Spring Cloud Ribbon Client
首先,我们还是先从springcloud官方文档中找下相关说明,如下图所示,可以看到从1.2.0版本(也就是从Spriing Cloud Camden)之后,新增了这个通过配置文件来配置负载均衡的功能 ...
- tomcat实现https
第一步:生成key文件: C:\>keytool -genkey -alias tomcat -keyalg RSA -keystore C:\tomcat.key 密码最好设置默认change ...
- JMeter学习(三)元件的作用域与执行顺序(转载)
转载自 http://www.cnblogs.com/yangxia-test 1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它 ...
- oracleXE数据库没有公开wm_concat函数, 需要手动添加
CREATE OR REPLACE TYPE wm_concat_impl AUTHID CURRENT_USER AS OBJECT ( curr_str ), STATIC FUNCTION od ...
- java面试题:网络通信
网络分层 Q:OSI网络七层模型. Http Q:http协议的状态码有哪些?含义是什么? 200,服务器已成功处理了请求. 302,重定向. 400,错误请求. 401,未授权,请求要求身份验证. ...
- php的三种CLI常量:STDIN,STDOUT,STDERR
PHP CLI(command line interface)中,有三个系统常量,分别是STDIN.STDOUT.STDERR,代表文件句柄. 应用一: <?php while($line = ...
- elasticsearch的索引操作和文档操作总结
参考文档:https://es.xiaoleilu.com/010_Intro/00_README.html 一.索引操作 1.查看当前节点的所有的index 查看当前节点的所有的index [roo ...
- Java基本语法之动手动脑
1.枚举类型 运行EnumTest.java 运行结果:false,false,true,SMALL,MEDIUM,LARGE 结论:枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一 ...
- linux命令学习之:ls
ls命令用来显示目标列表,在Linux中是使用率较高的命令.ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件.语法 ls(选项)(参数) 选项说明 -a:显示所有档案及目录(ls内定将档案 ...
- 移动端meta行大全
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable= ...