实时数据库在云服务器中的历史数据保温

kipway@outlook.com

2023.4.12

最近在测试对比几个常用的云服务商的云服务器时发现,在某迅云上半年前部署的一个测试服务器,只是不断写入仿真数据,没有数据使用者,使用索引扫描工具扫描标签历史数据时发现4K页面随机读取的IOPS只有50左右, 和广告宣称的SSD云盘3000IOPS相差太远,为此提交工单询问差异,无法得到满意回复(只是说一切正常,推荐某个的工具测试)。初步猜测是冷热数据的导致,特作以下实验来验证。

实验1:双机热备同步加热

  1. 为该服务器配置一个热备服务器,无任何数据, 空库
  2. 启动备服务器,自动从主服务器同步所有标签和历史数据,大约12G数据
  3. 修改配置,恢复为独立服务器,重启云服务器实例,目的是清除linux系统内存缓存,systemd开机自动重启实时库。
  4. 再使用索引扫描工具随机抽取标签扫描历史数据

实验2:直接拷贝库文件加热

  1. 停止实时数据库服务
  2. 拷贝索引文件和数据文件到备份目录
  3. 重启云服务器实例,目的是清除linux系统内存缓存,systemd开机自动重启实时库。
  4. 再使用索引扫描工具随机抽取标签扫描历史数据

实验结果:

经过数据加热后,随机选择的标签历史扫描,IOPS都能达到3000的标称值,即使是24小时之前被被扫描过的数据也能保持热度。云服务器商的数据冷却策略无法查到资料,也许不同服务商之间还有差别。

实验分析:

估计云服务器商的云存储块设备为了节约成本,采用多级缓存,保证热数据IOPS,冷数据存储于最慢的机械硬盘存储阵列,如下示意图:

云服务器文件系统 云存储逻辑块设备-多级缓存示意图 内存 SSD固态盘 大容量机械盘 EXT4 或 NTFS 1级缓存 2级缓存

解决方案:

为历史数据保持热度,如果是关系库或者其他nosql数据库,无法从底层实现,只能从应用层实现(但会影响正常使用)。对于自己开发的实时数据库,完全可以在数据库层面实现数据的保温,还不影响应用层的使用。

具体实现:

在空闲时后台顺序读取扫描索引文件和数据文件,保持24小时内索引文件每个页面被读取一次,48小时或者72小时内历史数据页面被读取一遍。此功能预计在rdb2023.5版本中增加, 设置配置开关可开启关闭。