LSM的存储和定位

  1.  LSM的存储

主要思想是将直接修改树形结构,改为分几个层级来完成。当完成第一个层级时就反馈完成,其他交由后台来处理。

流程是先写入memory table,之后merge到低级别的sstable,最后merge到高级别的sstable。


如下是Hbase的大体结构:



    2. 定位

Trailer–这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先 读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。


首先,能快速找到行所在的region(分区),假设表有10亿条记录,占空间1TB,   分列成了500个region,  1个region占2个G. 最多读取2G的记录,就能找到对应记录; 

其次,是按列存储的,其实是列族,假设分为3个列族,每个列族就是666M, 如果要查询的东西在其中1个列族上,1个列族包含1个或者多个HStoreFile,假设一个HStoreFile是128M, 该列族包含5个HStoreFile在磁盘上. 剩下的在内存中。

再次,是排好序了的,你要的记录有可能在最前面,也有可能在最后面,假设在中间,我们只需遍历2.5个HStoreFile共300M

最后,每个HStoreFile(HFile的封装),是以键值对(key-value)方式存储,只要遍历一个个数据块中的key的位置,并判断符合条件可以了。 一般key是有限的长度,假设跟value是1:19(忽略HFile上其它块),最终只需要15M就可获取的对应的记录,按照磁盘的访问100M/S,只需0.15秒。 加上块缓存机制(LRU原则),会取得更高的效率。



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25380026/viewspace-2644557/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25380026/viewspace-2644557/

### KV存储LSM树的工作原理 #### LSM树的核心概念 LSM树(Log-Structured Merge Tree)是一种高效的日志结构合并树,广泛应用于键值存储系统中。其核心思想是通过减少随机写入操作来提高磁盘I/O效率。具体来说,LSM树采用顺序追加的方式处理数据的插入、更新删除操作[^1]。 #### 数据分层与存储机制 LSM树通常由多层组成,每一层都包含一组按序排的数据文件。新数据首先被写入内中的MemTable(通常是基于SkipList或BTree实现),这是一个可变的、有序的数据结构。当MemTable达到一定大小时,会被冻结并持久化到磁盘上形成一个新的SSTable(Sorted String Table)。这些SSTables按照层次关系组织在一起,低层的SSTables容量更大且经过多次合并优化[^2]。 #### Compaction过程 随着系统的运行,可能会产生大量的小文件或者重复/过期的数据项。为此,LSM树定期执行Compaction操作,即将多个较小的SSTables合并成更大的SSTable,并在此过程中移除冗余条目。这一策略不仅减少了读取路径长度,还提高了空间利用率[^5]。 #### 查询流程分析 对于读请求,系统会依次检查最新的MemTable以及各级别的SSTables直到找到目标记录为止;如果未命中,则返回不在的结果。由于每级内的数据都是排序好的,因此可以借助二分查找快速定位特定key的位置[^4]。 ```python class SSTable: def __init__(self, data): self.data = sorted(data.items()) # Ensure the entries are ordered by key def get(self, key): """Binary search to find value associated with given key.""" low, high = 0, len(self.data)-1 while low <= high: mid = (low + high) // 2 current_key, _ = self.data[mid] if current_key == key: _, val = self.data[mid] return val elif current_key < key: low = mid + 1 else: high = mid - 1 raise KeyError(f"Key {key} not found.") ``` 上述代码片段展示了如何在一个简单的SSTable对象内部使用二分查找方法获取指定关键字对应的值。 #### 性能特点总结 相比传统的关系型数据库使用的B+树索引方式,LSM树更适合于写密集场景下的大数据量管理任务。尽管在一定的延迟增加风险(特别是在频繁触发compactions期间),但它能够显著降低单位成本下所能支持的最大吞吐率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值