数据存储方式
文件、块和对象是三种以不同的方式来保存、整理和呈现数据的存储格式。这些格式各有各的功能和限制。文件存储会以文件和文件夹的层次结构来整理和呈现数据;块存储会将数据拆分到任意划分且大小相同的卷中; 对象存储会管理数据并将其链接至关联的元数据。
三者的本质差别是使用数据的“用户”不同:
- 文件存储的用户是自然人
- 块存储的用户是可以读写块设备的软件系统,例如传统的文件系统、数据库
- 对象存储的用户则是其它计算机软件
块存储
块存储一般体现形式是卷或者硬盘(比如windows的c盘),数据是按字节来访问的,对于块存储而言,对里面存的数据内容和格式是完全一无所知的。好比上面图中,数据就像玉米粒一样堆放在块存储里,块存储只关心玉米粒进来和出去,不关心玉米粒之间的关系和用途。
块存储只负责数据读取和写入,因此性能很高,适用于对响应时间要求高的系统。比如数据库等。
文件存储
文件存储一般体现形式是目录和文件(比如C:\Users\Downloads\text.doc),数据以文件的方式存储和访问,按照目录结构进行组织。文件存储可以对数据进行一定的高级管理,比如在文件层面进行访问权限控制等。好比上面图中,数据像玉米粒一样组成玉米棒子,再对应到不同的玉米杆上,要找到某个玉米粒,先找到玉米杆,再找到玉米棒子,然后根据玉米粒在玉米棒子上的位置找到它。
文件存储可以很方便的共享,因此用途非常广泛。比如常用的NFS、CIFS、ftp等都是基于文件存储的。
对象存储
对象存储一般体现形式是一个UUID,数据和元数据打包在一起作为一个整体对象存在一个超大池子里。对于对象访问,只需要报出它的UUID,就能立即找到它,但访问的时候对象是作为一个整体访问的。好比上面图中,数据的玉米粒被做成了玉米罐头,每个玉米罐头都有一个唯一出厂号,但是买卖罐头,都一次是一盒为单位。
从设计之初衷(一般的对象存储都是基于哈希环之类的技术来实现),对象存储就可以非常简单的扩展到超大规模,因此非常适合数据量大、增速又很快的视频、图像等。
分布式文件系统比较及部分原理
存储系统 | CephFS | GlusterFS | TFS | HDFS | MooseFS | FastDFS | MogileFS |
---|---|---|---|---|---|---|---|
开发语言 | C++ | C | C++ | Java | C | C | Perl |
系统性能 | 很高 | 高 | |||||
数据存储方式 | 对象/文件/块 | 文件/块 | 文件 | 文件 | 块 | 文件/块 | 文件 |
集群节点通信协议 | 私有协议(TCP) | 私有协议(TCP)/ RDAM(远程直接访问内存) | TCP | TCP | TCP | TCP | HTTP |
专用元数据存储点 | 占用MDS | 无 | 占用NS | 占用MDS | 占用MFS | 无 | 占用DB |
在线扩容 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
冗余备份 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 不支持 |
单点故障 | 不存在 | 不存在 | 存在 | 存在 | 存在 | 不存在 | 存在 |
跨集群同步 | 不支持 | 支持 | 支持 | 不支持 | 不支持 | 部分支持 | 不支持 |
易用性 | 安装简单,官方文档专业化 | 安装简单,官方文档专业化 | 安装复杂,官方文档少 | 安装简单,官方文档专业化 | 安装简单,官方文档多 | 安装简单,社区相对活跃 | 未知 |
适用场景 | 单集群的大中小文件 | 跨集群云存储 | 跨集群的小文件 | Mapreduce使用的文件存储 | 单集群的大中文件 | 单集群的中小文件 | 未知 |
FUSE挂载 | 支持 | 支持 | 未知 | 支持 | 支持 | 不支持 | 不支持 |
访问接口 | POSIX | POSIX | 不支持POSIX | 不支持POSIX | POSIX | 不支持POSIX | 不支持POSIX |
TFS
TFS(Taobao File System)是由淘宝开发的一个分布式文件系统,其内部经过特殊的优化处理,适用于海量的小文件存储,目前已经对外开源。TFS采用自有的文件系统格式存储,因此需要专用的API接口去访问,目前官方提供的客户端版本有:C++/JAVA/PHP(没有C的接口)
-
特点:
- 主备热切换
- 所有元数据都是在内存中,处理效率非常高效
- 系统架构也非常简单,管理也很方便
- 具备负载均衡和冗余备份的功能;对小文件会采取合并策略,减少数据碎片
-
优点:
- 针对小文件量身定做,随机IO性能比较高
- 支持在线扩容机制,增强系统的可扩展性
- 实现了软RAID,增强系统的并发处理能力及数据容错恢复能力
- 支持主备热倒换,提升系统的可用性
- 支持主从集群部署,其中从集群主要提供读/备功能
-
缺点
- TFS只对小文件做优化,不适合大文件的存储
- 不支持POSIX通用接口访问,通用性较低
- 不支持自定义目录结构,及文件权限控制
- 通过API下载,存在单点的性能瓶颈
- 官方文档非常少,学习成本高
-
应用场景
- 多集群部署的应用
- 存储后基本不做改动
- 海量小型文件
FastDFS
FastDFS是国人开发的一款分布式文件系统,目前社区比较活跃,提供了C、Java和PHP API。实现软RAID10,提升并发IO的性能、简单负载均衡及数据的冗余备份;同时通过线性的添加新的逻辑存储组,从容实现存储容量的线性扩容。文件下载上,除了支持通过API方式,目前还提供了apache和nginx的插件支持,同时也可以不使用对应的插件,直接以Web静态资源方式对外提供下载。内部的网络模型使用比较成熟的libevent三方库,具备高并发的处理能力。
-
特点:
- Tracker服务器是整个系统的核心枢纽,其完成了访问调度(负载均衡),监控管理Storage服务器
- FastDFS支持多个备用的Tracker,消除系统的单点故障
- 只有同组的Storage才做同步
- FastDFS在主从文件ID上做取巧,完成了关联关系的存储
-
优点:
- 针系统无需支持POSIX(可移植操作系统),降低了系统的复杂度,处理效率更高
- 支持在线扩容机制,增强系统的可扩展性
- 实现了软RAID10,增强系统的并发处理能力及数据容错恢复能力
- 支持主从文件,支持自定义扩展名
- 主备Tracker服务,增强系统的可用性
- 支持小文件合并存储
-
缺点
- 不支持POSIX通用接口访问,通用性较低
- 对跨公网的文件同步,存在较大延迟,需要应用做相应的容错策略
- 同步机制不支持文件正确性校验,降低了系统的可用性
-
应用场景
- 单集群部署的应用
- 存储后基本不做改动
- 小中型文件
CephFS
Ceph是一个可以按对象/块/文件方式存储的开源分布式文件系统,其设计之初,就将单点故障作为首先要解决的问题,因此该系统具备高可用性、高性能及可扩展等特点。该文件系统支持目前还处于试验阶段的高性能文件系统BTRFS(B-Tree文件系统),同时支持按OSD方式存储,因此其性能是很卓越的。
-
特点:
- Ceph底层存储是基于RADOS(可靠的、自动的分布式对象存储),它提供了LIBRADOS/RADOSGW/RBD/CEPH FS方式访问底层的存储系统
- 通过FUSE,Ceph支持类似的POSIX访问方式;Ceph分布式系统中最关键的MDS节点是可以部署多台,无单点故障的问题,且处理性能大大提升
- Ceph通过使用CRUSH算法动态完成文件inode number到object number的转换,从而避免再存储文件metadata信息,增强系统的灵活性
-
优点:
- 支持对象存储(OSD)集群,通过CRUSH算法,完成文件动态定位, 处理效率更高
- 支持通过FUSE方式挂载,降低客户端的开发成本,通用性高
- 支持分布式的MDS/MON,无单点故障
- 强大的容错处理和自愈能力
- 支持在线扩容和冗余备份,增强系统的可靠性
-
缺点
- 目前处于试验阶段,系统稳定性有待考究
- ceph目前还不足够成熟,它基于的btrfs本身也不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中
-
应用场景
- 全网分布式部署的应用
- 对实时性、可靠性要求比较高官方宣传,存储容量可轻松达到PB级别
GlusterFS
GlusterFS是Red Hat旗下的一款开源分布式文件系统,它具备高扩展、高可用及高性能等特性,由于其无元数据服务器的设计,使其真正实现了线性的扩展能力,使存储总容量可 轻松达到PB级别,支持数千客户端并发访问;对跨集群,其强大的Geo-Replication可以实现集群间数据镜像,而且是支持链式复制,这非常适用于跨集群的应用场景。
-
特点:
- 支持FUSE方式挂载,可以通过标准的NFS/SMB/CIFS协议像访问本体文件一样访问文件系统,同时其也支持HTTP/FTP/GlusterFS访问
- 通过基于SSH的命令行管理界面,可以远程添加、删除存储节点,也可以监控当前存储节点的使用状态
- 持集群节点中存储虚拟卷的扩容动态扩容;同时在分布式冗余模式下,具备自愈管理功能,在Geo冗余模式下,文件支持断点续传、异步传输及增量传送等特点
-
优点:
- 支持POSIX(可移植操作系统),支持FUSE挂载通过多种协议访问,通用性比较高
- 支持在线扩容机制,增强系统的可扩展性
- 实现了软RAID,增强系统的并发处理能力及数据容错恢复能力
- 强大的命令行管理,降低学习、部署成本
- 支持整个集群镜像拷贝,方便根据业务压力,增加集群节点
- 官方资料文档专业化,该文件系统由Red Hat企业级做维护,版本质量有保障
-
缺点
- 通用性越强,其跨越的层次就越多,影响其IO处理效率
- 频繁读写下,会产生垃圾文件,占用磁盘空间
-
应用场景
- 多集群部署的应用
- 中大型文件根据目前官方提供的材料,现有的使用GlusterFS系统存储容量可轻松达到PB
MooseFS
MooseFS是一个高可用的故障容错分布式文件系统,它支持通过FUSE方式将文件挂载操作,相对比较轻量级,同时其提供的web管理界面非常方便查看当前的文件存储状态。但其对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多。
HDFS
安装简单,官方文档专业化;大数据批量读写,吞吐量高;一次写入,多次读取,顺序读写;难以满足毫秒级别的低延时数据访问;不支持多用户并发写相同文件;不适用于大量小文件;适合存储非常大的文件。
MogileFS
依赖数据库,Trackers(控制中心):负责读写数据库,作为代理复制storage间同步的数据,除了API,可以通过与nginx集成,对外提供下载服务,
选型参考
-
按特性分类
- 适合做通用文件系统的有:Ceph,Lustre,MooseFS,GlusterFS
- 适合做小文件存储的文件系统有:Ceph,MooseFS,MogileFS,FastDFS,TFS
- 适合做大文件存储的文件系统有:HDFS,Ceph,Lustre,GlusterFS,GridFS
- 轻量级文件系统有:MooseFS,FastDFS
- 简单易用,用户数量活跃的文件系统有:MooseFS,MogileFS,FastDFS,GlusterFS
- 支持FUSE挂载的文件系统有:HDFS,Ceph,Lustre,MooseFS,GlusterFS
-
初步筛选
- 考虑到GFS不开源,学习成本高,且相关特性资料不全面的情况下,暂时先不考虑使用GFS上文没写)
- Ceph目前不够成熟稳定,很少有使用在生产环境的案例,暂时排除
- Lustre对内核依赖程度过重,且不易安装使用,暂时排除(上文没写)
- TFS安装复杂,且官方文档少,不利于以后的学习使用,暂时先排除
- 经初步筛选剩下的文件系统有:HDFS、MooseFS、MogileFS、FastDFS、GlusterFS、GridFS
-
根据需求进一步筛选
-
需求
- 需要搭建一部管理原始凭证的文件系统,原始凭证的文件类型主要是小文件(<100M),不会对文件进行变更,无写操作,读操作量大,且对安全性要求较高
- 随着系统在使用过程中数据量逐步庞大,文件的量会变得繁多,对文件读取速率要求尽可能高但不追求极致
- 文件系统需要有较完善的冗余备份与容错机制,功能尽量精简耐用,安装配置应简单且适合于国产环境部署
-
分析
- 需要选择适合海量小文件存储的文件系统,适合的文件系统有:MooseFS,MogileFS,FastDFS
- 其次需要支持冗余备份,适合的文件系统有:MooseFS、FastDFS、GlusterFS
- 符合条件1,2且功能精简的文件系统有:FastDFS
- 符合条件1,2且功能全面的文件系统有:MooseFS
-