hbase内存数据存储的结构
1.列式存储
2.LSM标准实现(wal Hlog+memStore+storeFile)
3.内存中结构一般是跳表(空间换时间)
4.一般都是一个 rowKey + N个列族(每个列族里面有多个列,每个列有版本号和值)
查询过程简单还原
1.client通过zk找到meta表所在的regionServer(老版本先要通过root表去查找)
2.找到meta所在的regionServer,找到rowKey对应记录所在的regionServer
meta其实就是region的描述,一条记录对应一个region。它的rowKey类似 表名+最后一条记录的rowKey,都是有序的所以扫描方便查找
3.找到rowKey所在的regionServer
先去内存中查询,内存分两块 memStore(主写)和 blockCache(主读)
先去memStore中查找(这个数据结构一般是跳表,memStore的数据不超过64M,内存查找),查不到就到blockCache中去查
如果没有就要去fileStore中找了,这个是检索磁盘的,文件也是渐进的 C1 C2 C3 每个层级的结构可以不同,C1可以是B+,查到的数据放到blockCache中
数据插入过程简单还原
1.client通过zk找到meta再找到表所在的region
2.找到store插入记录到memStore中
3.如果memStore超过64M,触发flush动作,把数据持久化到磁盘中形成一个storeFile(满足条件也会触发hfile的compact操作生成一个更大的storeFile)
4.在step3的时候,也会生成一个checkpoint,标记之后的数据都是menStore中的,如果有啥问题内存凉了 可以从Hlog中恢复数据到memStore
很多存储服务都是用的wal技术来保证数据可靠性,hbase也是wal,他的log就是记录在hlog中的
compact【毛刺的罪魁祸首】
why-为啥要compact,数据不停 的往memStore中写入,memStore满了就写storeFile,storeFile会越来越多 影响查询性能
when-memStore flush/周期性检查任务
how-compact会删除一些过期的记录,归并排序关联数据
minor compact
把相邻的小hfile合并成一个大的hfile,删除ttl到期的数据
major compact
把一个store下面所有的hfile合并到一个hfile,删除所有不必要的数据(ttl到期,版本号小于设定的版本号,有delete标签的)
珍贵实战数据-使用场景用户画像
2000qps,avg_rt在2.3ms
2000tps,avg_rt在3.2ms
使用注意rowKey一定要散,可以用原始值+md5