存储系统简介
单机存储系统
分布式存储系统
Q&A
如何解决文件写入cache之后系统重启数据丢失的问题
1、单节点
- 可以通过记录操作日志来进行恢复,使用
LVM
数据结构来顺序记录操作日志,然后顺序写入到磁盘,并且写成功了才能进行后续的操作。Prometheus
、leveldb
都是这也设计的,通过这种方式来解决缓存丢失的问题。 - 定时把缓存刷新到磁盘,这里的缓存不论是操作系统的
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
的缓冲区中。