OpenStack的存储服务

    OpenStack的存储服务被多个服务组件使用,很是的重要,而个人工做内容由Web转向底层IAAS建设,基本上都是一脸懵,因此作点笔记mark一下。mysql

    存储又被分红临时存储和持久存储两类。临时存储是指数据被虚拟机实例使用,一旦虚拟机实例被关机、重启或删除,该虚拟实例中的全部数据信息所有丢失。OpenStack项目中,部署完Nova计算服务组件以后,用户可使用nova boot 命令建立虚拟机实例,这时候虚拟机实例使用的就是临时存储,安全性没有任何保障。web

    持久存储包括对象存储、块存储和文件系统存储,无论虚拟机实例是否终止,它们的数据都是持续可用的,安全性比较高。sql

    a.块存储是和主机打交道的,就比如硬盘同样直接挂到主机上,通常用于主机的直接存储空间和数据库应用(如: mysql)的存储,分两种
  • DAS:Direct-Attached Storage(直连式存储)一台服务器一个存储,多机没法直接共享,须要借助操做系统的功能,如共享文件夹。
  • SAN:Storage Area Network(存储区域网络)高成本的存储方式,涉及到光纤和各种高端设备,有很高的可靠性和性能,就是设备贵、运维成本高。

    b.文件系统存储与较底层的块存储不一样,上升到了应用层,通常指的就是 NAS,一套网络储存设备,经过TCP/IP进行访问,协议为NFSv3/v4因为经过网络,且采用上层协议,所以开销大,延时确定比块存储高,通常用于多个云服务器共享数据,如服务器日志集中管理,办公文件共享。数据库

    c.对象存储跟本身开发的应用程序打交道(如网盘),具有块存储的高速以及文件存储的共享等特性,较为智能,有本身的CPU、内存、网络和磁盘,比块存储和文件存储更上层,云服务商通常提供用户文件上传下载读取的Rest API,方便应用集成此类服务。swift

他们的层级是愈来愈高的。

一、块存储服务(Cinder)介绍

    块存储又称为卷存储(Volume Storage),为用户提供基于数据块的存储设备访问,用户对数据块存储设备对访问和交互是经过将数据块存储设备映射到正在运行到虚拟机实例上进行到,能够对其进行读写、格式化等。后端

    块存储属于持久存储,当取消块存储设备与虚拟机实例之间当映射或将整个块存储从新映射给其余虚拟机实例的时候,该块存储上的数据都不受影响。块存储由OpenStack项目中的Cinder块存储服务组件提供,根据已经包含的存储驱动,其目前支持多种类型的后端存储。api

    OpenStack项目中的Cinder块存储服务组件为虚拟机实例提供了块存储设备,同时为管理存储设备提供了一整套方法,如卷快照、卷类型等。块存储类型是由驱动或者后端设备配置的驱动决定的,如NAS、NFS、SAN、ISCSI、Ceph。Cinder块存储服务组件的API和cinder-scheduler服务一般运行在控制节点上,cinder-volume服务能够运行在控制节点、计算节点或者独立的存储节点上。缓存

    Cinder块存储服务组件由如下服务进程组成安全

(1)cinder-api:接收API请求,并将请求转发到cinder-volume。服务器

(2)cinder-volume:与块存储直接进行交互通讯,处理一些任务(如由cinder-scheduler分配的),同时经过消息队列与这些任务交互通讯。还会维护块存储的状态,经过驱动与各类类型的存储进行交互通讯。

(3)cinder-scheduler daemon:选择最佳存储节点建立卷。(nova-scheduler具备类似功能)

(4)cinder-backup daemon:提供任意类型卷的备份。

(5)messaging queue:负责在各进程间传递消息。

许多存储驱动支持虚拟机实例直接访问底层存储,不用再通过层层转化致使性能的消耗,提高了总体的I/O性能。同时,Cinder块存储服务组件也支持使用文件做为块设备,如NFS、GlusterFS。在NFS和GlusterFS文件系统中,能够建立一个独立文件做为块设备映射给虚拟机实例使用。相似于在QEMU中建立虚拟机实例,这些虚拟机实例是一个个文件,保存在/var/lib/nova/instances目录中。

