OpenStack的存储服务被多个服务组件使用,很是的重要,而个人工做内容由Web转向底层IAAS建设,基本上都是一脸懵,因此作点笔记mark一下。mysql
存储又被分红临时存储和持久存储两类。临时存储是指数据被虚拟机实例使用,一旦虚拟机实例被关机、重启或删除,该虚拟实例中的全部数据信息所有丢失。OpenStack项目中,部署完Nova计算服务组件以后,用户可使用nova boot 命令建立虚拟机实例,这时候虚拟机实例使用的就是临时存储,安全性没有任何保障。web
持久存储包括对象存储、块存储和文件系统存储,无论虚拟机实例是否终止,它们的数据都是持续可用的,安全性比较高。sql
b.文件系统存储与较底层的块存储不一样,上升到了应用层,通常指的就是 NAS,一套网络储存设备,经过TCP/IP进行访问,协议为NFSv3/v4因为经过网络,且采用上层协议,所以开销大,延时确定比块存储高,通常用于多个云服务器共享数据,如服务器日志集中管理,办公文件共享。数据库
c.对象存储跟本身开发的应用程序打交道(如网盘),具有块存储的高速以及文件存储的共享等特性,较为智能,有本身的CPU、内存、网络和磁盘,比块存储和文件存储更上层,云服务商通常提供用户文件上传下载读取的Rest API,方便应用集成此类服务。swift
他们的层级是愈来愈高的。块存储又称为卷存储(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目录中。
OpenStack项目中的Swift对象存储服务组件经过REST API提供对象数据存储和检索,它至少要和Keystone身份认证服务组件配合使用,部署Swift对象存储组件以前得肯定Keystone 已经就绪。Swift组件支持多租户,投入成本低,具备高扩展性和存储大量非结构化数据的特性。
Swift对象存储服务组件包括下面几个部分:
Swift对象存储依靠软件逻辑设计使数据均匀分布存储,通常状况下默认保存三份数据,三份数据保存位置对集群总体性能对影响很大,能够选择在同一服务器对不一样硬盘中,也能够分布在同一机架内的不一样服务器中。在Swift对象存储集群中,当出现存储数据当主机节点宕机时,整个集群的负载压力很大(某个副本出问题,瞬间会有几倍的数据须要传输、重平衡),生产上要尽量多地使用网卡聚合和固态磁盘等技术来提升总体性能。
Swift对象存储特色:
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能够是一块磁盘、一台服务器、甚至是一个数据中心,其标志性做用是容许存储节点出现停机时间而数据仍然保持实时可用。
Account和Container都有本身独立的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,支持多种后端存储驱动,经过多种存储协议进行共享。