现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem。全闪存真正为效率而生,重新定义存储速度。凭借极致性能,高可用性,为您极大提高企业级应用效率。提到闪存的优势,那么毋庸置疑的就是速度!而在速度优势背后,SSD则面临着价格、容量以及寿命等方面的限制。
当然随着技术的发展,成本的下降,SSD有可能会取代机械硬盘,成为下一代企业存储的主要介质。机械硬盘可能转变为磁带的角色。
但是,闪存速度的确就是现在存储系统的极限吗?现在有需要基于内存的数据库,比如Redis,TimesTen。也不得不提缓存系统的极佳实践memcached。spark也把操作的中间数据全都放入到内存中,避免了Hadoop实时性和可用性差的问题,有可能对Hadoop的生态圈产生深远影响。spark已经于2014年2月27日正式成为Apache基金会的顶级项目了。
RAMCloud,是一个完全使用DRAM的存储系统,它的所有数据都保存到内存中。当然了为了故障恢复RAMCloud会将日志和数据的备份持久化到普通硬盘中。在2014年的FAST会议中,RAMCloud发表了关于内存分配及管理机制的paper,并且被评为best paper,拜读此文后,形成此文以分享心得。
1. Why not use malloc?
现在又很多memory allocator,比如C的malloc,Google的tcmalloc。当然了还有Java的内存管理及GC。但是它们有几个问题,一个是效率底下,在访问模式变化多端时极容易产生内存碎片。实验表明,使用malloc只能使内存的利用率最大到50%。
memory allocator可以分成两类:non-copying and copying。non-copying allocator就是在内存分配后不会再移动它。对于单一的程序来说,这种分配方式非常自然,因为毕竟这些内存一旦申请它的大小也基本上不会再变了。但是对于存储系统来说,文件可以修改,比如增大或者减小,那么如果使用malloc,需要重新申请新的内存块,那么就非常容易产生碎片。比如系统刚开始新建了一片100B大小的文件,后来部分文件增大到130B,那么,释放的100B的空间有可能会产生碎片,比如以后没有再写<=100B大小的文件。(注:内存碎片的确在这种内存存储系统中非常容易产生,而且作者设计的测试用例的确也使得malloc的内存利用率最大也就到50%。但是实际生产环境是否是这个样子现在不得而知。总之RAMCloud的内存分配和管理的确挺好,但是malloc是否在生产环境下是否是真的如此不堪,现在也无法定论。关于malloc的内存分配,请阅《malloc内存分配与free内存释放的原理》)。
对于copying allocator,通过garbage collector的确可以解决碎片的问题。但是缺点就是需要遍历所有的数据才能够重新分配。但是,处于性能的考虑,需要很多额外的内存(1.5倍到5倍)。这样也就失去了通过碎片管理来提高内存使用率的初衷了。而且还有一个问题是需要长时间的服务暂停。拿Java的GC来说,它需要3-4秒,这个时间对于RAMCloud来说,已经可以检测到一个故障的节点并且恢复64GB的数据了。(注: 不知道是否是不恰当的使用Java使得在此蒙冤了,尽管的确它是有问题)
2. RAMCloud概述
由于本文主要为了阐述基于日志的内存分配管理,因此本节主要介绍storage的management,和为什么需要基于日志的内存分配管理机制,而摒弃原有的。
RAMCloud最适合的场景是已经将服务器分为应用服务器(主要实现生成网页和执行业务规则等应用逻辑)和存储服务器(为应用服务器提供长期共享存储)的数据中心。这些数据中心一般支持许多应用,有的很小,只使用一台服务器的一部分能力,有的很大,要用到数千台专用应用和存储服务器。
而且,内存云中保存的信息必须和硬盘一样持久,单个存储服务器的故障不能造成数据丢失和哪怕几秒钟的服务不可用。RAMCloud将所有数据存放在DRAM中,性能可以达到比目前最高性能的硬盘存储系统还要高100~1000倍。在访问延迟方面,RAMCloud方案中运行在应用服务器中的一个进程从同一数据中心的存储服务器中通过网络读取数百字节数据只需5~10μs,而目前实际系统一般要花费0.5~10ms,具体取决于数据是在服务器内存缓存中,还是硬盘中。而且,一台多核存储服务器每秒可以服务至少100万次小读取请求。而硬盘系统中同样的机器每秒只能服务1000~10000次请求。
系统架构图如下。
每个storage server都包含两个部分: Master和Backup。Master管理了存储在memory中的object。Backup使用本地的机械硬盘或者固态硬盘保存了其他server的数据备份。Coordinator管理了Master和Backup配置信息,比如集群各个server之间的关系和各个备份的分配。但是Coordinat