当前位置: 首页 > news >正文

分布式数据库LSM树

LSM树的核心结构与操作流程

Log-Structured Merge Tree,日志 结构化 合并 树。
​​追加写:永远不改,就算是update操作,也是追加写,一直新生成文件。
刷盘触发​​:追加到一定程序,比如到了几MB,就生成一个MemTable,MemTable是跳表结构,当MemTable容量达到阈值时,转换为ImmutableMemTable,不可变跳表。并且生成一个新的MemTable,后台线程将ImmutableMemTable的数据刷入磁盘SSTable。
分层合并​​:这一层满了,比如10M,再往下,比如100M满了,再往下,1G。一直到Level n层。SSTable是排好序的。
MemTable -> ImmutableMemTable -> SSTable level 0 -> SSTable level 1 -> SSTable level 2

读流程​​

多级查询​​读放大:基于这种结构,读的时候就会造成读放大,需要读多次。如果读的数据是新的数据,那可能在内存里,如果读的数据是旧数据,那要去level n层。因此,读性能非常不稳定。
写的时候,写放大,如果刚好每一层都满了,写的时候一直下沉到level n层,一层一层合并。
写内存的方式速度巨快。

数据可靠性:防止数据丢失​

数据容易丢失,怎么设计解决的?
通过写入log日志,相当于redo log,确保崩溃后可通过日志恢复未刷盘数据。

冷热数据分离​

什么场景会发生读放大?
冷数据。
从这一点出发,避免读取冷数据就可以避免读放大的问题。

clickhouse

clickhouse列式数据库,多核数据库,是做统计数据的,很容易发生读放大,因此他的设计是只有level 0,硬盘层面只有一层。一层就导致文件非常多,当你插入停下来,后台线程开始文件合并。
如果有一万个文件,怎么查询数据在哪个文件呢?clickhouse是通过文件合并成一个大文件,不停的merge。merge会消耗性能,但是合并了文件会使查询速率提高。但如果跟业务高峰期碰巧撞上,那会影响业务。
一个key在不在某个文件里,数据库引擎用布隆过滤器,通过位数组和哈希函数快速判断键是否可能存在于SSTable中,若返回“不存在”则直接跳过该文件,避免无效的磁盘读取。实现时间复杂度O(1)快速判断数据是否存在某个文件里。
布隆过滤器存在误判率​​,多级布隆过滤器架构​​优化,将布隆过滤器按数据冷热分层:内存中维护热数据的高精度过滤器,磁盘中存储冷数据的低精度过滤器。
并行:多个读,多核同时读。并行Compaction​​,利用多核CPU加速合并。

存储冗余问题

字段name,第一次写郭靖,update操作第二次写郭大靖,同一key多份存储。
读取时需从内存(MemTable)到磁盘(L0→L1→…→Lk)逐层检索,增加读放大。
当SSTable超过单文件最大容量,或者SSTable数量超过限制,底层数据文件会合并,合并时保留最新版本,删除无效记录。
合并结果写入下一层。

数据倾斜问题

分布式数据库是要做数据分布的,hash计算分布到某个节点上,比如存储视频播放,按照视频id做hash,大up主一个视频几千万播放,都会hash到同一个节点,造成数据严重倾斜,非常不均匀。
用uuid做主键,那么查询的话要去很多个节点去查询,造成读放大。
所以,数据不均匀的场景不适合用分布式数据库。
关系型数据库mysql做业务系统,大数据归档。hbase慢慢跑去吧,sql语句转换成LSM结构去分布式执行。

分片内有序​​

分布式无法支持全局有序。
每个分片(Shard)内部SSTable按主键有序,但跨分片无法全局有序。适用于分片内范围查询场景(如按用户ID查询)。

相关文章:

  • 多模态大语言模型arxiv论文略读(七)
  • Unity-Xlua热更和AssetBundle详解
  • 上下拉电阻详解
  • RAG 系统中的偏差是什么?
  • 自定义数据结构的QVariant序列化 ASSERT failure in QVariant::save: “invalid type to save“
  • BetaFlight参数配置解读
  • 软考高项-考前冲刺资料-M 类【项目管理类】【光头张老师出品】
  • C++:模拟实现string
  • spring之Bean的循环依赖问题、反射机制手写Spring框架、Spring IoC注解式开发
  • 测试用例设计
  • 对抗Prompt工程:构建AI安全护栏的攻防实践
  • 精密空调的介绍
  • 《解码 C/C++ 关键字:科技编程的核心指令集》
  • 机器学习 Day09 线性回归
  • 在SQLark 中快速生成测试数据
  • ASP.NET图书馆借阅系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 小白入门JVM、字节码、类加载机制图解
  • STL常用容器整理
  • macbook pro查询并修改命令提示符的格式
  • 循环神经网络 - 参数学习之随时间反向传播算法
  • 广东肇庆今日确诊病例/武汉seo关键字推广
  • 外国网站做问卷调查挣钱/网时代教育培训机构怎么样
  • 运动分类的网站设计论文/百度上看了不健康的内容犯法吗
  • 摄影图片网站/百度搜索关键词排名查询
  • 长沙本土网站建设公司/阿里云模板建站
  • 国外优秀app设计网站有哪些/北京seo外包