使用场景
云计算
云计算场景中, 通常使用对象存储系统来做保存文件, 例如用户上传的图片, 视频, 文档等, 或是虚拟镜像, iso镜像的内部数据. 公有云厂商通常还会基于对象存储提供SDN服务, 用来加速用户数据的访问. 而块存储则作为一种补充, 提供独立于虚拟机的(虚拟机删除数据不丢失), 方便扩展的存储设备.
对象存储由于是通过网络API提供服务的, 所以可以跨集群访问.
集群内文件共享
集群内文件共享的方案非常多, windows上的共享磁盘, linux 上的samba, nfs 等项目都提供这样的功能. 集群文件系统通常会和NAS进行对比, 以体现其在成本方面的优势. 但是, 由于传统的基于共享磁盘的集群文件系统在可扩展性方面比较弱, 有催生的分布式的集群文件系统, moosefs 就是典型的分布式集群文件系统.
集群文件系统也可以用来存储虚拟机镜像, 已达到存储节点和计算节点的分离.
直观上看, 对象存储系统与业务系统是平行关系, 而集群文件系统则通常是业务系统的一个组成部分.
选型标准
分布式存储目前主要分两大类: 块存储(文件系统, 裸设备), 对象存储. 像 NFS 这样只提供, 只提供简单磁盘共享, 缺乏扩展能力的项目, 只能叫集群存储, 而不能算分布式存储.
考虑到未来分布式存储的可能有多种应用场景, 所以我们更关注各个方案的功能是否完备. 以下是本次选型的标准.
- 支持对象存储, 支持主流编程语言
- 支持 HTTP API
- 支持块存储
- 社区成熟, 文档完善
方案对比
总览
- | Ceph | Taobao TFS | Openstack Swift | MooseFS |
---|---|---|---|---|
对象存储 | YES | NO | YES | NO |
块存储 | YES | YES | NO | YES |
实现语言 | C++ | C | Python | C |
HTTP API | YES | NO[1] | YES | NO |
语言支持 | 丰富 | JAVA, C++ | 丰富 | -[2] |
文档 | 丰富 | 少 | 丰富 | 丰富 |
- TFS 体系中有一个nginx-tfs的组件提供 Restful API 支持, 但是这个项目不知道什么原因目前已经无法访问.
- 直接挂载使用, 无需 SDK 或者 API 支持.
架构相关
|-|Ceph |Taobao TFS |Openstack Swift |MooseFS |
|----|----|----|----|----|----|
|MetaData冗余[1] |YES[选举] |YES[主从] |NO[3] |YES[主从]
|数据冗余[2] |YES |YES |YES |YES
- 元数据的安全性对于分布式存储的稳定至关重要, 元数据的丢失将导致整个集群数据的丢失.
- 分布式存储系统通常会将数据存储多份, 从而避免使用Raid 来保证数据安全. 一方面可以保证数据安全(可以随意重启服务器), 另一方面可以一定程度上提高读性能.
- Swift 使用一致性 hash 计算来确定数据存储的位置, 减少了 MetaData 的量, 但是依然有一些集群的配置信息需要存储, 这些数据被存储在 ring 中(作为 proxy server 的一部分), ring 在整个集群中只有一份, 需要手动备份. 如果ring里的信息全部丢失, 将导致集群中的数据全部失效.
对象存储相关
- | Ceph | Taobao TFS | Openstack Swift | MooseFS |
---|---|---|---|---|
用户管理 | YES | NO[2] | YES | - |
配额管理 | 容量, 对象数 | NO | 容量, 对象数 | - |
SDK | YES[1] | YES | YES | - |
S3 API | YES | NO | NO | - |
Swift API | YES | NO | YES | - |
对象自动过期 | NO | NO | YES | - |
- Ceph 不提供专门的SDK, 但是可以使用Amazon S3 或者 Openstack Swift 兼容客户端.
- TFS 体系中有一个rcserver组件, 可以为不同的应用(用户)返回不同的 TFS 集群信息, 实际上是通过多集群部署的方式实现多用户隔离.
块存储相关
- | Ceph | Taobao TFS | Openstack Swift | MooseFS |
---|---|---|---|---|
配额管理 | 容量, 文件数 | - | - | 容量, 文件数 |
快照 | YES | - | - | YES |
由于块存储是直接挂载到操作系统上使用的, 除了使用软件本身的配额管理工具, 还可以使用操作系统的配个管理工具来实现基于用户的容量配额管理.
总结
- MooseFS作为老牌的分布式文件系统, 应用广泛, 文档丰富. 如果只是希望在集群内共享数据, 其实非常适合.
- Taobao TFS 是大厂的开源产品, 在 taobao 内部大规模使用. 官网上代码在持续更新, 但是文档的最后更新时间都停留在2011年9月, 文档极度匮乏, 很多重要功能都没有文档支持. 功能上, HTTP API 支持不完善, 目前仅有 Java 或 C++ SDK可用, 这也是生态比较差的具体表现.
- Swift, openstack 的核心组件. 但是只支持对象存储. 除了Swift, Openstack 体系中还有 Cinder 组件, 用来提供块存储(云硬盘)支持. 还有 Glance 用来提供虚拟机镜像管理的API, 后端使用Swift. 如果要部署Openstack, 那么 Swift 是存储系统的不二之选.
- Ceph, 作为独立的存储基础设施解决方案, Ceph 是一个比较理想的方案. 它同时提供对象存储, 块存储功能;API, SDK 丰富, 文档完善; 可以作为 Openstack 的存储组件使用, 代替 Openstack 中的 Swift 和 Cinder.
根据前述选项标准, 这里推荐部署Ceph系统.