HBa刷写与合并机制介绍

更新时间:2023-06-04 10:45:27 阅读: 评论:0

关于树的名言HBa刷写与合并机制介绍
⽂章⽬录
HBa 是⽬前主流的 NoSQL 数据库,是⼀个⾼可靠、⾼性能、⾼伸缩的分布式 KV 存储系统,本⽂讲解 HBa 两个核⼼机制——刷写(Flush)与合并(Compaction),重点介绍其原理及参数配置建议。
1、为什么要进⾏刷写和合并?
HBa 是 Google BigTable 的开源实现,底层存储引擎是基于 LSM 树(Log-Structured Merge Tree)数据结构设计的。写⼊数据时会先写 WAL ⽇志,再将数据写到写缓存 MemStore 中,等写缓存达到⼀定规模或其他触发条件时会 Flush 刷写到磁盘,⽣成⼀个 HFile ⽂件,这样就将磁盘随机写变成了顺序写,提⾼了写性能。基本拓扑图:
随着时间推移,写⼊的 HFile 会越来越多,读取数据时就会因为要进⾏多次io导致性能降低,因此 HBa 会定期执⾏ Compaction 操作以合并减少 HFile 数量,提升读性能。
2、Flush 触发条件和参数
狮子岩村
理解 Flush 的触发条件⾮常重要,从中我们也可以看出何时会阻塞写请求,总结有 7 种情况会触发 Flush:
当⼀个 MemStore ⼤⼩达到阈值 store.flush.size(默认128M)时,会触发 MemStore 的刷写。这个时候不会阻塞写请求。
当⼀个 Region 中所有 MemStore 总⼤⼩达到 store.block.multiplier *
store.flush.size(默认4*128M=512M)时,会触发 MemStore 的刷写,并阻塞 Region 所有的写请求,此时写数据会出现 RegionTooBusyException异常。
三句半表演当⼀个 RegionServer 中所有 MemStore 总⼤⼩达到 store.size.lower.limit*
RegionServer 中内存占⽤⼤的 MemStore 的刷写;达到 store.size * hba_heapsize(⾼⽔位阈值,默认0.4 * RS堆⼤⼩)时,不仅会触发 Memstore 的刷写,还会阻塞 RegionServer 所有的写请求,直到 Memstore 总⼤⼩降到低⽔位阈值以下。
当⼀个 RegionServer 的 HLog 即WAL⽂件数量达到上限(可通过参数ionrver.maxlogs 配置,默认32)时,也会触发 MemStore 的刷写,HBa 会找到最旧的 HLog ⽂件对应的 Region 进⾏刷写 。
当⼀个 Region 的更新次数达到 ionrver.flush.per.changes(默认30000000即3千万)时,也会触发 MemStore 的刷写。
定期 ionrver.optionalcacheflushinterval(默认3600000即⼀个⼩时)进⾏ MemStore 的刷写,确保 MemStore 不会长时间没有持久化。为避免所有的 MemStore 在同⼀时间进⾏ flush ⽽导致问题,定期的 flush 操作会有⼀定时间的随机延时。
⼿动执⾏ flush 操作,我们可以通过 hba shell 或 API 对⼀张表或⼀个 Region 进⾏ flush。
上⾯是 Flush 的⼏个触发条件,从中我们拿到 5 个和 Flush 有关的重要参数,并给出调整建议:
第一眼就心动的人
1、store.flush.size
默认值 128M,单个 MemStore ⼤⼩超过该阈值就会触发 Flush。如果当前集群 Flush ⽐较频繁,并且内存资源⽐较充裕,建议适当调整为 256M。调⼤的副作⽤可能是造成宕机时需要分裂的 HLog 数量变多,从⽽延长故障恢复时间。
2、store.block.multiplier
默认值 4,Region 中所有 MemStore 超过单个 MemStore ⼤⼩的倍数达到该参数值时,就会阻塞写请求并强制 Flush。⼀般不建议调整,但对于写⼊过快且内存充裕的场景,为避免写阻塞,可以适当调整到5~8。
3、store.size
默认值 0.4,RegionServer 中所有 MemStore ⼤⼩总和最多占 RegionServer 堆内存的 40%。这是写缓存的总⽐例,可以根据实际场景适当调整,且要与 HBa 读缓存参数 hfile.block.cache.size(默认也是0.4)配合调整。旧版本参数名称为
4、store.size.lower.limit
小米炖辽参怎么做默认值 0.95,表⽰ RegionServer 中所有 MemStore ⼤⼩的低⽔位是 store.size 的 95%,超过该⽐例就会强制 Flush。⼀般不建议调整。旧版本参数名称为 store.lowerLimit。
5、ionrver.optionalcacheflushinterval
默认值 3600000(即 1 ⼩时),HBa 定期 Flush 所有 MemStore 的时间间隔。⼀般建议调⼤,⽐如 10 ⼩时,因为很多场景下 1
⼩时 Flush ⼀次会产⽣很多⼩⽂件,⼀⽅⾯导致 Flush ⽐较频繁,另⼀⽅⾯导致⼩⽂件很多,影响随机读性能,因此建议设置较⼤值。
上⾯就是 Flush 的触发条件及核⼼参数,理解并适当调整参数有利于维护 HBa 集群的稳定性。
3、Compaction 类型、触发时机和参数
从上⾯分析我们知道,HBa 会定期执⾏ Compaction 合并 HFile,提升读性能,其实就是以短时间内的io消耗,换取相对稳定的读取性能。
Compaction 类型
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 触发时机
概括的说,HBa 会在三种情况下检查是否要触发 Compaction,分别是 MemStore Flush、后台线程周期性检查、⼿动触发。
MemStore Flush:可以说 Compaction 的根源就在于Flush,MemStore 达到⼀定阈值或触发条件就会执⾏ Flush 操作,在磁盘上⽣成 HFile ⽂件,正是因为 HFile ⽂件越来越多才需要 Compact。HBa 每次Flush 之后,都会判断是否要进⾏ Compaction,⼀旦满⾜ Minor Compaction 或 Major Compaction 的条件便会触发执⾏。
后台线程周期性检查: 后台线程 CompactionChecker 会定期检查是否需要执⾏ Compaction,检查周期为
hba.rver.thread.wakefrequency * pactchecker.interval.multiplier,这⾥主要考
虑的是⼀段时间内没有写⼊仍然需要做 Compact 检查。其中参数 hba.rver.thread.wakefrequency 默认值 10000 即 10s,是 HBa 服务端线程唤醒时间间隔,⽤于 LogRoller、MemStoreFlusher 等的周期性检查;参数 pactchecker.interval.multiplier 默认值1000,是 Compaction 操作周期性检查乘数因⼦,10 * 1000 s 时间上约等于2hrs, 46mins, 40c。
⼿动触发:通过 HBa Shell、Master UI 界⾯或 HBa API 等任⼀种⽅式执⾏ compact、major_compact等命令,会⽴即触发Compaction。
Compaction 核⼼参数
和上⾯类似,这⾥总结了⼏个和 Compaction 有关的重要参数,并给出调整建议:
1、paction.min
默认值 3,⼀个 Store 中 HFile ⽂件数量超过该阈值就会触发⼀次 Compaction(Minor Compaction),这⾥称该参数为minFilesToCompact。⼀般不建议调⼩,重写场景下可以调⼤该参数,⽐如 5~10 之间,注意相应调整下⼀个参数。⽼版本参数名称为pactionthreshold。
2、paction.max
默认值 10,⼀次 Minor Compaction 最多合并的 HFile ⽂件数量,这⾥称该参数为 maxFilesToCompact。这个参数也控制着⼀次压缩的耗时。⼀般不建议调整,但如果上⼀个参数调整了,该参数也应该相应调整,⼀般设为 minFilesToCompact 的 2~3 倍。
3、paction.throttle
HBa RegionServer 内部设计了两个线程池 large compactions 与 small compactions,⽤来分离处理 Compaction 操作,该参数就是控制⼀个 Compaction 交由哪⼀个线程池处理,默认值是 2 * maxFilesToCompact * store.flush.size(默认210128M=2560M即2.5G),建议不调整或稍微调⼤。饭否网
4、paction.large/small
以人开头的成语
默认值 1,表⽰ large compactions 与 small compactions 线程池的⼤⼩。⼀般建议调整到 2~5,不建议再调太⼤⽐如10,否则可能会消费过多的服务端资源造成不良影响。
安全生产大检查5、hba.hstore.blockingStoreFiles
默认值 10,表⽰⼀个 Store 中 HFile ⽂件数量达到该值就会阻塞写⼊,等待 Compaction 的完成。⼀般建议调⼤点,⽐如设置为 100,避免出现阻塞更新的情况,阻塞⽇志如下:
too many store files; delaying flush up to 90000ms
⽣产环境建议认真根据实际业务量做好集群规模评估,如果⼩集群遇到了持续写⼊过快的场景,合理扩展集群也⾮常重要。
6、hba.hregion.majorcompaction
默认值 604800000 ms 即7天,这是 Major Compaction 周期性触发执⾏的时间间隔。通常 Major Compaction 持续时间较长、资源消耗较⼤,⼀般设为 0,表⽰关闭⾃动触发,建议在业务低峰期时⼿动执⾏。
4、总结
本⽂概括的介绍了 HBa 的刷写和合并机制,主要是 Flush 的触发条件与核⼼参数、Compaction 的触发时机与核⼼参数等,并都给出了具体参数的调整建议,希望能给 HBa 使⽤者提供有价值的参考。

本文发布于:2023-06-04 10:45:27,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/984594.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:参数   调整   建议   触发   性能   阻塞   检查
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图