1.2 各主流分布式方案对比
分布式存储系统种类繁多,通常按照使用场景,可将分布式存储系统划分为分布式块存储、分布式文件存储以及分布式对象存储 3 类,如图 1-6 所示。
图 1-6 分布式存储系统分类
块存储将裸磁盘空间直接映射给主机使用,主机层面操作系统识别出磁盘后,可对磁盘进行分区、格式化文件系统或者直接进行裸设备读写。块存储使用线性地址空间,不关心数据的组织方式以及结构,读写速度更快,但共享性较差。
文件存储将文件系统直接挂载给主机使用,主机层面操作系统可对挂载后的文件系统直接进行读写,读写操作遵循 POSIX(Portable Operating System Interface of UNIX)语义,类似操作本地文件系统。文件存储使用树状结构以及路径访问方式,更方便理解、记忆,更适合结构化数据的存取,共享性更好,但读写性能较差。
对象存储介于块存储与文件存储之间,以 restful api 或者客户端 sdk 的形式供用户使用,更适合非结构化数据的存取。对象存储使用统一的底层存储系统,管理文件以及底层介质的组织结构,然后为每个文件分配一个唯一的标识,用户需要访问某个文件,直接提供文件的标识即可。
除以上 3 种分布式存储方案的划分外,分布式存储系统还可分为分布式数据库系统和分布式缓存系统等。
从架构角度切入,无论是分布式块存储系统、分布式对象存储系统、分布式文件存储系统,抑或是分布式数据库系统、分布式缓存系统,其架构无外乎以下两种。
◆ 有中心架构
有中心架构下,分布式存储集群实现统一的元数据服务,元数据统一存储并管理,客户端发起对数据的读写前,先向元数据服务器发起读写请求。
◆ 无中心架构
无中心架构下,分布式存储系统没有单独的元数据服务,元数据与数据一样,切片打散后存储在多台存储服务器上,客户端通过特定算法进行计算,确定元数据及数据的存储位置,并直接向存储节点相关进程发起数据的读写访问请求。依照使用的算法类型,无中心架构又可细分为私有算法模式以及一致性散列(Hash)模式。下文以 HDFS、Ceph、Swift 为例,对 3 种方案做简要对比。
1.2.1 有中心架构
HDFS(Hadoop Distribution File System)是有中心分布式存储系统的典型代表。在这种架构中,一部分节点 Name Node 用于存放管理数据(元数据文件),另一部分节点Data Node 用于存放业务数据(数据文件),其系统架构如图 1-7 所示。
在图 1-7 中,如果客户端需要从某个文件读取数据,首先从 Name Node 获取该文件的位置信息(具体在哪个 Data Node),然后从该 Data Node 上获取具体的数据。在该架构中Name Node通常是主备部署,而Data Node则是由大量服务器节点构成一个存储集群。由于元数据的访问频度和访问量相对数据都要小很多(参见后文 HDFS 使用场景),因此Name Node 通常不会成为性能瓶颈;Data Node 在集群中通常将数据以副本形式存放,该策略下既可以保证数据的高可用性,又可以分散客户端的请求。因此,这种分布式存储架构可以横向扩展 Data Node 的数量来增加存储系统的承载能力,也即实现系统的动态横向扩展。
HDFS 目前主要用于大数据的存储场景,HDFS 也是 Hadoop 大数据架构中的存储组件。HDFS 在开始设计的时候,就已经明确了它的应用场景(即大数据服务),具体如下:
图 1-7 HDFS 系统架构
(1)对大文件存储的性能要求比较高的业务场景
HDFS 采用集中式元数据的方式进行文件管理,元数据保存在 Name Node 的内存中,文件数量的增加会占用大量的 Name Node 内存。即当 HDFS 存储海量小文件时,元数据会占用大量内存空间,引起整个分布式存储系统性能的下降。由于此限制,HDFS 更适合应用在存储大文件的使用场景,文件大小以百 MB 级别或者 GB 级别为宜。
(2)读多写少的业务场景
HDFS 的数据传输吞吐量比较高,但是数据写入时延比较差,因此,HDFS 不适合频繁的数据写入场景,但就大数据分析业务而言,其处理模式通常为一次写入、多次读取,然后进行数据分析工作,HDFS 可以胜任该场景。