前言
保留数据的办法多种多样,最间接的办法是在内存中建一个数据结构,保留数据。比方用一个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设计的非凡神秘。