目前, 磁盘具有容量优点, 固态硬盘具有速度优点。 但可否让容量和性能不局限在一个存储器单元呢? 咱们很快联想到磁盘阵列技术(Redundant Array of Independent Disk, RAID, 不限于HDD) 。 磁盘阵列技术是一种把多块独立的硬盘按不一样的方式组合起来造成一个硬盘组(DiskGroup, 又称Virtual Disk) , 从而提供比单个硬盘更高的存储性能与数据备份能力的技术。 磁盘阵列技术既可提供多块硬盘读写的聚合能力, 又能提供硬盘故障的容错能力。镜像技(Mirroring) 又称为复制技术(Replication) , 可提供数据冗余性和高可用性; 条带(Striping) , 可提供并行的数据吞吐能力; 纠删码(Erasure Code) , 把数据切片并增长冗余编码而提供高可用性和高速读写能力。 镜像、 条带和纠删码是磁盘阵列技术经典的数据分发方式, 这3种经典的磁盘技术可经过组合方式提供更加丰富的数据读写性能。
传统的磁盘阵列技术的关注点在于数据在磁盘上的分发方式, 随着通用磁盘、 通用服务器, 以及高速网络的成本下降, 使数据在磁盘上的分发扩展到在服务器节点上的分发成为可能。 镜像技术、 条带技术和纠删码技术基于服务器节点的粒度实现后, 这些技术的特色再也不局限于单个设备的性能, 而是具有“横向扩展”能力。 咱们暂且认为这是分布式存储本质的体现。分布式存储解决了数据体量问题, 对应用程序提供标准统一的访问接入, 既能提高数据安全性和可靠性, 又能提升存储总体容量和性能。 能够预见, 分布式存储是大规模存储的一个实现方向。 分布式存储普遍地应用于航天、 航空、 石油、 科研、 政务、 医疗、 视频等高性能计算、 云计算和大数据处理领域。 目前行业应用对分布式存储技术需求旺盛, 其处于快速发展阶段
node
Ceph是一个开源的分布式存储系统。由于它还支持块存储、对象存储,因此很天然的被用作云计算框架openstack或cloudstack整个存储后端。固然也能够单独做为存储,例如部署一套集群做为对象存储、SAN存储、NAS存储等。国内外不少公司实践证实,ceph块存储和对象存储是完成可靠的。mysql
用于集群中全部数据与对象的存储。处理集群数据的复制、恢复、回填、再均衡。并向其余osd守护进程发送心跳,而后向Mon提供一些监控信息。
当Ceph存储集群设定数据有两个副本时(一共存两份),则至少须要两个OSD守护进程即两个OSD节点,集群才能达到active+clean状态。linux
为Ceph文件系统提供元数据计算、缓存与同步。在ceph中,元数据也是存储在osd节点中的,mds相似于元数据的代理缓存服务器。MDS进程并非必须的进程,只有须要使用CEPHFS时,才须要配置MDS节点。算法
监控整个集群的状态,维护集群的cluster MAP二进制表,保证集群数据的一致性。ClusterMAP描述了对象块存储的物理位置,以及一个将设备聚合到物理位置的桶列表。(官网要求集群中至少为三个且为奇数)sql
1. 架构总揽
数据库
1.1支持接口
后端
RADOS自己也是分布式存储系统,CEPH全部的存储功能都是基于RADOS实现。RADOS采用C++开发,所提供的原生Librados API包括C和C++两种。Ceph的上层应用调用本机上的librados API,再由后者经过socket与RADOS集群中的其余节点通讯并完成各类操做。首先看一下ceph存储过程:api
对象存储:即radosgw,兼容S3接口。经过rest api上传、下载文件。
文件系统:posix接口。能够将ceph集群看作一个共享文件系统挂载到本地。
块存储:即rbd。有kernel rbd和librbd两种使用方式。支持快照、克隆。至关于一块硬盘挂到本地,用法和用途和硬盘同样。缓存
不管使用哪一种存储方式(对象、块、挂载),存储的数据都会被切分红对象(Objects)。Objects size大小能够由管理员调整,一般为2M或4M。每一个对象都会有一个惟一的OID,由ino与ono生成,虽然这些名词看上去很复杂,其实至关简单。ino便是文件的File ID,用于在全局惟一标示每个文件,而ono则是分片的编号。好比:一个文件FileID为A,它被切成了两个对象,一个对象编号0,另外一个编号1,那么这两个文件的oid则为A0与A1。Oid的好处是能够惟一标示每一个不一样的对象,而且存储了对象与文件的从属关系。因为ceph的全部数据都虚拟成了整齐划一的对象,因此在读写时效率都会比较高。安全
可是对象并不会直接存储进OSD中,由于对象的size很小,在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址,速度都是很缓慢的;而且若是将对象直接经过某种固定映射的哈希算法映射到osd上,当这个osd损坏时,对象没法自动迁移至其余osd上面(由于映射函数不容许)。为了解决这些问题,ceph引入了归置组的概念,即PG。
PG是一个逻辑概念,咱们linux系统中能够直接看到对象,可是没法直接看到PG。它在数据寻址时相似于数据库中的索引:每一个对象都会固定映射进一个PG中,因此当咱们要寻找一个对象时,只须要先找到对象所属的PG,而后遍历这个PG就能够了,无需遍历全部对象。并且在数据迁移时,也是以PG做为基本单位进行迁移,ceph不会直接操做对象。
对象时如何映射进PG的?还记得OID么?首先使用静态hash函数对OID作hash取出特征码,用特征码与PG的数量去模,获得的序号则是PGID。因为这种设计方式,PG的数量多寡直接决定了数据分布的均匀性,因此合理设置的PG数量能够很好的提高CEPH集群的性能并使数据均匀分布。
最后PG会根据管理员设置的副本数量进行复制,而后经过crush算法存储到不一样的OSD节点上(实际上是把PG中的全部对象存储到节点上),第一个osd节点即为主节点,其他均为从节点。
1.2 优势
分布式文件系统不少,ceph相比其余的优势:
1.2.1 统一存储
虽然ceph底层是一个分布式文件系统,但因为在上层开发了支持对象和块的接口。因此在开源存储软件中,可以一统江湖。至于能不能千秋万代,就不知了。
1.2.2 高扩展性
说人话就是扩容方便、容量大。可以管理上千台服务器、EB级的容量。
1.2.3 可靠性强
支持多份强一致性副本,EC。副本可以垮主机、机架、机房、数据中心存放。因此安全可靠。存储节点能够自管理、自动修复。无单点故障,容错性强。
1.2.4 高性能
由于是多个副本,所以在读写操做时候可以作到高度并行化。理论上,节点越多,整个集群的IOPS和吞吐量越高。另一点ceph客户端读写数据直接与存储设备(osd) 交互。在块存储和对象存储中无需元数据服务器。
注:上面的都是ceph呈现的设计理念优点,因为ceph各个版本都存在bug,具体应用得通过大规模测试验证。推荐版本:0.67.0、0.80.七、0、94.2
1.3 Rados集群
Rados集群是ceph的存储核心。下面先简单介绍各个组件的做用。后续会讲解各个组件之间如何协做。
如图,rados集群中分为如下角色:mdss、osds、mons. Osd 对象存储设备,能够理解为一块硬盘+osd 管理进程,负责接受客户端的读写、osd间数据检验(srub)、数据恢复(recovery)、心跳检测等。Mons 主要解决分布式系统的状态一致性问题,维护集群内节点关系图(mon-map osd-map mds-map pg-map)的一致性,包括osd的添加、删除的状态更新。Mds元数据服务器,在文件存储时是必须配置。须要注意的是,mds服务器并不存放数据,仅仅只是管理元数据的进程。Ceph文件系统的inode等元数据真正存在rados集群(默认在metadata pool)。如下信息,呈现的是ceph集群中状态信息。
# ceph -s
cluster 72d3c6b5-ea26-4af5-9a6f-7811befc6522
health HEALTH_WARN
clock skew detected on mon.mon1, mon.mon3
monmap e3: 3 mons at {mon1=10.25.25.236:6789/0,mon2=10.25.25.235:6789/0,mon3=10.25.25.238:6789/0}
election epoch 16, quorum 0,1,2 mon2,mon1,mon3
osdmap e330: 44 osds: 44 up, 44 in
pgmap v124351: 1024 pgs, 1 pools, 2432 GB data, 611 kobjects
6543 GB used, 153 TB / 160 TB avail
1024 active+clean
2. 什么是对象存储
个人理解从几方面来阐述:
一是:从存储数据类型来说,指非结构化数据,如图片、音视频、文档等。
二是:从应用场景来讲,即一次写人屡次读取。
三是:从使用方式,与文件posix不一样,对象存储通常使用bucket(桶)概念,给你一个桶,你变能够向桶里存储数据(经过对象id)。
3. 什么是块存储
块存储的典型设备是磁盘或磁盘阵列。以块形式的方式存取数据的。单盘的iops和吞吐很低,因此天然想到用raid来并行的读写。Ceph的块存储固然也是解决此类问题,不过利用分布式提供更高的性能,可靠和扩展性。只不过ceph是一种网络块设备,如同SAN。下图就是ceph 将分布在不一样主机磁盘“虚拟”后,提供给VM作磁盘。
4. Ceph 组件交互
乱扯淡:其实在IT领域,一直是分分合合的状态。分久必合,合久必分。例如,单台计算机由cpu,内存,输入输出设备,总线等组件协同工做。当单机计算,存储能力不足时候,就开始分化成分布式架构。网络就至关于总线,网络设备就是路由中心、数据中转站,对外提供更强计算、存储能力的计算机。物理(逻辑)分开的主机协同工做,则须要主要解决下列的问题:
连:如何将独立的单元连起来。
找:连起来的目的固然不是为了繁殖,而是通讯。首先得找到它。
发:找到主机后,得发数据交互才能产生价值,繁衍数据吧。
接下来看ceph如何解决这些问题的。
4.1 rados -连连看
前面介绍了rados集群中各个角色的分工。经过一张逻辑部署图将各个组件联系起来。
4.2 crush-我要找到你
Client 读写数据,则须要找到数据应该存放的节点位置。通常作法将这种映射关系记录(hdfs)或者靠算法计算(一致性hash)。Ceph采用的是更聪明的crush算法,解决文件到osd的映射。先看看ceph中管理数据(对象)的关系。首先ceph中的对象被池(pool)化,pool中有若干个pg,pg是管理一堆对象的逻辑单位。一个pg分布在不一样的osd上。如图client端的文件会被拆分个object,这些对象以pg的单位分布。
Crush算法的输入为(pool obj),即ceph的命名空间
计算pg号,经过obj mod 当前pool中的pg总数
Crush(pg,crushmap) 计算出多个osd。crush算法是一个多输入的伪随机算法, Crushmap主要是整个集群osd的层次结果、权重信息、副本策略信息。
后面我会介绍crush算法内部实现细节。
4.3 ceph rw-数据交互
Rados集群中节点相互的通讯。主要包括下面几个方面:
客户端读写
主要接收客户端上传、下载、更新、删除操做。为了保持数据强一致性,写操做必须几个副本写成功后才算一次写操做完成。(客户端只会向primary写)
集群内部读写
包括osd间数据同步,数据校验、心跳检查。Mon与osd间心跳检查,mon间状态同步等。
Journal的做用相似于mysql innodb引擎中的事物日志系统。当有突发的大量写入操做时,ceph能够先把一些零散的,随机的IO请求保存到缓存中进行合并,而后再统一贯内核发起IO请求。这样作效率会比较高,可是一旦osd节点崩溃,缓存中的数据就会丢失,因此数据在还未写进硬盘中时,都会记录到journal中,当osd崩溃后从新启动时,会自动尝试从journal恢复因崩溃丢失的缓存数据。所以journal的io是很是密集的,并且因为一个数据要io两次,很大程度上也损耗了硬件的io性能,因此一般在生产环境中,使用ssd来单独存储journal文件以提升ceph读写性能。