分布式存储是相对于集中式存储而言的。在介绍分布式存储之前,我们先来看看什么是集中式存储。不久前,企业存储设备还是集中式存储。所谓集中存储,可以看做概念上的集中,即整个存
分布式存储是相对于集中式存储而言的。在介绍分布式存储之前,我们先来看看什么是集中式存储。不久前,企业存储设备还是集中式存储。所谓集中存储,可以看做概念上的集中,即整个存储集中在一个系统中。然而,集中存储不是单个设备,而是集中在一组系统中的多个设备。以EMX公司的存储为例,整个存储系统可能需要几个柜子来存储。
图1集中存储的物理图
集中式存储基础架构这个存储系统有很多组件,除了磁头(控制器)、磁盘阵列(JBOD)、交换机等核心设备,还有管理设备等辅助设备。图2是集中式存储的基本逻辑图。
图2集中存储的逻辑图
集中式存储通常包括磁头,这是存储系统中最核心的组件。通常头部有两个控制器,可以作为备份,避免硬件故障导致整个存储系统不可用。头部通常包含前端端口和后端端口,前端端口用户为服务器提供存储服务,后端端口用于扩展存储系统的容量。通过后端端口头可以连接更多的存储设备,从而形成一个非常大的存储资源池。
磁头是整个存储系统的核心部件,整个存储系统的高级功能都在其中实现。控制器中的软件管理磁盘,将磁盘抽象为存储资源池,然后将它们划分为LUN供服务器使用。这里的LUN实际上是服务器上看到的磁盘。当然,有些集中存储本身也是文件服务器,可以为服务器提供共享文件服务。反正从上面我们可以看出,集中存储最大的特点就是有一个统一的入口,所有的数据都必须通过这个入口,这个入口就是存储系统的头部。
分布式存储是一个很大的概念,它包括很多种,包括分布式数据库、分布式缓存、分布式文件系统、分布式块存储和分布式对象存储。本文仅限于分布式文件系统等传统存储体系结构,不介绍数据库。
中间控制节点架构(HDFS)分布式存储最早由Google提出,其目的是通过廉价的服务器提供大规模、高并发场景下的Web访问问题。图3是谷歌分布式存储(HDFS)的简化模型。在系统的整个架构中,服务器分为两种,一种是namenode,负责管理管理数据(元数据),另一种是datanode,负责管理实际数据。
图3简化HDFS架构示意图
在上面的分布式存储中,如果客户端需要从一个文件中读取数据,首先从namenode(是哪个datanode)中获取文件的位置,然后从这个位置获取具体的数据。在这种架构中,namenode通常是活动和备用部署,而datanode是由大量节点组成的集群。由于元数据的频率和访问远小于数据,namenode通常不会成为性能瓶颈,而datanode集群可以分散客户端的请求。因此,通过这种分布式存储架构,可以通过横向扩展datanode的数量来增加承载能力,即实现动态横向扩展的能力。
完整的无中心架构计算模式(Ceph)它是Ceph存储系统的架构,如图所示,与HDFS不同的是,这种架构中没有中心节点。客户端通过一个设备映射关系计算出自己写数据的位置,这样客户端就可以直接和存储节点通信,避免了中心节点的性能瓶颈。
图4 Ceph无中心架构
Ceph存储系统架构的核心组件包括Mon服务、OSD服务和MDS服务。对于块存储类型,只需要Mon服务、OSD服务和客户端软件。其中,Mon服务用于维护存储系统的硬件逻辑关系,主要是服务器、硬盘等在线信息。Mon服务通过集群保证其服务的可用性。OSD服务用于管理磁盘,实现真正的数据读写。通常,一个磁盘对应一个OSD服务。
客户端访问存储的一般流程是,客户端启动后,会先从Mon服务中拉取存储资源布局信息,然后根据布局信息和写入数据的名称计算出所需数据的位置(包括具体的物理服务器信息和磁盘信息),然后直接与位置信息进行通信,读取或写入数据。
完全无中心架构一致性哈希(Swift)与Ceph通过计算获得数据位置的方式不同,另一种方式是通过一致哈希获得数据位置。一致性的方式是将设备做成哈希环,然后将根据数据名称计算出的哈希值映射到哈希环中的某个位置,从而实现数据定位。
图5一致性散列的原理
图5是一致性散列的基本原理。为了简单起见,本文以服务器上的磁盘为例进行介绍。为了保证设备故障时数据分布和数据迁移的统一性,一致哈希将磁盘划分为许多虚拟分区,每个虚拟分区都是哈希环中的一个节点。整个环是一个从0到最大32位的区间,首尾相连。计算数据(或数据名)的哈希值时,必须落入哈希环的某个区间,然后顺时针方向,必须找到一个节点。然后,这个节点就是数据存储的地方。
Swift存储的整个数据定位算法都是基于上述的一致哈希。在Swift对象存储中,帐户名/容器名/对象名三个名称组成一个位置标识符,通过这个唯一标识符可以计算出一个整数。在存储设备方面,Swift构建虚拟分区表。创建集群时,表的大小是确定的(通常是几十万)。这个表实际上是一个数组。这样,根据上面计算的整数值和数组,通过一致哈希算法就可以确定该整数在数组中的位置。数组中的每一项都是数据的三个副本(或其他副本)的设备信息(包括服务器、磁盘等信息)。也就是说,经过上述计算,可以确定数据存储的具体位置。这样,Swift可以将请求重定向到设备进行处理。
图6 SWIFT数据定位示意图
上面的计算过程是在一个名为Proxy的服务中进行的,这个服务可以部署在集群中。因此,可以共享请求的负载,而不会成为性能瓶颈。
本文介绍了三者中最常见的分布式存储架构和存储形式。其他存储架构基本都是基于以上架构,没有太大变化。所以了解了上面的架构之后,对了解其他分布式存储会有帮助。由于篇幅问题,本文不是很详细,每个架构的细节会在后面的号里更详细的介绍。