代码改变世界

KV数据存储:持久化

2012-11-01 12:32  zhenjing  阅读(4297)  评论(0编辑  收藏  举报

介质特性

由于内存的易失性,存储于内存的数据需要持久化来保证数据的安全。除了存储介质不同,本质上数据是可以在不同的存储介质中互相拷贝。内存极好的随机访问特性。磁盘seek极慢,良好的顺序读写性能;SSD极好的随机读性能,擦除次数上限;擦除再写入;页写入,块擦除(写放大: 擦除512KB大约2ms)。

Linux中写文件并无法保证文件的数据是连续的,若一定要保证磁盘空间的连续性,需要使用空间预分配fallocate。

数据持久化

当内存数据有序存放,可直接将内存数据导出到持久化设备中,如磁盘、SSD。对于非有序的内存数据,转成某种可解释的格式连续存放即可。

索引与数据

在<内存篇>中,为了保证数据有序,常使用数据索引+数据的存储方式。对于索引数据有3种处理方式:1)只存数据:当使用数据时通过扫描数据恢复数据索引;2)独立存储索引和数据;3)将索引和数据存放在一起:一般将索引存放在数据后面(索引依赖于数据的位置)。

数据格式与数据

对于KV数据,可完全不考虑数据格式,由应用程序自行处理数据格式。对于数据格式有3种处理方式:1)由应用程序自行处理;2)采用人可读的格式存储,比如txt、json、XML;3)独立存储数据格式和数据,如MySQL、采用独立的protocal buffer文件描述数据格式;4)将数据格式和数据存放在一起:一般将数据格式存放在数据之前(数据解释依赖其格式)。

实现细节

1)如何保证持久化一定成功?fsync?

2)如何定义通用的数据存储格式?