MemoryStore Flush的触发时机
首先flush的单位是Region(一个region中可能存在多个MS)不是memoryStore
- 某一个MemoryStore大小超过128M(默认)
- Region中的MemoryStore的总大小超过256M
- RegionServer中的JVM的40%,从MemoryStore中Region开始刷新,直到小于阈值即停止
- RegionServer中HLog数量达到上限时,从最早的HLog对应的Region刷新
- 定时1小时刷新
- 手动刷新
以上几种触发方式解决了以下问题:
- 某一个MS过大
- 每个MS都不大,但是总量大的问题
- 定时刷新解决了长时间不刷新的问题
- 手动刷新提供了用户自行操作的入口
Flush的过程
-
prepare阶段:
首先建立一个新的kvset,然后给当前的kv集合拍一个快照,之后的数据都写入新的kvset
查询数据会在快照中和新的kvset中查找,并且在这个过程中会加一把写锁
-
flush阶段:
然后将快照的数据持久化到临时目录/.tmp
-
commit阶段*
遍历所有memeryStore,将临时目录下的文件拷贝到列族的目录下,针对HFile生成StoreFile,Reader,方便读取数据。然后清理快照
几种触发机制对读写的影响
-
除了RegionServer级别(不包括HLog)其他的对读写影响都比较少。
这种情况会影响整个regionServer的读写,造成这种情况的原因大过是Region的个数太多了,数据太分散了。
一般50-80即可