1、巡检
HBase 是使用 HDFS 作为底层存储的 NoSQL 数据库,提供了满足实时性和随即读写功能的数据库服务。
每日早晚巡检 HBase 服务,检查各集群的 HMaster 和 RegionServer 状态,是否事务积压等问题。
1.1、查看CM HBase 的整体状态
1.HBase 的状态,目前看没有严重警告
2.查看集群读写请求量
3.查看总 Region 数,有 4 万+的 Region
平均每个 RegionServer 有 1000+的 region,已经比较高了,有风险
4.Master 状态查看,GC 时候有点高
5.查看单个 RegionServer 情况
1.2、查看备用HMaster
每个库正常来说都有 3 个主节点,一个正在跑,两个备用,如图所示。
1.3、查看Requests Per Second 和 Num. Regions
若为图中所示为 0,则需要登录主机查看,通常这种情况会发生在重启节点主机后发生
1.4、查看Software Attributes
图中所示,比较重要的是两个标出部分:
1:代表着本库的 zookeeper 节点,如果出现异常,总数会不正常的
2:代表着本库的平均 region 数,理论超过 300 就要进行合并操作的,但这个是根据业务的需求进行操作,业务侧提出数据库卡顿了,再进行合并操作即可
1.5、查看Dead Region ServeRegionServer
登录 HBase UI,若有 HBaseregionserver 宕掉的节点,则页面上会显示出如下情况:
出现这种情况,则说明有非正常节点,可以尝试登陆该故障节点,查看故障原因(如 HBase 进程消失,主机意外重启,主机死机等)
2、参数调优
2.1、Region 相关参数
hbase.hregion.max.filesize
默认 10G,Region 中任意 HStore 所有文件大小总和大于该值就会进行分裂。实际生产环境中该值不建议太大,也不能太小,太大会导致系统后台执行 compaction 消耗大量系统资源,一定程度上影响业务响应;太小会导致
Region 分裂比较频繁,分裂本身其实对业务读写会有一定影响,使单个RegionServer 中存在大量 Region,太多 Region 会消耗大量维护资源,并且在 RegionServer 下线迁移时比较耗时。建议线上设置为 50G~80G 左右。
2.2、BlockCache 相关参数
BlockCache 相关的参数非常多,不同 BlockCache 策略对应不同的参数,RegionServer 内存在 20G 以内的就选择 LRUBlockCache,大于 20G 的就选择 BucketCache 中的 Offheap 模式。
BucketCache 的 offheap 模式配置:
file.block.cache.size:默认 0.4,该值用来设置 LRUBlockCache 的内存大小,0.4 表示JVM 内存的 40%,当前HBase 系统默认采用LRUBlockCache策略,BlockCache 大小和 Memstore 大小均为 JVM 的 40%。但对于
BucketCache 策略来讲,Cache 分为了两层,L1 采用 LRUBlockCache,主要存储 HFile 中的元数据 Block,L2 采用 BucketCache,主要存储业务数据Block。因为只用来存储元数据 Block,所以只需要设置很小的 Cache 即可。建议线上设置为 0.05~0.1 左右。
hbase.bucketcache.ioengine:offheap
hbase.bucketcache.size:堆外存大小,设置多大就看自己的物理内存大小了
2.3、刷写参数
HBase 写入数据时会先写 WAL 日志,再将数据写到写缓存 MemStore 中,等写缓存达到一定规模或其他触发条件时会 Flush 刷写到磁盘,生成一个 HFile 文件,这样就将磁盘随机写变成了顺序写,提高了写性能。
随着时间推移,写入的 HFile 会越来越多,读取数据时就会因为要进行多次 io 导致性能降低,因此 HBase 会定期执行 Compaction 操作以合并减少HFile 数量,提升读性能。
触发条件和参数
有 7 种情况会触发 Flush:
1)当一个 MemStore 大小达到阈值hbase.hregion.memstore.flush.size(默认128M)时,会触发MemStore 的刷写,此时不会阻塞写请求。
2)当一个 Region 中所有 MemStore 总大小达到hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size ( 默认 4*128M=512M ) 时, 会触发 MemStore 的刷写, 并阻塞 Region 所有的写请求, 此时写数据会出现 RegionTooBusyException 异常。
3)当一个 RegionServer 中所有 MemStore 总大小达到hbase.regionserver.global.memstore.size.lower.limit* hbase.reg ionserver.global.memstore.size * hbase_heapsize( 低水位阈值,默认 0.95 * 0.4 * RS 堆大小) 时, 会触发 RegionServer 中内存占用大的 MemStore 的刷写; 达到hbase.regionserver.global.memstore.size * hbase_heapsize ( 高水位阈值, 默认 0.4 * RS 堆大小) 时, 不仅会触发 Memstore 的刷写,还会阻塞 RegionServer 所有的写请求,直到 Memstore 总大小降到低水位阈值以下。
4)当一个 RegionServer 的 HLog 即 WAL 文件数量达到上限( 可通过参数 hbase.regionserver.maxlogs 配置, 默认 32) 时, 也会触发MemStore 的 刷 写 , HBase 会 找 到 最 旧 的 HLog 文 件 对 应 的Region 进行刷写 。
5)当一个 Region 的更新次数达到hbase.regionserver.flush.per.changes( 默认 30000000 即 3 千万) 时, 也会触发 MemStore 的刷写。
6)定期 hbase.regionserver.optionalcacheflushinterval( 默认3600000 即一个小时)进行 MemStore 的刷写,确保 MemStore 不会长时间没有持久化。 为避免所有的 MemStore 在同一时间进行flush 而导致问题, 定期的 flush 操作会有一定时间的随机延时。
7)手动执行 flush 操作,我们可以通过 hbase shell 或 API 对一张表或一个 Region 进行 flush。
上面是 Flush 的几个触发条件,5 个和 Flush 有关的重要参数及调整建议:
hbase.hregion.memstore.flush.size
默认值 128M, 单个 MemStore 大小超过该阈值就会触发 Flush。如果当前集群 Flush 比较频繁,并且内存资源比较充裕,建议适当调整为 256M。调大的副作用可能是造成宕机时需要分裂的 HLog 数量变多, 从而延长故障恢复时间。
hbase.hregion.memstore.block.multiplier
默认值 4,Region 中所有 MemStore 超过单个 MemStore 大小的倍数达到该参数值时, 就会阻塞写请求并强制 Flush。一般不建议调整, 但对于写入过快且内存充裕的场景, 为避免写阻塞, 可以适当调整到 5~8。
hbase.regionserver.global.memstore.size
默 认 值 0.4 , RegionServer 中 所 有 MemStore 大 小 总 和 最 多占 RegionServer 堆内存的 40%。这是写缓存的总比例,可以根据实际场景适当调整,且要与 HBase 读缓存参数 hfile.block.cache.size( 默 认 也 是 0.4 ) 配 合 调 整 。 旧 版 本 参 数 名 称为 hbase.regionserver.global.memstore.upperLimit。
hbase.regionserver.global.memstore.size.lower.limit
默认值 0.95,表示 RegionServer 中所有 MemStore 大小的低水位是 hbase.regionserver.global.memstore.size 的 95%, 超过该比例 就 会 强 制 Flush 。 一 般 不 建 议 调 整 。 旧 版 本 参 数 名 称为 hbase.regionserver.global.memstore.lowerLimit。
hbase.regionserver.optionalcacheflushinterval
默 认 值 3600000 ( 即 1 小 时 ) , HBase 定 期 Flush 所 有MemStore 的时间间隔。一般建议调大,比如 10 小时,因为很多场景下 1 小时 Flush 一次会产生很多小文件, 一方面导致 Flush 比较频繁, 另一方面导致小文件很多, 影响随机读性能, 因此建议设置较大值。
\
2.4、合并相关参数
HBase 会定期执行 Compaction 合并 HFile,提升读性能,其实就是以短时间内的 io 消耗, 换取相对稳定的读取性能。
Compaction 类型分为两种: Minor Compaction 与 Major Compaction, 可以称为小合并、大合并, 简单示意图:
Minor Compaction 是指选取一些小的、相邻的 HFile 将他们合并成一个更大的 HFile,Minor Compaction 会删除选取 HFile 中的 TTL 过期数据。
Major Compaction 是指将一个 Store 中所有的 HFile 合并成一个 HFile, 这个过程会清理三类没有意义的数据: 被删除的数据( 打了 Delete 标记的数据)、TTL 过期数据、版本号超过设定版本号的数据。另外, 一般情况下, Major Compaction 时间会持续比较长, 整个过程会消耗大量系统资源, 对上层业务有比较大的影响。因此, 生产环境下通常关闭自动触发 Major Compaction 功能, 改为手动在业务低峰期触发。
Compaction 触发时机
HBase 会在三种情况下检查是否要触发 Compaction, 分别是MemStore Flush、后台线程周期性检查、手动触发。
1)MemStore Flush: 可以说 Compaction 的根源就在于 Flush,MemStore 达到一定阈值或触发条件就会执行 Flush 操作,在磁盘上生成 HFile 文件,正是因为 HFile 文件越来越多才需要 Compact。HBase 每次 Flush 之后, 都会判断是否要进行 Compaction, 一旦满足 Minor Compaction 或 Major Compaction 的条件便会触发执行。
2)后台线程周期性检查: 后台线程 CompactionChecker 会定期检查 是 否 需 要 执 行 Compaction , 检 查 周 期 为hbase.server.thread.wakefrequency * hbase.server.compactchecker.interval.multiplier , 这里主要考虑的是一段时间内没有写入仍然需要做 Compact 检查。 其中参数hbase.server.thread.wakefrequency 默认值 10000 即 10s , 是HBase 服 务 端 线 程 唤 醒 时 间 间 隔 , 用 于 LogRoller 、MemStoreFlusher 等的周期性检查; 参数hbase.server.compactchecker.interval.multiplier 默认值 1000 , 是 Compaction 操作周期性检查乘数因子, 10 * 1000 s 时间上约等于 2hrs, 46mins, 40sec 。
3)手动触发: 通过 HBase Shell、Master UI 界面或 HBase API 等任一种方式执行 compact 、 major_compact 等命令, 会立即触发Compaction
Compaction 核心参数
1)hbase.hstore.compaction.min
默认值 3,一个 Store 中 HFile 文件数量超过该阈值就会触发一次 Minor Compaction,这里称该参数为 minFilesToCompact。一般不建议调小,重写场景下可以调大该参数,比如 5~10 之间。老版本参数名称为hbase.hstore.compactionthreshold。
2)hbase.hstore.compaction.max
默认值 10,一次 Minor Compaction 最多合并的 HFile 文件数量,这里称该参数为 maxFilesToCompact。这个参数也控制着一次压缩的耗时。一般不建议调整,但如果上一个参数调整了,该参数也应该相应调整,一般设为 minFilesToCompact 的 2~3 倍 。
3)hbase.regionserver.thread.compaction.throttle
评估单个 compaction 为 small 或者 large 的判断依据。为了防止 large compaction 长时间执行阻塞其他 small compaction,hbase 将这两种compaction 进行了分离处理,每种 compaction 会分配独立的线程池HBase RegionServer 内部设计了两个线程池 large compactions 与 small compactions,用来分离处理 Compaction 操作,该参数就是控制一个Compaction 交由哪一个线程池处理,默认值是 2 * maxFilesToCompact hbase.hregion.memstore.flush.size(默认 210*128M=2560M 即 2.5G), 建议不调整或稍微调大。
4)hbase.regionserver.thread.compaction.large/small
默认值 1,表示 large compactions 与 small compactions 线程池的大小。一般建议调整到 2~5,不建议再调太大比如 10,否则可能会消费过多的服务端资源造成不良影响。
5)hbase.hstore.blockingStoreFiles
默认值 10,表示一个 Store 中 HFile 文件数量达到该值就会阻塞写入,等待 Compaction 的完成。一般建议调大点,比如设置为 100,避免出现阻塞更新的情况,阻塞日志如下:
too many store files; delaying flush up to 90000ms
生产环境建议认真根据实际业务量做好集群规模评估,如果小集群遇到了持续写入过快的场景,合理扩展集群也非常重要。
6)hbase.hregion.majorcompaction
默认值 604800000 ms 即 7 天,这是 Major Compaction 周期性触发执行的时间间隔。通常 Major Compaction 持续时间较长、资源消耗较大,一般设为 0,表示关闭自动触发,建议在业务低峰期时手动执行。
2.5、HLog 相关参数
1)hbase.regionserver.maxlogs
默认为 32,region flush 的触发条件之一,wal 日志文件总数超过该阈值就会强制执行 flush 操作。该默认值对于很多集群来说太小,生产线上具体设置参考 HBASE-14951
2)hbase.regionserver.hlog.splitlog.writer.threads
默认为 3,regionserver 恢复数据时日志按照 region 切分之后写入 buffer, 重新写入 hdfs 的线程数。生产环境因为 region 个数普遍较多,为了加速数据恢复,建议设置为 10。
2.6、Call Queue 相关参数
1)hbase.regionserver.handler.count
默认为 30,服务器端用来处理用户请求的线程数。生产线上通常需要将该值调到 100~200。
解读:response time = queue time + service time,用户关心的请求响应时间由两部分构成,优化系统需要经常关注 queue time,如果用户请求排队时间很长,首要关注的问题就是 hbase.regionserver.handler.count 是否没有调整。
2)hbase.ipc.server.callqueue.handler.factor
默认为 0,服务器端设置队列个数,假如该值为 0.1,那么服务器就会设置handler.count * 0.1 = 30 * 0.1 = 3 个队列。
3)hbase.ipc.server.callqueue.read.ratio
默认为 0,服务器端设置读写业务分别占用的队列百分比以及 handler 百分比。假如该值为 0.5,表示读写各占一半队列,同时各占一半 handler。
2.7、其他参数
1)hbase.online.schema.update.enable
默认为 false,表示更新表 schema 的时候不再需要先 disable 再 enable,直接在线更新。该参数在 HBase 2.0 之后将会默认为 true。生产线上建议设置为true。
2)hbase.quota.enabled
默认为 false,表示是否开启 quota 功能,quota 功能主要用来限制用户/表的QPS,起到限流作用。生产线上建议设置为 true。
3)hbase.snapshot.enabled
默认为 false,表示是否开启 snapshot 功能,snapshot 功能主要用来备份HBase 数据。生产线上建议设置为 true。
4)zookeeper.session.timeout
默认 180s,表示 zookeeper 客户端与服务器端 session 超时时间,超时之后RegionServer 将会被踢出集群。
解读:有两点需要重点关注,其一是该值需要与 Zookeeper 服务器端 session 相关参数一同设置才会生效,一味的将该值增大而不修改 ZK 服务端参数,可能并不会实际生效。其二是通常情况下离线集群可以将该值设置较大,在线业务需要根据业务对延迟的容忍度考虑设置。
5)hbase.zookeeper.useMulti
默认为 false,表示是否开启 zookeeper 的 multi-update 功能,该功能在某些场景下可以加速批量请求完成,而且可以有效防止部分异常问题。生产线上建议设置为 true。注意设置为 true 的前提是 Zookeeper 服务端的版本在 3.4 以上,否则会出现 zk 客户端夯住的情况。
3、运维
3.1、扩容
同HDFS扩容
3.2、退役
1)CM 操作退役:
2)命令行操作退役:
bin/graceful_stop.sh hadoop1
然后关闭 regionserver
hbase-daemon.sh stop regionserver 启动平衡
hbase> balance_switch truebin/graceful_stop.sh hadoop1
3.3、预分区
3.3.1、分区过多的影响
1.频繁刷写
Region 的一个列族对应一个 MemStore,假设 HBase 表都有统一的 1 个列族配置,则每个 Region 只包含一个 MemStore。通常 HBase 的一个MemStore 默认大小为 128 MB,见参数hbase.hregion.memstore.flush.size。当可用内存足够时,每个 MemStore 可以分配 128 MB 空间。当可用内存紧张时,假设每个 Region 写入压力相同, 则理论上每个 MemStore 会平均分配可用内存空间。
因此,当节点 Region 过多时,每个 MemStore 分到的内存空间就会很小。这个时候,写入很小的数据量就会被强制 Flush 到磁盘,将会导致频繁刷写。频繁刷写磁盘,会对集群 HBase 与 HDFS 造成很大的压力,可能会导致不可预期的严重后果。
2.压缩风暴
因 Region 过多导致的频繁刷写,将在磁盘上产生非常多的 HFile 小文件, 当小文件过多的时候 HBase 为了优化查询性能就会做 Compaction 操作,合并 HFile 减少文件数量。当小文件一直很多的时候,就会出现 "压缩风暴"。
Compaction 非常消耗系统 io 资源,还会降低数据写入的速度,严重的会影响正常业务的进行。
3.MSLAB 内存消耗较大
MSLAB(MemStore-local allocation buffer)存在于每个 MemStore 中,主要是为了解决 HBase 内存碎片问题,默认会分配 2 MB 的空间用于缓存最新数据。如果 Region 数量过多,MSLAB 总的空间占用就会比较大。比如当前节点有 1000 个包含 1 个列族的 Region,MSLAB 就会使用 1.95GB 的堆内存,即使没有数据写入也会消耗这么多内存。
4.Master Assign Region 时间较长
HBase Region 过多时 Master 分配 Region 的时间将会很长。特别体现在重启 HBase 时 Region 上线时间较长,严重的会达到小时级,造成业务长时间等待的后果。
5.影响 MapReduce 并发数
当使用 MapReduce 操作 HBase 时,通常 Region 数量就是 MapReduce 的任务数,Region 数量过多会导致并发数过多,产生过多的任务。任务太多将会占用大量资源,当操作包含很多 Region 的大表时,占用过多资源会影响其他任务的执行。
计算分区合理的数量:
通常情况下每个节点拥有 20200 个 Region 是比较正常,每个RegionServer 的最大 Region 数量由总的 MemStore 内存大小决定,每个Region 的每个列族对应一个 MemStore,假设 HBase 表都有统一的 1 个列族配置,那么每个 Region 只包含一个 MemStore,一个 MemStore 大小通常在 128256 MB,见参数 hbase.hregion.memstore.flush.size。默认情况下,
RegionServer 会将自身堆内存的 40%(见参数hbase.regionserver.global.memstore.size)供给节点上所有 MemStore 使用,如果所有 MemStore 的总大小达到该配置大小,新的更新将会被阻塞并且会强制刷写磁盘。因此,每个节点最理想的 Region 数量应该由以下公式计算(假设 HBase 表都有统一的列族配置):
Region.nums = ((RegionServer memory) * (total memstore fraction)) / ((memstore size)*(column families))
其中:
RegionServer memory:表示 regionserver 堆内存大小,即HBASE_HEAPSIZE。
total memstore fraction:表示所有 MemStore 占 HBASE_HEAPSIZE 的比例,HBase0.98 版本以后由 hbase.regionserver.global.memstore.size 参数控制,老版本由 hbase.regionserver.global.memstore.upperLimit 参数控制,默认值 0.4。
memstore size:即每个 MemStore 的大小,原生 HBase 中默认 128M。column families:即表的列族数量,通常情况下只设置 1 个,最多不超过 3 个。
假如一个集群中每个 RegionServer 的堆内存是 32GB,那么节点上最理想的 Region 数量应该是 32768*0.4/128 ≈ 102,所以,当前环境中单节点理想情况下大概有 102 个 Region。
这种最理想情况是假设每个 Region 上的填充率都一样,包括数据写入的频次、写入数据的大小,但实际上每个 Region 的负载各不相同,可能有的Region 特别活跃负载特别高,有的 Region 则比较空闲。所以,通常我们认为23 倍的理想 Region 数量也是比较合理的,针对上面举例来说,大概200300 个 Region 算是合理的。
如果实际的Region 数量比23 倍的计算值还要多,就要实际观察Region 的刷写、压缩情况了,Region 越多则风险越大,如果单节点 Region 数量过千, 集群可能存在较大风险, 在生产环境中,如果一个 regionserver 节点的Region 数量在 20200 我们认为是比较正常的,但是我们也要重点参考理论合理计算值。如果每个 Region 的负载比较均衡,分区数量在 2~3 倍的理论合理计算值通常认为也是比较正常的。
3.4、定位数据热点
查看 regionsever 的请求状态
查看表 region 的请求状态
3.5、开启 MSLAB 功能
为了减少内存碎片化,改善 Full GC 发生的情况,MemStore 会在内部维护一个 2M 大小的 Chunk 数组,当写入数据时会先申请 2M 的 Chunk, 将实际数据写入该 Chunk 中,当该 Chunk 满了以后会再申请一个新的Chunk。这样 MemStore Flush 后会达到粗粒度化的内存碎片效果,可以有效降低 Full GC 的触发频率。
HBase 默认是开启 MSLAB 功能的,和 MSLAB 相关的配置包括:
hbase.hregion.memstore.mslab.enabled:MSLAB 开关,默认为 true
hbase.hregion.memstore.mslab.chunksize:每个 Chunk 的大 小,默认为2MB,建议保持默认值。
hbase.hregion.memstore.chunkpool.maxsize:内部 Chunk Pool 功能, 默认为 0 ,即关闭 Chunk Pool 功能。设置为大于 0 的值才能开启,取值范围为 [0,1],表示 Chunk Pool 占整个 MemStore 内存大小的比例。
hbase.hregion.memstore.chunkpool.initialsize:表示初始化时申请多少个Chunk 放到 Chunk Pool 中,默认为 0,即初始化时不申请 Chuck,只在写入数据时才申请。
hbase.hregion.memstore.mslab.max.allocation:表示能放入 MSLAB 的最大单元格大小,默认为 256KB,超过该大小的数据将从 JVM 堆分配空间而不是 MSLAB。
3.6、开启BucketCache
BlockCache 是 RegionServer 级别的,一个 RegionServer 只有一个BlockCache。BlockCache 的工作原理是读请求会首先检查 Block 是否存在于 BlockCache,存在就直接返回,如果不存在再去 HFile 和 MemStore 中获取,返回数据时把 Block 缓存到 BlockCache 中,后续同一请求或临近查询可以直接从 BlockCache 中获取,避免过多的昂贵 IO 操作。BlockCache 默认是开启的。
目前Block Cache 的实现方案有三种:
(1)LRUBlockCache
最早的 BlockCache 方案,也是 HBase 目前默认的方案。LRU 是 Least Recently Used 的缩写,称为近期最少使用算法。LRUBlockCache 参考了JVM 分代设计的思想,采用了缓存分层设计。
LRUBlockCache 将整个 BlockCache 分为 single-access(单次读取区)、multi-access(多次读取区)和 in-memory 三部分,默认分别占读缓存的25%、50%、25%。其中设置 IN_MEMORY=true 的列族,Block 被读取后才会直接放到 in-memory 区,因此建议只给那些数据量少且访问频繁的列族设置 IN_MEMORY 属性。另外,HBase 元数据比如 meta 表、namespace 表也都缓存在 in-memory 区。
(2)SlabCache
HBase 0.92 版本引入的一种方案,起初是为了避免 Full GC 而引入的一种堆外内存方案,并与 LRUBlockCache 搭配使用,后来发现它对 Full GC 的改善很小,以至于这个方案基本被弃用了。
(3)BucketCache
HBase 0.96 版本引入的一种方案,它借鉴了 SlabCache 的设计思想,是一种非常高效的缓存方案。实际应用中,HBase 将 BucketCache 和LRUBlockCache 搭配使用,称为组合模式(CombinedBlockCahce),具体地说就是把不同类型的 Block 分别放到 LRUBlockCache 和 BucketCache 中。
HBase 会 把 Index Block 和 Bloom Block 放 到 LRUBlockCache 中 , 将Data Block 放到 BucketCache 中,所以读取数据会去 LRUBlockCache 查询一下 Index Block,然后再去 BucketCache 中查询真正的数据。
BucketCache 涉及的常用参数有:
hbase.bucketcache.ioengine:(配置此值即开启 BucketCache )使用的存储介质,可设置为 heap、offheap 或 file,其中 heap 表示空间从 JVM 堆中申请,offheap 表示使用 DirectByteBuffer 技术实现堆外内存管理,file 表示使用类似 SSD 等存储介质缓存数据。默认值为空,即关闭 BucketCache, 一般建议开启 BucketCache。此外,HBase 2.x 不再支持 heap 选型。
hbase.bucketcache.size:BucketCache 大小,取值有两种,一种是[0,1]之间的浮点数值,表示占总内存的百分比,另一种是大于 1 的值,表示占用内存大小,单位 MB。
3.7、禁用大合并
由于 Major 合并执行期间会对整个集群的磁盘和带宽带来较大影响,一般建议设置 hbase.hregion.majorcompaction 设为 0 来禁用该功能,并在夜间集群负载较低时通过定时任务脚本来执行。
3.8、手动触发大合并
合并 t1 表中所有的 region
hbase> major_compact 't1'
合并 t1 表中的某个列族
hbase> major_compact 'r1', 'c1'
3.9、手动触发Flush
hbase> flush 't1'
4、排障
4.1、HBase 库连接数过多造成库堵塞的解决办法
【现象】
库现象:HBase 库节点正常,查看 web 页面一切正常,只有连接数变为 0,
【处理】
在主节点上运行 netstat -aoe 查看主机端口运行状态,可以看到有很多的CLOSE_WAIT,
这里可以看到服务器出现了大量的 CLOSE_WAIT, 修 改 /etc/sysctl.conf 配 置 文 件 :
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_intvl = 2
使用 sysctl -p 使配置生效
然后会发现会出现大量的 TIME_WAIT 的连接 还要再修改下 linux 的
/etc/sysctl.conf 配置在最后加入
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
说 明 : net.ipv4.tcp_syncookies = 1
表示开启 SYN Cookies。当出现 SYN 等待队列溢出时,启用 cookies 来处理, 可防范少量 SYN 攻击,默认为 0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
表示开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
表示开启 TCP 连接中 TIME-WAIT sockets 的快速回收,默认为 0,表示关闭。
net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2 状态的时间。
net.ipv4.tcp_keepalive_time = 1200
表示当 keepalive 起用的时候,TCP 发送 keepalive 消息的频度。缺省是 2 小时,改为 20 分钟。
net.ipv4.ip_local_port_range = 1024 65000
表示用于向外连接的端口范围。缺省情况下很小:32768 到 61000,改为 1024 到 65000。
net.ipv4.tcp_max_syn_backlog = 8192
表示 SYN 队列的长度,默认为 1024,加大队列长度为 8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000
表示系统同时保持 TIME_WAIT 套接字的最大数量,如果超过这个数字,TIME_WAIT 套接字将立刻被清除并打印警告信息。默认为 180000,改为5000。对于 Apache、Nginx 等服务器,上几行的参数可以很好地减少TIME_WAIT 套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT 套接字的最大数量,避免 Squid 服务器被大量的 TIME_WAIT 套接字拖死。
net.ipv4.route.gc_timeout = 100
路由缓存刷新频率, 当一个路由失败后多长时间跳到另一个默认是 300
net.ipv4.tcp_syn_retries = 1
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于 255,默认值是 5,对应于 180 秒左右。
修改完成后等待一段时间,打开 web 界面会发现连接数已经正常,表示连接恢复正常
注:连接数过多,造成服务器堵塞一般情况下有两个原因造成:
1,网络不正常
2,业务哪里有问题,调用了接口而没有释放
所以一般情况下遇到这种情况首先找业务排查,如果他那没有问题,在按照上面的方法修改配置文件处理
4.2、业务侧无法正常入库解决方法
【排查】
1.登录对应HBase UI查看是否有RIT积压
2库HBase UI:10.162.xxx:60010/master-stat…
4库HBaseUI:10.162.xxx:60010/master-stat…
【处理】
如出现上图的标志(Regions in Transition),且数量较大,即可确定为有RIT 积压情况,需要重启HBase库,重启后刷新HBase UI,观察RIT数量,直到RIT 消失为止,即可通知业务测试入库情况
4.3、有Dead regionserver 解决方法
1.登录对应HBase UI,查看是否有Dead regionserver情况
2.如有上图所示情况,则说明该库有丢失regionserver节点,可以尝试ssh该主机,查看是否宕机或进程被踢掉
3.登录丢失节点主机后,jps查看对应进程,若没有HRegionServer进程,表示进程由于负载过大被踢出,需要手动重启该进程
4.输入命令:hbase-daemon.sh start regionserver
5.重新刷新HBase UI,若Dead regionserver消失,则表示成功