目录
一、存储知识
1.存储技术
DAS(Direct Attached Storage):将存储设备通过SCSI线缆或FC(FiberChannel)直接连接到服务器上。如同PC机的结构,是把外部的数据存储设备都直接挂在服务器内部的总线上,数据存储设备是服务器结构一部分,但由于这种存储技术是把设备直接挂在服务器上,随着需求的不断增大,越来越多的设备添加到网络环境中,导致服务器和存储独立数量较多,资源利用率低下,使得数据共享受到严重的限制。因此适用在一些小型网络应用中。DAS方案中外接式存储设备目前主要是指RAID、JBOD等。
DAS存储更多的依赖服务器主机操作系统进行数据的IO读写和存储维护管理,数据备份和恢复要求占用服务器主机资源(包括CPU、系统IO等),数据流需要回流主机再到服务器连接着的磁带机(库),数据备份通常占用服务器主机资源20-30%,因此许多企业用户的日常数据备份常常在深夜或业务系统不繁忙时进行,以免影响正常业务系统的运行。直连式存储的数据量越大,备份和恢复的时间就越长,对服务器硬件的依赖性和影响就越大。
NAS(Network Attached Storage):按照TCP/IP协议进行通信,以文件的I/O方式进行数据传输。它拥有自己的文件系统,通过网络文件系统NFS或通用文件系统CIFS(common Internet file system)对外提供文件访问服务。NAS是在网络中放置一个单独的存储服务器,此存储服务器开启网络共享。
NAS是文件级的存储方法,它的重点在于帮助工作组和部门级机构解决迅速增加存储容量的需求。如今用户采用NAS较多的功能是用来文档共享、图片共享、电影共享等等,而且随着云计算的发展,一些NAS厂商也推出了云存储功能,大大方便了企业和个人用户的使用。
NAS产品是真正即插即用的产品。NAS设备一般支持多计算机平台,用户通过网络支持协议可进入相同的文档,因而NAS设备无需改造即可用于混合Unix/Windows NT局域网内,同时NAS的应用非常灵活。但NAS又一个关键性问题,即备份过程中的带宽消耗。与将备份数据流从LAN中转移出去的存储区域网(SAN)不同,NAS仍使用网络进行备份和恢复。NAS 的一个缺点是它将存储事务由并行SCSI连接转移到了网络上。这就是说LAN除了必须处理正常的最终用户传输流外,还必须处理包括备份操作的存储磁盘请求。
文件存储设备通过以太网与服务器连接。服务器通过NFS、CIFS、HTTP、FTP等协议进行数据访问。数据通过以太网传输,有打包/解包的过程。
SAN(Storage Area Network):存储区域网络,从名字上我们也可以看出,这个是通过光纤通道交换机连接存储阵列和服务器主机,最后成为一个专用的存储网络。SAN经过十多年历史的发展,已经相当成熟,成为业界的事实标准(但各个厂商的光纤交换技术不完全相同,其服务器和SAN存储有兼容性的要求)。
SAN提供了一种与现有LAN连接的简易方法,并且通过同一物理通道支持广泛使用的SCSI和IP协议。SAN不受现今主流的、基于SCSI存储结构的布局限制。特别重要的是,随着存储容量的爆炸性增长,SAN允许企业独立地增加它们的存储容量。SAN的结构允许任何服务器连接到任何存储阵列,这样不管数据置放在那里,服务器都可直接存取所需的数据。因为采用了光纤接口,SAN还具有更高的带宽。
因为SAN解决方案是从基本功能剥离出存储功能,所以运行备份操作就无需考虑它们对网络总体性能的影响。SAN方案也使得管理及集中控制实现简化,特别是对于全部存储设备都集群在一起的时候。最后一点,光纤接口提供了10公里的连接长度,这使得实现物理上分离的、不在机房的存储变得非常容易。
总结:最后概括一下就是,DAS存储一般应用在中小企业,与计算机采用直连方式,NAS存储则通过以太网添加到计算机上,SAN存储则使用FC接口,提供性能更加的存储。NAS与NAS的主要区别体现在操作系统在什么位置,如下图所示。
2.存储方式
SATA(Serial Advanced Technology Attachment)硬盘一般使用IDE接口,分为PATA硬盘(即Parallel ATA,并行ATA硬盘接口规范)和SATA硬盘(即Serial ATA,串行ATA硬盘接口规范)。
SATA其实是SCSI(Small Computer System Interface小型计算机系统接口的缩写)体系里抽取出的一部分,也就是说SCSI能兼容SATA,但SATA反过来就不行。SCSI本质上还是为服务器准备的磁盘系统,它非常强调所有的控制可以由SCSI体系自己完成,不需要CPU控制,所以SCSI非常省资源,而SATA需要CPU介入控制传输过程
SCSI和iSCSI二者不是一个层面的概念。
SCSI技术是一种接口,小型计算机系统接口。服务器上用的。
iSCSI技术是新储存技术,供硬件设备使用的可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料。
SAS是新一代的SCSI技术,和SATA硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口。兼容SATA。
RAID(redundantarray of independent disks,独立磁盘冗余数组),不同的RAID等级在增加数据可靠性以及增加存储器(群)读写性能间取得平衡。
RAID 0:将数据按磁盘的个数来进行分段。速度最快,没有冗余,如果一个磁盘(物理)损坏,则所有的数据都会丢失。
RAID 1:两组以上的N个磁盘相互作备份,在一些多线程操作系统中能有很好的读取速度,但写入的速度有微小的降低。可靠性最高。
RAID 2:是RAID 0 的改良版,以汉明码的方式将数据进行编码后分区为独立的比特,写入硬盘。因为在数据中加入了错误修正码(ECC,Error Correction Code),所以数据整体的容量会比原始数据大一些,RAID 2至少要三台磁盘驱动器方能运作。
RAID 3,4,5,6等等。
RAID 组合等级
1.RAID00
简单地说, RAID00 是由多个成员 RAID0 组成的高级 RAID0 。它与 RAID0 的区别在于, RAID0 阵列替换了原先的成员磁盘。可以把 RAID00 理解为两层条带化结构的磁盘阵列,即对条带再进行条带化。这种阵列可以提供更大的存储容量、更高的 I/O 性能和更好的 I/O 负均衡。
2. RAID01 和 RAID10
一些文献把这两种 RAID 等级看作是等同的,本文认为是不同的。 RAID01 是先做条带化再作镜像,本质是对物理磁盘实现镜像;而 RAID10 是先做镜像再作条带化,是对虚拟磁盘实现镜像。相同的配置下,通常 RAID01 比 RAID10 具有更好的容错能力。
RAID01 兼备了 RAID0 和 RAID1 的优点,它先用两块磁盘建立镜像,然后再在镜像内部做条带化。 RAID01 的数据将同时写入到两个磁盘阵列中,如果其中一个阵列损坏,仍可继续工作,保证数据安全性的同时又提高了性能。 RAID01 和 RAID10 内部都含有 RAID1 模式,因此整体磁盘利用率均仅为 50% 。
LVM(logic volumemanagement)逻辑卷管理
LVM是建立在磁盘分区和文件系统之间的一个逻辑层,来为文件系统屏蔽下层磁盘文件分区布局,提供一个逻辑的盘卷,再在盘卷上来建立文件系统。
物理卷(physical volume,PV),指硬盘分区,也可以是整个硬盘或已创建的软RAID,是LVM的基本存储设备,与普通物理存储介质的区别是该设备包含有LVM相关的管理参数。
卷组(volume group,VG),卷组是由一个或多个物理卷所组成的存储池,在卷组上能创建一个或多个“LVM分区”(逻辑卷)。
逻辑卷(logical volume,LV),LVM的逻辑卷类似于非LVM系统中的硬盘分区,它建立在卷组智商,是一个标准的块设备,在逻辑卷上可以建立文件系统。
物理块(physical extent,PE),物理卷以大小相等的物理块为存储的基本单位,同时也是LVM寻址的最小单元。
逻辑块(logical extent,LE),逻辑卷以大小相等的逻辑块为存储的基本单位,在同一个卷组中,LE的大小和PE是相等的,并且一一对应。
卷组描述区域(VolumeGroupDescription Area,VGDA),和磁盘将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷的VGDA中。VGDA包括以下内容:PV描述符、VG描述符、LV描述符、和一些PE描述符。系统启动LVM时激活VG,并将VGDA加载至内存,来识别LV的实际物理存储位置。当系统进行I/O操作室,就会根据VGDA建立的应设计值来访问实际的物理位置。
对象存储:基于文件系统,通过文件系统来存储访问数据。
块存储:是以块为基本单元的存储方式,其传输不存在数据打包/解包的过程,可提供更高的传输性能
理解 Block Storage
操作系统获得存储空间的方式一般有两种:
-
通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区、格式化、创建文件系统;或者直接使用裸硬盘存储数据(数据库)。这种裸硬盘的方式叫做 Block Storage(块存储),每个裸硬盘通常也称作 Volume(卷)
-
通过 NFS、CIFS 等协议,mount 远程的文件系统,这种叫做文件系统存储。NAS 和 NFS 服务器,以及各种分布式文件系统提供的都是这种存储。
了解对象和容器。
对象就是主要存储实体。对象中包括与 OpenStack Object Storage 系统中存储的文件相关的内容和所有可选元数据。数据保存为未压缩、未加密的格式,包含对象名称、对象的容器以及键值对形式的所有元数据。对象分布在整个数据中心的多个磁盘中,Swift 可以借此确保数据的复制和完整性。分布式操作可以利用低成本的商用硬件,同时增强可扩展性、冗余性和持久性。
容器类似于 Windows® 文件夹,容器是用于存储一组文件的一个存储室。容器无法被嵌套,但一个租户可以供创建无限数量的容器。对象必须存储在容器中,所以您必须至少拥有一个容器来使用对象存储。
二、Cinder介绍
Cinder(Block Storage service)提供对volume从创建到删除整个生命周期的管理,从instance的角度看,挂载的每一个volume都是一块硬盘。OpenStack早起版本使用nova-volume为云平台虚拟机提供持久性块存储。从F版本后,就把最为Nova组成部分的nova-volume分离了出来,形成了独立的Cinder组件。
1.Cinder核心组件
- cinder-api
cinder-api对外提供REST API、响应请求,并将请求放入RabbitMQ/Qpid队列,调用cinder-volume,是整个cinder组件的门户。 具体来说cinder-api的任务就是:
- 检查客户端传入的参数是否有效
- 调用cinder其他子组件处理客户端请求
- 将其他子组件处理的结果返回客户端
cinder-api列表
- cinder-volume
cinder-volume运行在存储节点上,负责管理具体存储设备的存储空间。每个存储节点都会运行cinder-volume服务,多个存储节点便组成了一个存储资源池。通过OpenStack平台对volume的指令最后都会由cinder-volume完成。但是cinder-volume自身并不是真正的存储设备,真正的存储设备是volume provider,cinder-volume与volume provider一起实现了对volume全生命周期的管理。
但是cinder在这里遇见了和neutron同样的问题,市面上有这么多volume provider,是将cinder-volume设计成与volume provider一一对应的形式吗,但这样就要设计很多代码相似度很高的cinder-volume。在这个问题上,cinder也运用了和neutron同样的思路。
通过驱动架构,cinder-volume为volume provider定义了统一的接口,对于volume provider来说,只要实现这些接口就可以以驱动的形式像插件一样插入OpenStack系统中。
- cinder-scheduler
当用户向cinder-api发出请求创建一个volume时,如果用户已经指定存储节点,则cinder-api会直接调用cinder-volume去创建volume;当用户没有指定节点时,cinder-api会将请求发送给cinder-scheduler,然后cinder-scheduler会根据调度算法选择最合适的存储节点创建volume。
- volume provider
volume provider是数据存储设备,为volume提供物理存储空间。cinder-volume支持多种volume provider,每种volume provider通过自己的驱动与cinder-volume协同工作。
- cinder DB
与OpenStack的其他服务一样,cinder在部署前也需要在数据库中创建一个名为cinder的database。
2.Cinder设计思想
前面说到cinder的前身是nova中的nova-volume组件,后来才被单独提出来成为一个OpenStack组件,因此cinder的设计架构和nova十分相像,具体体现在它们各个子组件的功能基本都能对应。
前台 | nova-api | cinder-api |
经理 | nova-scheduler | cinder-scheduler |
外勤 | nova-compute | cinder-volume |
细心的童鞋可能注意到了,nova架构中还有一个nova-conductor充当nova-compute连接数据库的中间件,而cinder却没有,这是为什么呢?
其实nova-compute之所以不能直接连接数据库,是因为它与租户的实例连接紧密,如果它可以连接数据库,那么租户也可以通过nova-compute组件来连接数据库,这样就造成了安全隐患。但对于cinder-volume来说,它部署在存储节点,与租户并无直接联系,也就不用担心租户会通过它连接数据库,因此,cinder并无与nova-conductor类似的组件。
三、Swift介绍
Swift 最初是由 Rackspace 公司开发的高可用分布式对象存储服务,并于 2010 年贡献给 OpenStack 开源社区作为其最初的核心子项目之一,为其 Nova 子项目提供虚机镜像存储服务。
Swift并不是文件系统或者实时的数据存储系统,它是对象存储,用于永久类型的静态数据的长期存储,这些数据可以检索、调整,必要时进行更新。最适合存储的数据类型的例子是虚拟机镜像、图片存储、邮件存储和存档备份。
Swift无需采用 RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题,比如华为云盘等等。
此项目是基于 Python 开发的,采用 Apache 2.0 许可协议,可用来开发商用系统。
1.Swift工作组件
Swift采用完全对称、面向资源的分布式系统架构设计,所有组件都可扩展,避免因单点失效而扩散并影响整个系统运转;通信方式采用非阻塞式 I/O 模式,提高了系统吞吐和响应能力。
Swift组件包括:
- 代理服务(ProxyServer):
Swift通过Proxy Server向外提供基于HTTP的REST服务接口,会根据环的信息来查找服务地址并转发用户请求至相应的账户、容器或者对象,进行CRUD(增删改查)等操作。由于采用无状态的REST请求协议,可以进行横向扩展来均衡负载。在访问Swift服务之前,需要先通过认证服务获取访问令牌,然后在发送的请求中加入头部信息 X-Auth-Token。代理服务器负责Swift架构的其余组件间的相互通信。代理服务器也处理大量的失败请求。例如,如果对于某个对象PUT请求时,某个存储节点不可用,它将会查询环可传送的服务器并转发请求。对象以流的形式到达(来自) 对象服务器,它们直接从代理服务器传送到(来自)用户—代理服务器并不缓冲它们。
- 认证服务(AuthenticationServer)
验证访问用户的身份信息,并获得一个对象访问令牌(Token),在一定的时间内会一直有效;验证访问令牌的有效性并缓存下来直至过期时间。
- 缓存服务(CacheServer)
缓存的内容包括对象服务令牌,账户和容器的存在信息,但不会缓存对象本身的数据;缓存服务可采用Memcached集群,Swift会使用一致性哈希算法来分配缓存地址。
- 账户服务(AccountServer)
提供账户元数据和统计信息,并维护所含容器列表的服务,每个账户的信息被存储在一个SQLite数据库中。
- 容器服务(ContainerServer):
提供容器元数据和统计信息(比如对象的总数,容器的使用情况等),并维护所含对象列表的服务。容器服务并不知道对象存在哪,只知道指定容器里存的哪些对象。 这些对象信息以SQLite数据库文件的形式存储,和对象一样在集群上做类似的备份。
- 对象服务(ObjectServer)
提供对象元数据和内容服务,可以用来存储、检索和删除本地设备上的对象。在文件系统中,对象以二进制文件的形式存储,它的元数据存储在文件系统的扩展属性(xattr)中,建议采用默认支持扩展属性(xattr)的XFS文件系统。每个对象使用对象名称的哈希值和操作的时间戳组成的路径来存储。最后一次写操作总可以成功,并确保最新一次的对象版本将会被处理。删除也被视为文件的一个版本(一个以".ts"结尾的0字节文件,ts表示墓碑)。
- 复制服务(Replicator)
会检测本地分区副本和远程副本是否一致,具体是通过对比哈希文件和高级水印来完成,发现不一致时会采用推式(Push)更新远程副本:对于对象的复制,更新只是使用rsync同步文件到对等节点。帐号和容器的复制通过HTTP或rsync来推送整个数据库文件上丢失的记录;另外一个任务是确保被标记删除的对象从文件系统中移除:当有一项(对象、容器、或者帐号)被删除,则一个墓碑文件被设置作为该项的最新版本。复制器将会检测到该墓碑文件并确保将它从整个系统中移除。
更新服务(Updater):当对象由于高负载或者系统故障等原因而无法立即更新时,任务将会被序列化到在本地文件系统中进行排队,以便服务恢复后进行异步更新;例如成功创建对象后容器服务器没有及时更新对象列表,这个时候容器的更新操作就会进入排队中,更新服务会在系统恢复正常后扫描队列并进行相应的更新处理。
- 审计服务(Auditor)
在本地服务器上会反复地爬取来检查对象,容器和账户的完整性,如果发现比特级的错误,文件将被隔离,并复制其他的副本以覆盖本地损坏的副本;其他类型的错误(比如在任何一个容器服务器中都找不到所需的对象列表)会被记录到日志中。
- 账户清理服务(AccountReaper)
移除被标记为删除的账户,删除其所包含的所有容器和对象。删除账号的过程是相当直接的。对于每个账号中的容器,每个对象先被删除然后容器被删除。任何失败的删除请求将不会阻止整个过程,但是将会导致整个过程最终失败(例如,如果一个对象的删除超时,容器将不能被删除,因此账号也不能被删除)。整个处理过程即使遭遇失败也继续执行,这样它不会因为一个麻烦的问题而中止恢复集群空间。账号收割器将会继续不断地尝试删除账号直到它最终变为空,此时数据库在db_replicator中回收处理,最终移除这个数据库文件。
2. Swift数据模型
Swift采用层次数据模型,共设三层逻辑结构:Account/Container/Object(账户/容器/对象)。每层节点数均没有限制,可以任意扩展。这里的账户和个人账户不是一个概念,可理解为租户,用来做顶层的隔离机制,可以被多个个人账户所共同使用;容器类似文件夹,代表封装一组对象;对象由元数据和数据两部分组成。
Account:不是传统意义上的用户,而是用户定义的管理存储区域
Container:容器,存储的隔间,类似于子文件夹或者是目录
Obeject:对象,包含了我们上传的每一个基本的存储实体和它自身的元数据
Ring:环,记录了磁盘上存储的实体名称和物理位置的映射关系,有Account环,Container环和Obeject环
术语间的关系
3.Swift功能
Swift组件在物理结构上往往会保存存储对象的多个副本,通常按照物理位置的特征,将对象拷贝到不同对象的物理位置上,来保证数据地理位置上的一个可靠性。
常用概念:
- Region:地域,地理位置上的一个概念,往往代表着不同城市的地理位置,从灾备方面考虑的概念
- Zone:可用区,强调的是物理的网络,供电,空调等基础设施的隔离,不同的可用区可能是同一个城市的不同数据中心机房,也可能是同一个数据中心,不同的供电、供水、网络、接入等等一些隔离的系统
- Node:结点,代表着一台存储服务器
- Disk:磁盘,代表着物理的存储设备
- Cluster:指的是群集,是为冗余考虑而设计的架构
常用概念间的关系
4.Swift组件的工作架构
首先用户提出了一个对象存储资源的申请,由Swift的API接收和处理,申请收到以后先去找Keystone认证结点,对于用户的身份进行认证,
认证通过后将请求提交给名称为Swift Proxy的组件,
Swift Proxy是Swift的代理,由它来确定,究竟应该将存储对象放在哪一个满足存储要求的存储节点上,最终将对象存储到指定的存储结点,最终将结果返回给用户
四、总结
Swift和Cinder的形象化比喻
个人认为 Cinder可以理解为个人电脑的移动硬盘,它可以随意格式化,随时存取。
对于 Swift是一个系统,可以作为网盘上传和下载,相信对于云技术的同学来说,网盘应该是不陌生的,如果把一些经常用的内容,放到网盘中是非常不方便的。Swift里面一般存储的是不经常修改的内容。
Swift 还是 Cinder?何时使用以及使用哪一种?
答案取决于您的应用程序。如果需要运行商用或遗留应用程序,那么很少需要进行这种选择。这些应用程序不可能被编码来利用 Swift API,但您可以轻松挂载一个 Cinder 磁盘,它表现得就像是直接将存储附加到大多数应用程序。当然,您还可以对新应用程序使用 Cinder,但是不会从 Swift 自动附带的弹性和冗余中获益。如果编程人员面对这样的挑战,那么 Swift 的分布式可扩展架构是一个值得考虑的特性。