二、对象存储(Swift)服务介绍

    OpenStack项目中的Swift对象存储服务组件经过REST API提供对象数据存储和检索,它至少要和Keystone身份认证服务组件配合使用,部署Swift对象存储组件以前得肯定Keystone 已经就绪。Swift组件支持多租户,投入成本低,具备高扩展性和存储大量非结构化数据的特性。

    Swift对象存储服务组件包括下面几个部分:

  • Proxy servers(swift-proxy-server):代理服务器负责Swift架构的其他组件间的相互通讯,接收对象存储的API和HTTP请求,修改metadata、建立containers,对于每一个客户端的请求,它将在环中查询账号、容器或者对象的位置而且相应地转发请求。也可使用公共API向代理服务器发送请求。同时也在web图形界面上提供文件或者containers列表,还使用MemCached提供缓存功能,提升性能。
  • Account servers(swift-account-server):帐户服务器,管理对象存储内的帐户
  • Container servers(swift-container-server):容器服务器的首要工做是处理对象的列表,管理对象存储内containers和文件夹之间的映射。容器服务器并不知道对象存在哪,只知道指定容器里存的哪些对象。 这些对象信息以sqlite数据库文件的形式存储,和对象同样在集群上作相似的备份。容器服务器也作一些跟踪统计,好比对象的总数,容器的使用状况。
  • Object servers(swift-object-server):对象服务器管理真正的对象数据,是一个简单的二进制大对象存储服务器,能够用来存储、检索和删除本地设备上的对象。每一个对象使用对象名称的哈希值和操做时间戳组成的路径来进行存储。最后一次写操做必定会成功,同时最新一次的对象版本会被处理。删除也被视为文件的一个版本(一个以".ts"结尾的0字节文件,ts表示墓碑)。这保证了被删除的文件能被正确地复制,而且不会由于遭遇故障场景致使早些的版本神奇再现。
  • Various periodic processes:执行平常事务,其中的复制服务可以保证数据的连续性和有效性,还包括审核服务、更新服务和删除服务。
  • WSGI middleware:处理认证相关的问题,与keystone身份认证服务组件链接。
  • swift client:容许各类具备权限的用户在该客户端上提交命令,执行操做。
  • swift-init:初始化Ring 文件的脚本,须要守护进程名字做参数,并提供操做命令。
  • swift-recon:CLI工具,用于检索集群各类性能指标和状态信息。
  • swift-ring-builder:建立和重平衡Ring的工具。

    Swift对象存储依靠软件逻辑设计使数据均匀分布存储,通常状况下默认保存三份数据,三份数据保存位置对集群总体性能对影响很大,能够选择在同一服务器对不一样硬盘中,也能够分布在同一机架内的不一样服务器中。在Swift对象存储集群中,当出现存储数据当主机节点宕机时,整个集群的负载压力很大(某个副本出问题,瞬间会有几倍的数据须要传输、重平衡),生产上要尽量多地使用网卡聚合和固态磁盘等技术来提升总体性能。

    Swift对象存储特色:

  1. 全部数据存放和访问都有一个URL地址,经过URL能够直接访问数据。
  2. 全部的数据保存三份(默认)副本,分布在不一样的Zone区,随机存放在集群中的任意位置。
  3. 全部的数据都有本身的元数据metadata(存储文件所需的信息如:建立时间、时间更新、访问规则等)。
  4. 开发人员能够经过API与Swift对象存储进行交互操做。
  5. 集群添加存储节点不产生性能损耗,是横向扩展,而不是纵向叠加,也不须要停机添加存储节点。
  6. 数据不须要一次性迁移到新存储。
  7. 故障存储节点或硬件设备不须要停机更换
  8. Swift对象存储运行在标准的x86服务器上,如Dell、HP和Lenovo服务器。

    Proxy Server是Swift对象存储的公共接口,接收并处理全部传入的请求。接收到请求后根据对象数据到URL定位到相应的存储节点上,若是某个请求存储节点不可用,它将会查询可传送的服务器并转发请求,同时它还负责协助处理请求反馈、请求失败和标记时间戳等。Proxy Server采用共享无状态架构,可以根据业务负载压力扩展Proxy Server,最小等Proxy Server集群包含两个主机节点,当其中一个节点出现故障的时候,另外一个主机可以接管全部的业务请求。

    Ring是对象数据的名称与其在磁盘上具体位置之间的映射。Account、Container、Object都有相应的Ring,它们之间的组合会产生许多Rings。当swift的其它组件(好比复制)要对Account、Container或Object操做时,须要与相应的Ring进行交互操做来肯定其在磁盘上的集体位置。Ring使用区域Zone、磁盘设备、虚节点Partition和数据副原本维护这些映射信息。Ring中每一个Partition在集群中都(默认)有3个副本。每一个虚节点的位置由Ring来维护,并存储在映射中。当代理服务器转发的客户端请求失败时,Ring也负责决定由哪个设备来接手请求。Ring使用Zone对数据进行隔离,理想状态下每一个副本都存储在不一样的Zone中。在swift安装的时候,Ring的虚节点会均衡地划分到全部的设备中。当虚节点须要移动时(例如新设备被加入到集群),Ring会确保一次移动最少数量的虚节点数,而且一次只移动一个虚节点的一个副本。经过设置权重值能够平衡Partition虚节点的分布,控制数据流向,避免集群在压力负载大时各主机节点的压力负载不均衡。

    Zone主要功能是Swift对象隔离风险,当某一Zone内的数据丢失或被破坏时,不影响其余Zone内的数据副本,保持了数据总体上的完整性和可用性。Zone能够是一块磁盘、一台服务器、甚至是一个数据中心,其标志性做用是容许存储节点出现停机时间而数据仍然保持实时可用。

    AccountContainer都有本身独立的SQLite数据库,SQLite数据库采用分布式部署在Swift对象存储集群的多个存储节点上。每一个Account数据库中包含属于它的Container列表,一样,每一个Container数据库中也包含属于它的对象数据列表。

    Object对象服务器是一个简单的二进制大对象存储服务器,能够用来存储、检索和删除本地设备上的对象。在文件系统上,对象以二进制文件的形式存储,它的元数据存储在文件系统的扩展属性(xattrs)中。这要求用于对象服务器的文件系统须要支持文件有扩展属性。每一个对象使用对象名称的哈希值和操做的时间戳组成的路径来存储。最后一次写操做总能够成功,并确保最新一次的对象版本将会被处理。删除也被视为文件的一个版本(一个以".ts"结尾的0字节文件,ts表示墓碑)。这确保了被删除的文件被正确地复制而且不会由于遭遇故障场景致使早些的版本神奇再现。

    Partition表明需存储数据的一个集合,包含多个Account数据库、Container数据库和相应的对象数据。关于Partition的概念很简单,它就是存放在磁盘中的一个目录,有本身的哈希表,关联着属于该Partition的Account数据库、Container数据库和相应的对象数据。数据副本的复制和对象数据的上传下载都是基于Partition进行的。

    Replicator会持续检查每一个Partition,保证存放在Swift对象存储集群中三份数据副本的一致性,其中新数据的同步优先级较高。Replicator经过检查哈希表确认是否须要进行数据重同步。每一个Partition都有一张哈希表,包含一个含有哈希表的目录。在集群中某个存储节点宕机后,包含一样数据副本的存储节点会进行检查和发出通知,并将数据复制到其余存储节点上。

三、文件系统存储

    文件系统存储是一个远端的、能够被挂载的文件系统。它是共享的,经过挂载到虚拟机实例上,能够供多个租户使用。文件系统存储能够在同一时间被多个用户同时挂载和访问。能够进行一系列操做,好比:建立指定容量大小的文件和文件系统协议、建立的文件能够分布在一个或多个服务器、指定访问规则和安全协议、支持快照、经过快照恢复一个文件系统、查看使用率等。OpenStack项目中,文件系统存储的程序代号是manila,支持多种后端存储驱动,经过多种存储协议进行共享。

相关文章
相关标签/搜索