文件存储系统设计

May 07, 2019

存储系统简介

单机存储系统

分布式存储系统

Q&A

如何解决文件写入cache之后系统重启数据丢失的问题

1、单节点

  • 可以通过记录操作日志来进行恢复,使用LVM数据结构来顺序记录操作日志,然后顺序写入到磁盘,并且写成功了才能进行后续的操作。Prometheusleveldb都是这也设计的,通过这种方式来解决缓存丢失的问题。
  • 定时把缓存刷新到磁盘,这里的缓存不论是操作系统的Page cache还是用户空间中的自定义缓存,都可以用这种方法,手动刷新缓存落地。

2、分布式

  • 集群节点中可以通过副本的方式来保证一定有节点落地成功,典型应用kafak,kafka通过mmap内存映射文件技术,把用户态的内存映射到Page cache中去,节省了用户态缓存到page cache的复制时间,这样就会出现系统重启之后丢失数据问题,所以kafak一般配置为所有的副本分片都接收到了消息才认为成功,这样总有机器数据是完整的。副本也是现在很多分布式系统用的多的解决方案。

随机读写、顺序读写概念和性能问题

1、随机读写

而每次随机读写的时候,寻道和旋转步骤都需要执行(不考虑操作系统读写缓冲),并且随机读时缓存命中较低,这样就导致频繁的操作io,读取速度下降。对于随机读取的系统,设计是可以考虑进行directio,对文件进行直接读取。

2、顺序读写

在顺序读写的时候,寻道和旋转步骤只需要执行一次,剩下的全是数据传输所需要的固有开销。

测试结果

为什么kafka这么快

1、kafka写入数据时采用了顺序写入文件并且采用了mmap内存映射文件,可以减少一次copy,并且直接把数据写入到page cache中,操作系统再定期刷新到磁盘上去。这是produce写入快。 2、kafka使用了SendFile技术,DMA引擎将文件中的数据拷贝到操作系统内核缓冲区中page cache,然后数据被拷贝到与socket相关的内核缓冲区。接下来,DMA引擎将数据从内核socket缓冲区中拷贝到协议引擎。这就是consumer速度快的原因,数据流直接从page cache发送到了socket的缓冲区中。

ssd相关的技术

参考文章以及书籍


LRF 记录学习、生活的点滴