《重识云原生系列》专题索引:
分布式云存储知识地图:
在了解什么是分布式存储之前,我们先来简单了解一下存储几十年来的大概历程。
直连存储与中心化存储也可以统称为集中式存储。
集中式存储系统中,整个存储资源是集中在一个系统中的,但集中式存储并不是一个单独的设备,是集中在一套系统当中的多个设备,比如下图中的 EMC 存储就需要几个机柜来存放。
在这个存储系统中包含很多组件,除了核心的机头(控制器)、磁盘阵列( JBOD )和交换机等设备外,还有管理设备等辅助设备。
结构中包含一个机头,这个是存储系统中最为核心的部件。通常在机头中有包含两个控制器,互为备用, 避免硬件故障导致整个存储系统的不可用。机头中通常包含前端端口和后端端口,前端端口用户为服务器提供存储服务,而后端端口用于扩充存储系统的容量。通过后端端口机头可以连接更多的存储设备,从而形成一个非常大的存储资源池。
在整个结构中,机头中是整个存储系统的核心部件,整个存储系统的高级功能都在其中实现。控制器中的软件实现对磁盘的管理,将磁盘抽象化为存储资源池,然后划分为 LUN 提供给服务器使用。这里的 LUN 其实就是在服务器上看到的磁盘 。当然,一些集中式存储本身也是文件服务器,可以提供共享文件服务。无论如何,从上面我们可以看出集中式存储 最大的特点是有一个统一的入口,所有数据都要经过这个入口 ,这个入口就是存储系统的机头。这也就是集中式存储区别于分布式存储最显著的特点。如下图所示:
分布式存储最早是由谷歌提出的,其目的是通过廉价的服务器来提供使用与大规模,高并发场景下的 Web 访问问题。它 采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
1 、分布式存储的兴起
分布式存储的兴起与互联网的发展密不可分,互联网公司由于其数据量大而资本积累少,而通常都使用大规模分布式存储系统。
与传统的高端服务器、高端存储器和高端处理器不同的是,互联网公司的分布式存储系统由数量众多的、低成本和高性价比的普通 PC 服务器通过网络连接而成。其主要原因有以下三点:
2 、分布式存储的重要性
从单机单用户到单机多用户,再到现在的网络时代,应用系统发生了很多的变化。而分布式系统依然是目前很热门的讨论话题,那么,分布式系统给我们带来了什么,或者说是为什么要有分布式系统呢?
分布式存储包含的种类繁多,除了传统意义上的分布式文件系统、分布式块存储和分布式对象存储外,还包括分布式数据库和分布式缓存等,但其中架构无外乎于三种:
A、 中间控制节点架构
以 HDFS ( Hadoop Distribution File System )为代表的架构是典型的代表。在这种架构中,一部分节点 NameNode 是存放管理数据(元数据),另一部分节点 DataNode 存放业务数据,这种类型的服务器负责管理具体数据。这种架构就像公司的层次组织架构, namenode 就如同老板,只管理下属的经理( datanode ),而下属的经理,而经理们来管理节点下本地盘上的数据。
在上图中, 如果客户端需要从某个文件读取数据,首先从 NameNode 获取该文件的位置(具体在哪个 DataNode ),然后从该 NameNode 获取具体的数据。在该架构中 NameNode 通常是主备部署( Secondary NameNode ),而 DataNode 则是由大量节点构成一个集群。由于元数据的访问频度和访问量相对数据都要小很多,因此 NameNode 通常不会成为性能瓶颈,而 DataNode 集群中的数据可以有副本,既可以保证高可用性,可以分散客户端的请求。因此,通过这种分布式存储架构可以通过横向扩展 datanode 的数量来增加承载能力,也即实现了动态横向扩展的能力。
B、 完全无中心架构 – 计算模式
以 Ceph 为代表的架构是其典型的代表。在该架构中与 HDFS 不同的地方在于该架构中没有中心节点。客户端是通过一个设备映射关系 计算出来 其写入数据的位置,这样客户端可以直接与存储节点通信,从而避免中心节点的性能瓶颈。
如上图所示, 在 Ceph 存储系统架构中核心组件有 MON 服务、 OSD 服务和 MDS 服务等。
(1) MON 服务用于维护存储系统的硬件逻辑关系,主要是服务器和硬盘等在线信息。MON 服务通过集群的方式保证其服务的可用性。
(2) OSD 服务用于实现对磁盘的管理,实现真正的数据读写,通常一个磁盘对应一个 OSD 服务。
(3) MDS 只为 CephFS 文件存储系统跟踪文件的层次机构和存储元数据。Ceph 块设备和 RADOS 并不需要元数据,因此也不需要 Ceph MDS 守护进程。
(4) RADOS :RADOS 就是包含上述三种服务的 ceph 存储集群。在 Ceph 中所有的数据都以对象形式存在的,并且无论哪种数据类型 RADOS 对象存储都将负责保存这些对象。RADOS 层可以确保数据始终保持一致性。要做到这一点必须执行数据复制、故障检测和恢复,以及数据迁移和所在集群节点实现在平衡。
(5) RBD (块设备):原名 RADOS 块设备,提供可靠的分布式和高性能块存储磁盘给客户端。
(6) CephFS :Ceph 文件系统提供了一个使用 Ceph 存储集群存储用户数据的与 POSIX 兼容的文件系统。
(7) Librados :libRADOS 库为 PHP 、 RUBY 、 Java 、 Python 、 C++ 等语言提供 了方便的访问 RADOS 接口的方式。
(8) RADOS GW :RGW 提供对象存储服务,它允许应用程序和 Ceph 对象存储建立连接, RGW 提供了与 Amazon S3 和 openstack Swift 兼容的 RUSTFUL API。
客户端访问存储的大致流程是,客户端在启动后会首先通过 RADOS GW 进入,从 MON 服务拉取存储资源布局信息,然后根据该布局信息和写入数据的名称等信息计算出期望数据的位置(包含具体的物理服务器信息和磁盘信息),然后和该位置信息对应的 CephFS 对应的位置直接通信,读取或者写入数据
C、 完全无中心架构 – 一致性哈希
以 swift 为代表的架构是其典型的代表。与 Ceph 的通过计算方式获得数据位置的方式不同,另外一种方式是通过一致性哈希的方式获得数据位置。一致性哈希的方式就是将设备做成一个哈希环,然后根据数据名称计算出的哈希值映射到哈希环的某个位置,从而实现数据的定位。
Swift 中存在两种映射关系,对于一个文件,通过哈希算法( MD5 )找到对应的虚节点(一对一的映射关系),虚节点再通过映射关系( ring 文件中二维数组)找到对应的设备(多对多的映射关系),这样就完成了一个文件存储在设备上的映射。
分布式存储架构由三个部分组成:客户端、元数据服务器和数据服务器。客户端负责发送读写请求,缓存文件元数据和文件数据。元数据服务器负责管理元数据和处理客户端的请求,是整个系统的核心组件。数据服务器负责存放文件数据,保证数据的可用性和完整性。该架构的好处是性能和容量能够同时拓展,系统规模具有很强的伸缩性。
分布式存储分为文件存储、对象存储和块存储,但它们三种存储方式的基本架构都是大同小异的。即客户端或应用端、元数据(MDS)服务器和数据节点服务器。客户端和元数据服务器之间交互是“信令交互”,而客户端到数据节点是“媒体交互”。元数据服务器或通过数据节点服务器获取各节点服务器的基本配置情况和状态信息。
典型设备:磁盘阵列,硬盘
块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘、做Raid、或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘。(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了。例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘。)
接着块存储会采用映射的方式将这几个逻辑盘映射给主机,主机上面的操作系统会识别到有5块硬盘,但是操作系统是区分不出到底是逻辑还是物理的,它一概就认为只是5块裸的物理硬盘而已,跟直接拿一块物理硬盘挂载到操作系统没有区别的,至少操作系统感知上没有区别。
此种方式下,操作系统还需要对挂载的裸硬盘进行分区、格式化后,才能使用,与平常主机内置硬盘的方式完全无异。
优点:
缺点:
典型设备:FTP、NFS服务器
为了克服上述文件无法共享的问题,所以有了文件存储。
文件存储也有软硬一体化的设备,但是其实普通拿一台服务器/笔记本,只要装上合适的操作系统与软件,就可以架设FTP与NFS服务了,架上该类服务之后的服务器,就是文件存储的一种了。
主机A可以直接对文件存储进行文件的上传下载,与块存储不同,主机A是不需要再对文件存储进行格式化的,因为文件管理功能已经由文件存储自己搞定了。
优点:
缺点:
典型设备:内置大容量硬盘的分布式服务器
对象存储最常用的方案,就是多台服务器内置大容量硬盘,再装上对象存储软件,然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。管理节点可以管理其他服务器对外提供读写访问功能。
之所以出现了对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬它俩各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一个读写快,利 于共享的出来呢。于是就有了对象存储。
首先,一个文件包含了了属性(术语叫metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。
以往像FAT32这种文件系统,是直接将一份文件的数据与metadata一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(如4M的文件,假设文件系统要求一个块4K,那么就将文件打散成为1000个小块),再写进硬盘里面,过程中没有区分数据/metadata的。而每个块最后会告知你下一个要读取的块的地址,然后一直这样顺序地按图索骥,最后完成整份文件的所有块的读取。
这种情况下读写速率很慢,因为就算你有100个机械手臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有1个机械手臂在实际工作。
而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。
这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。
另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。
所以对象存储的出现,很好地结合了块存储与文件存储的优点。
1.3.4.1 块存储
块存储是一种裸设备,它是将存储设备以“块”的方式直接提供给客户,由客户自己的操作系统里的文件系统进行管理。
华为的FusionStorage是一个典型的“块”存储。FusionStorage分成了MDC、OSD和Client三部分。和其他分布式存储重大的差别是:MDC是记录、更新OSD服务器、磁盘等的状态,并把这些状态数据实时同步给Vbs,由Vbs计算出来数据所落的位置。MDC可以单独部署,也可以集中部署,也可以分布部署。
一般分布式存储的MDC采用的是数据库或内存储数据库来记录数据块和物理位置关系。客户端向MDC发出询问位置的请求,MDC查询数据库后返回请求数据的存储位置。
这种方法存储访问的速度较慢,而且MDC作为交通的“枢纽”,绝对是整个存储的核心,当MDC发生故障,会导致整个存储都不能使用。但是采取这个方式,也有好处,比如可以根据不同需求设置不同的副本策略等。
1.3.4.2 对象存储
对象存储是在同样容量下提供的存储性能比文件存储更好,又能像文件存储一样有很好的共享性。实际使用中,性能不是对象存储最关注的问题,需要高性能可以用块存储,容量才是对象存储最关注的问题。
所以对象存储的持久化层的硬盘数量更多,单盘的容量也更大。对象存储的数据的安全性保障也各式各样,可以是单机raid或网络raid,也可以副本。
Ceph和google基于GFS的存储就是典型的对象存储。
1.3.4.3 区别
分布式块存储里是没有文件系统的,是通过客户端直接将最简单明了的命令传递给存储的“块”来执行。
对象存储和文件存储虽然结构类似,但并不将存储底层的“块”直接提供出来,而是通过隐藏着一个文件系统,包装成为“文件”或“对象”提供出来。
这些存储“不挑”操作系统或终端,最终执行命令的是存储里面的文件系统操控存储执行的,所以共享性很好。
文件存储通过“目录+文件名+偏移量”来检索,文件间有目录层次的;
而对象存储采用“唯一对象ID+偏移量”来检索,对象扁平存储的,是没有层次的。而且块、对象、文件存储是可以相互转换的。
在主流的分布式存储技术中,HDFS/GPFS/GFS属于文件存储,Swift属于对象存储,而Ceph可支持块存储、对象存储和文件存储,故称为统一存储。
Ceph最早起源于Sage就读博士期间的工作、成果于2004年发表,并随后贡献给开源社区。经过多年的发展之后,已得到众多云计算和存储厂商的支持,成为应用最广泛的开源分布式存储平台。
Ceph根据场景可分为对象存储、块设备存储和文件存储。Ceph相比其它分布式存储技术,其优势点在于:它不单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡。同时,由于采用了CRUSH、HASH等算法,使得它不存在传统的单点故障,且随着规模的扩大,性能并不会受到影响。
Ceph的最底层是RADOS(分布式对象存储系统),它具有可靠、智能、分布式等特性,实现高可靠、高可拓展、高性能、高自动化等功能,并最终存储用户数据。RADOS系统主要由Ceph OSD、Ceph Monitors两部分组成,Ceph OSD 的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。Ceph Monitor维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。
LIBRADOS层的功能是对RADOS进行抽象和封装,并向上层提供API,以便直接基于RADOS进行应用开发。RADOS是一个对象存储系统,因此,LIBRADOS实现的API是针对对象存储功能的。物理上,LIBRADOS和基于其上开发的应用位于同一台机器,因而也被称为本地API。应用调用本机上的LIBRADOS API,再由后者通过socket与RADOS集群中的节点通信并完成各种操作。
Ceph上层应用接口涵盖了RADOSGW(RADOS Gateway)、RBD(Reliable Block Device)和Ceph FS(Ceph File System),其中,RADOSGW和RBD是在LIBRADOS库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。
应用层就是不同场景下对于Ceph各个应用接口的各种应用方式,例如基于LIBRADOS直接开发的对象存储应用,基于RADOSGW开发的对象存储应用,基于RBD实现的云主机硬盘等。
1.CRUSH算法
CRUSH算法是ceph的两大创新之一,简单来说,ceph摒弃了传统的集中式存储元数据寻址的方案,转而使用CRUSH算法完成数据的寻址操作。采用CRUSH算法,数据分布均衡,并行度高,不需要维护固定的元数据结构。
2.高可用
Ceph中的数据副本数量可以由管理员自行定义,并可以通过CRUSH算法指定副本的物理存储位置以分隔故障域,支持数据强一致性,适合读多写少场景;ceph可以忍受多种故障场景并自动尝试并行修复。
3.高扩展性
Ceph本身并没有主控节点,扩展起来比较容易,并且理论上,它的性能会随着磁盘数量的增加而线性增长。
4.特性丰富
Ceph支持对象存储、块存储和文件存储服务,故称为统一存储。
GFS是google的分布式文件存储系统,是专为存储海量搜索数据而设计的,2003年提出,是闭源的分布式文件系统。适用于大量的顺序读取和顺序追加,如大文件的读写。注重大文件的持续稳定带宽,而不是单次读写的延迟。
GFS 架构比较简单,一个 GFS 集群一般由一个 master 、多个 chunkserver 和多个 clients 组成。
在 GFS 中,所有文件被切分成若干个 chunk,每个 chunk 拥有唯一不变的标识(在 chunk 创建时,由 master 负责分配),所有 chunk 都实际存储在 chunkserver 的磁盘上。
为了容灾,每个 chunk 都会被复制到多个 chunkserve.
由上述可见,GFS在进行写数据时,有如下特点:
HDFS(Hadoop Distributed File System),是一个适合运行在通用硬件(commodity hardware)上的分布式文件系统,是Hadoop的核心子项目,是基于流数据模式访问和处理超大文件的需求而开发的。该系统仿效了谷歌文件系统(GFS),是GFS的一个简化和开源版本。
Swift 最初是由Rackspace公司开发的分布式对象存储服务, 2010 年贡献给 OpenStack 开源社区。作为其最初的核心子项目之一,为其 Nova 子项目提供虚机镜像存储服务。
Swift 采用完全对称、面向资源的分布式系统架构设计,所有组件都可扩展,避免因单点失效而影响整个系统的可用性。
Swift 组件包括:
Swift的数据模型采用层次结构,共设三层:Account/Container/Object(即账户/容器/对象),每层节点数均没有限制,可以任意扩展。数据模型如下:
Swift是基于一致性散列技术,通过计算将对象均匀分布到虚拟空间的虚拟节点上,在增加或删除节点时可大大减少需移动的数据量;
为便于高效的移位操作,虚拟空间大小通常采用 2 n;通过独特的数据结构 Ring(环),再将虚拟节点映射到实际的物理存储设备上,完成寻址过程。如下图所示:
散列空间4 个字节(32为),虚拟节点数最大为232,如将散列结果右移 m 位,可产生 2(32-m)个虚拟节点,(如上图中所示,当m=29 时,可产生 8 个虚拟节点)。
Swift为账户、容器和对象分别定义了的环。
环是为了将虚拟节点(分区)映射到一组物理存储设备上,并提供一定的冗余度而设计的,环的数据信息包括存储设备列表和设备信息、分区到设备的映射关系、计算分区号的位移(即上图中的m)。
账户、容器和对象的寻址过程。(以对象的寻址过程为例):
Swift 采用 Quorum 仲裁协议
Swift 默认配置是N=3,W=2,R=2,即每个对象会存在 3 个副本,至少需要更新 2 个副本才算写成功;如果读到的2个数据存在不一致,则通过检测和复制协议来完成数据同步。
如R=1,就可能会读到脏数据,此时,通过牺牲一定的一致性,可提高读取速度,(而一致性可以通过后台的方式完成同步,从而保证数据的最终一致性)
Quorum 协议示例如下所示:
Lustre是基于Linux平台的开源集群(并行)文件系统,最早在1999年由皮特•布拉姆创建的集群文件系统公司(Cluster File Systems Inc.)开始研发,后由HP、Intel、Cluster File System和美国能源部联合开发,2003年正式开源,主要用于HPC超算领域。
Lustre组件包括:
几种主流分布式存储技术的特点比较如下:
此外,根据分布式存储系统的设计理念,其软件和硬件解耦,分布式存储的许多功能,包括可靠性和性能增强都由软件提供,因此大家往往会认为底层硬件已不再重要。但事实往往并非如此,我们在进行分布式存储系统集成时,除考虑选用合适的分布式存储技术以外,还需考虑底层硬件的兼容性。一般而言,分布式存储系统的产品有三种形态:软硬件一体机、硬件OEM和软件+标准硬件,大家在选择时,需根据产品的成熟度、风险规避、运维要求等,结合自身的技术力量等,选择合适的产品形态。
主流分布式存储技术的对比分析与应用 - fanyqing - twt企业IT交流平台
一文看懂分布式存储架构,这篇分析值得收藏-51CTO.COM
分布式存储主流框架 - 知乎
架构设计:系统存储(1)——块存储方案(1)_说好不能打脸的博客-CSDN博客_存储方案
Longhorn 云原生分布式块存储解决方案设计架构和概念
Longhorn 云原生分布式块存储解决方案设计架构和概念 - 为少 - 博客园
Ceph的整体架构介绍,这篇文章带入Ceph的大门
Ceph介绍及原理架构分享 - 简书
分布式存储架构_百度百科
Ceph介绍(一):基本原理_Yannick_J的博客-CSDN博客_ceph
Openstack Swift 原理、架构与API介绍_HeyManLeader的博客-CSDN博客_swift架构
OpenStack Swift学习笔记_i_chips的博客-CSDN博客_openstack swift
OpenStack对象存储:Swift架构详解_西门仙忍的博客-CSDN博客_对象存储swift架构