写点什么

[TcaplusDB 知识库] 腾讯云数据库 TcaplusDB 数据读写的奥秘

用户头像
TcaplusDB
关注
发布于: 4 小时前
[TcaplusDB知识库]腾讯云数据库TcaplusDB数据读写的奥秘

前言

数据库最核心的功能是把数据存储下来,并提供快速读、写能力,因此,对于一个数据库来说,数据的读写是最基础而重要的业务。


但数据的读写在数据库实际使用中数以亿计的请求的情况下,还要做到不出任何的数据错乱,这就很考验数据库的数据读写设计。针对数据库在读写中可能出现的诸如读写互相干扰的问题,TcaplusDB 的设计开发人员设计了 TcaplusDB 的数据读写逻辑。

TcaplusDB 的读写逻辑

单 Shard 的数据组织形式就是一张 Hash 表,同一个 Hash 桶中的数据又是以一棵 AVL 树的形式组织。


数据的读写过程类似于内存中 Hash 表的读取过程,区别在于这里的 Hash 表是要持久化到文件,而磁盘 IO 的效率远不及内存,如何保证在主要的场景下这些存储在文件中的数据访问效率最优化,就是数据存储引擎要考虑的主要问题。

一条数据写入到数据文件的过程

本节主要讲述数据的插入(Insert)过程,当然数据的写操作还包括修改(Update)和替换(Replace)。


  • 首先通过 Hash 算法,计算得到数据的 Hash 桶号,数据将会插入到对应 Hash 桶中。这个桶是逻辑上的概念,同一个桶中的数据,并不意味着它们一定会集中存储在磁盘上的某个位置。桶号 = hash(数据 Key) % 桶数。

  • 对 Hash 桶加锁。由于写数据的过程中涉及到检查数据是否已存在和修改桶中的数据组织结构,通过加锁可以防止这个过程因为并发而出现数据不一致等问题。

  • 在 Hash 桶中搜索(搜索的过程参考 AVL 树算法描述)是否已经存在与待插入数据 Key 值相同的数据,如果存在,则直接结束插入流程,并提示数据已存在。如果不存在,则开始写数据到数据文件中。

  • 数据引擎为新数据分配存储空间,由于数据的 Key 和 Value 在内容和使用上都较大的区别,为了尽可能的保证数据的访问效率,Key 和 Value 的存储空间是分开分配的,而且分配策略上也略有不同。


存储空间分配的基本策略


  • 优先使用数据文件的前 1G 的空间。原因是存储引擎启动时,会将数据文件的前 1G 空间通过 mmap 映射到内存中,访问效率较高,而剩余的空间中数据是直接对接文件 IO 的方式访问的;

  • 数据的 Key 比数据的 Value 更有权利优先使用前 1G 的空间。原因是通常情况下 Key 的访问频率要比 Value 高。当前 1G 空间中原先分配给 Key 使用的空闲块不足时,会将前 1G 空间中原先分配给 Value 使用的空闲块挪给 Key 使用;

  • 所有数据的 Key 尽量存放在一起。这是因为我们有很多 Key 遍历的场景(比如数据迁移),Key 放在一起,可以一定程度上加快遍历的过程,减少磁盘 IO;

  • 空闲块的查找策略为 Best-Fit,即找满足需求的最小空闲块,目的是为了尽可能的让数据存在同一块中,避免数据的 Split。


存储空间的详细分配过程参见下图(下图拆分成了两个部分,两幅图通过虚线框的”尝试从文件空间分配“节点联系在一起):



存储空间详细分配过程图



从文件空间中分配图


策略设计的考虑


存储引擎根据空间分配策略,会先分配数据 Value 的存储空间,写入数据 Value 部分后,再分配数据 Key 的存储空间,并写入数据 Key 部分。之所以是这样的顺序,有两方面的原因:


  • 数据 Key 的头部需要记录它所指向的 Value 的存储地址,需要先分配 Value 的存储空间,得到 Value 的存储地址头,再写 Key;

  • 数据访问入口是 Key,按照这个顺序,Key 写成功,我们也基本可以认为 Value 也是写成功了,可以减少数据不一致的情况。


从前面的内容,我们也了解到,数据的 Key,在写入文件的时候,会有头部信息,里面会记录数据在 AVL 树中的左右子树节点的信息,当插入新数据的时候,因为树节点的关系会发生变化,因此会涉及其它数据 Key 头部信息的修改,这个过程与新数据的插入是一起完成的。写数据的最后一步就是写 Binlog 文件,Binlog 记录当前数据的最后的状态,主要用于主备节点的数据同步等场景。

一条数据从数据文件读出的过程

相比数据的写入过程,数据的读取过程要简单一些:


  • 首先和写入数据一样,要找到存储要查找的数据的 Hash 桶,Hash 桶号的计算方法,与写入数据完全一致。

  • 在 Hash 桶内,执行 AVL 树的搜索过程,查找找指定的 Key,如果没找到,直接返回,并提示数据不存在,如果找到,读取 Key,并从 Key 的头部信息中找到 Value 的存储位置,将 Value 一并读取。

最后

我们已经了解了 TcaplusDB 的数据读写逻辑,后续我们将揭开更多 TcaplusDB 设计的特殊奥秘。

发布于: 4 小时前阅读数: 2
用户头像

TcaplusDB

关注

还未添加个人签名 2020.05.31 加入

TcaplusDB君

评论

发布
暂无评论
[TcaplusDB知识库]腾讯云数据库TcaplusDB数据读写的奥秘