大规模分布式存储系统原理解析与架构实战-读书笔记2-单机存储系统(1)

大规模分布式存储系统原理解析与架构实战-读书笔记2-单机存储系统(1)

单机存储引擎就是哈希表,B树等数据结构在SSD、机械磁盘等持久化介质上的实现。
单机存储系统就是单机存储引擎的一种封装,对外提供键值对,文件,表格或关系模型。

硬件基础

CPU架构

  • 现代服务器基本为多核或多个CPU,经典的多CPU架构为对称多处理结构(Symmetric Multi-Processing, SMP),即在一个计算机上汇集了一组处理器,他们之间对称工作,无从属或主次关系,共享相同的物理内存和总线。

IO总线

  • 存储系统的性能瓶颈一般在于IO

网络拓扑

  • Google将网络改造为扁平化拓扑结构。

性能参数

在这里插入图片描述
设计存储系统时一般用SSD作为缓存或性能要求较高的关键业务。

单机存储引擎

哈希存储引擎,B树存储引擎。
LSM(Log-Structured Merge Tree)存储引擎支持增、删、改,以及顺序读取和随机读取。它通过批量转储技术规避磁盘随机写入问题。

哈希存储引擎

  • Bitcask是一个基于哈希表结构的键值存储系统,仅支持追加操作。每个文件有大小限制,当老文件达到限制时,创建一个新文件继续写入。
  • 数据结构:
    Bitcask的数据文件记录的数据是一条条写入操作,包含key, value, key_sz, value_sz, timestamp, crc。内存中采用基于哈希表的索引数据结构,结构中包含了三个用于定位数据的信息:file_id, value_pos, value_sz。
    写入时先在活跃数据文件结尾append,然后更新内存的索引信息。因此,每个写操作需要经历一次顺序的磁盘写入和一次内存操作。
  • 定期合并:
    Bitcask会定期将老数据文件合并,就是把相同的键的数据合并,只保留最新的值。
  • 快速恢复:
    因为索引信息存在内存里,所以如果关机或重启需要重新扫描一遍数据文件来建立索引,很耗时。
    所以当定期合并时,bitcask会产生新的数据文件,并且产生一个新的索引文件,这个索引文件记录每一条记录的哈希索引信息。与数据文件不同的是,这个索引文件不存value内容,只存value位置(和内存哈希表一样)。

B树存储引擎

以Mysql InnoDB为例

  • 数据结构:
    -Mysql InnoDB按照页面(Page)来组织数据,每个页面对应B+树的一个节点。其中叶子节点保存每行完整数据,非叶子节点保存索引信息。
    每次读取一个节点,如果对应的页面不再内存中,需要从磁盘中读取病患存起来。根节点是常驻内存的。因此B+树一次检索最多需要h-1次磁盘IO。
  • 缓冲区管理
    缓冲区管理器将可用内存划分为缓冲区,缓冲区是与页面同等大小的区域,磁盘块的内容可以传送到缓冲区。缓冲区的关键在于替换策略。常见算法有LRU(不再赘述)和LIRS。
  • LIRS(Low Inter-reference Recency Set)
    LRU算法大多数情况下表现不错,但假如做了一次全表扫描,将导致缓冲池中的大量页面(可能包含很多很快被访问的热点页面)被替换,从而污染缓冲池。LIRS算法将缓冲池分为两级,数据首先进入第一级,如果数据在较短时间内被访问两次或者以上,则成为热点数据进入第二级,每一级还是采用LRU。Oracle的touch count和Mysql InnoDB的替换算法都采用了类似的分级思想。
    以Mysql InnoDB为例,InnoDB内部的LRU链表分为两部分:新子链表(new sublist)占5/8和老子链表(old sublist)占3/8。页面首先插入到老子链表,InnoDB要求页面在老子链表停留时间超过一定值,比如1秒,才会有可能被转移到新子链表。

LSM树存储引擎

在这里插入图片描述
LSM树将对数据的修改增量保持在内存中,达到指定大小限制后将这些修改操作批量写入磁盘,读取时需要合并磁盘中的历史数据和内存中最近的修改操作。这样的优势就是有效的避免了磁盘的随机写入问题,但读取时会访问较多磁盘文件。下面介绍LevelDB中的LSM树存储引擎。

  • 存储结构:
    LevelDB主要包括:内存中的Memtable和不可变Memtable以及磁盘上的当前文件,清单文件,操作日志文件,以及SSTable文件。写入时,先将修改操作写入到操作日志文件,成功后再将修改操作应用到MemTable。
    当MemTable占用的内存达到一个上限值后,需要将内存的数据转储到外存文件中。先将MemTable冻结成为不可变MemTable,并生成一个新的MemTable。新到来的数据被记入新的操作日志文件和新的MemTable中。LevelDB后台进程将不可变MemTable的数据排序后转储到磁盘,形成一个新的SSTable文件,此过程为Compaction。SSTable文件是内存中的数据不断进行Compaction操作后形成的,且为层级结构。
    SSTable中的文件按记录的主键排序,每个文件有最小主键和最大主键。清单文件记录了这些元数据,包括属于哪个层级、文件名称,最小主键和最大主键。当前文件记录了当前使用的清单文件名。
    每次查询,LevelDB对外只支持随机读取单条记录,首先查看内存中的MemTable,然后不可变MemTable,再然后依次从新到老读取SSTable文件。
  • 合并
    LevelDB写入操作简单,但读取操作复杂,代价高。为了加快读取速度,内部会执行Compaction操作来对已有的记录进行整理压缩,从而删除一些不再有效的记录,减少数据规模和文件数量。
    Compaction操作分为:
    1、Minor Compaction:当内存中的MemTable大小到了一定值,将内存数据转储到SSTable文件中。
    2、Major Compaction:当某个层级的SSTable文件数目超过限定后,从这个层级中选择SSTable文件,将其与高一级的SSTable文件合并。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值