前言
保留数据的办法多种多样,最间接的办法是在内存中建一个数据结构,保留数据。比方用一个 List,每当收到一条数据就向 List 中追加一条记录。
这个计划非常简单,性能良好,但问题是数据寄存在内存中,一旦服务器停机或重启,数据就会永恒失落。
为了解决数据失落问题,能够把数据长久化寄存在非易失存储介质(比方硬盘)中。能够应用磁盘的文件,每当收到一条数据就向文件中 Append 一行。这是一个长久化存储数据的解决方案,但如果磁盘损坏呢?RAID 是一个单机冗余存储计划,那如果主机损坏呢?
网络存储是一个解决方案,通过软件层进行存储正本的复制。仿佛咱们能够解决数据安全问题,然而做存储正本复制过程中是否能保障正本之间的一致性?
TcaplusDB 的开发人员思考到了这些存储问题,在本期的知识库中,TcaplusDB 君将介绍 TcaplusDB 的存储调配策略,对于数据的读写逻辑咱们将会在下期的知识库中进行介绍。
存储空间调配的根本策略
- TcaplusDB 优先应用数据文件的前 1G 的空间。起因是存储引擎启动时,会将数据文件的前 1G 空间通过 mmap 映射到内存中,拜访效率较高,而残余的空间中数据是间接对接文件 IO 的形式拜访的;
- 数据的 Key 比数据的 Value 更有权力优先应用前 1G 的空间。起因是通常状况下 Key 的拜访频率要比 Value 高。以后 1G 空间中原先调配给 Key 应用的闲暇块有余时,会将前 1G 空间中原先调配给 Value 应用的闲暇块挪给 Key 应用;
- 所有数据的 Key 尽量寄存在一起。这是因为咱们有很多 Key 遍历的场景(比方数据迁徙),Key 放在一起,能够肯定水平上放慢遍历的过程,缩小磁盘 IO;
- 闲暇块的查找策略为 Best-Fit,即找满足需要的最小闲暇块,目标是为了尽可能的让数据存在同一块中,防止数据的 Split。
存储空间的具体调配过程参见下图(下图拆分成了两个局部,两幅图通过虚线框的”尝试从文件空间调配“节点分割在一起):
<center> 存储空间具体调配过程图 <center/>
<center> 从文件空间中调配图 <center/>
策略设计的思考
存储引擎依据空间调配策略,会先调配数据 Value 的存储空间,写入数据 Value 局部后,再调配数据 Key 的存储空间,并写入数据 Key 局部。之所以是这样的程序,有两方面的起因:
- 数据 Key 的头部须要记录它所指向的 Value 的存储地址,须要先调配 Value 的存储空间,失去 Value 的存储地址头,再写 Key;
- 数据拜访入口是 Key,依照这个程序,Key 写胜利,咱们也根本能够认为 Value 也是写胜利了,能够缩小数据不统一的状况。
最初
咱们曾经理解了 TcaplusDB 的存储调配策略,后续咱们将揭开更多 TcaplusDB 设计的非凡神秘。