0 ceph 理论简介 入门

wKiom1YuKmrjhZ5RAABP9blVf08875.jpg

Ceph Documentation 




1. 介绍                         

云硬盘是IaaS云平台的重要组成部分,云硬盘给虚拟机提供了持久的块存储设备。目前的AWS 的EBS(Elastic Block store)给Amazon的EC2实例提供了高可用高可靠的块级存储卷,EBS适合于一些需要访问块设备的应用,比如数据库、文件系统等。 在OpenStack中,可以使用Ceph、Sheepdog、GlusterFS作为云硬盘的开源解决方案,下面我们来了解Ceph的架构。


Ceph是统一存储系统,支持三种接口。


Object:有原生的API,而且也兼容Swift和S3的API

Block:支持精简配置、快照、克隆

File:Posix接口,支持快照

Ceph也是分布式存储系统,它的特点是:


高扩展性:使用普通x86服务器,支持10~1000台服务器,支持TB到PB级的扩展。

高可靠性:没有单点故障,多数据副本,自动管理,自动修复。

高性能:数据分布均衡,并行化度高。对于objects storage和block storage,不需要元数据服务器。

wKiom1YuJibwG5urAAQ-iAS03VI684.jpg






Ceph and the future of storage

wKioL1YrQ4fjorH-AAPgrzq_eQc225.jpg






CEPH存储架构                   

wKiom1YrQ4DQQOOeAAFVoJqXC-E308.jpg

wKiom1YuJzLRlewfAAF55-7Qij4726.jpg







ceph 推荐网络 拓扑              


 Ceph 使用以太网连接内部各存储节点以及连接 client 和集群。Ceph 推荐使用两个网络:

前端(北向)网络( a public (front-side) network)连接客户端和集群

后端/东西向网络 (a cluster (back-side) network)来连接 Ceph 各存储节点

这么做,主要是从性能(OSD 节点之间会有大量的数据拷贝操作)和安全性(两网分离)考虑。

可以在 Ceph 配置文件的 [global] 部分配置两个网络:

public network = {public-network/netmask}
cluster network = {cluster-network/netmask}



wKioL1YuIEzjEPZuAAE4xNO8TjY312.jpg

文章参考:

JohnKim_CephWithHighPerformanceNetworks_V2.pdf

WP_Deploying_Ceph_over_High_Performance_Networks.pdf







(Placement Group)PG                       

PG 映射一个 Pool 到它使用的若干个 OSD。如果一个拷贝型 Pool 的size(拷贝份数)为 2,它会包含指定数目的 PG,每个 PG 使用两个 OSD,其中,第一个为主 OSD (primary),其它的为从 OSD (secondary)。不同的 PG 可能会共享一个 OSD,类似于下图:

wKioL1YuISewTb3AAAFlAvMHOIs359.jpg

以PG作为复制和负载均衡的基本单位,有两个好处,一是有效减小复制的管理难度,二是对错误进行一定程度隔离(一个OSD故障影响到有限个其他OSD)。 当然,为了保证数据可靠性, 必须控制PG大小,提搞恢复并行度, 保证集群内部有充足的资源参与恢复。


那如何确定一个 Pool 中有多少 PG?Ceph 不会自己计算,而是给出了一些参考原则,让 Ceph 用户自己计算。

少于 5 个 OSD, 建议设为  128

5 到 10 个 OSD,建议设为 512

10 到 50 个 OSD,建议设为 4096

50 个 OSD 以上,就需要有更多的权衡来确定 PG 数目

pg计算






(object - PG --- OSD(s) 映射关系)                        

Ceph的命名空间是 (Pool, Object),每个Object都会映射到一组OSD中(由这组OSD保存这个Object):

(Pool, Object) → (Pool, PG) → OSD set → Disk

Ceph中Pools的属性有:

Object的副本数

Placement Groups的数量

所使用的CRUSH Ruleset

在Ceph中,Object先映射到PG(Placement Group),再由PG映射到OSD set。每个Pool有多个PG,每个Object通过计算hash值并取模得到它所对应的PG。PG再映射到一组OSD(OSD的个数由Pool 的副本数决定),第一个OSD是Primary,剩下的都是Replicas。


数据映射(Data Placement)的方式决定了存储系统的性能和扩展性。(Pool, PG) → OSD set 的映射由四个因素决定:


CRUSH算法:一种伪随机算法。

OSD MAP:包含当前所有Pool的状态和所有OSD的状态。

CRUSH MAP:包含当前磁盘、服务器、机架的层级结构。

CRUSH Rules:数据映射的策略。这些策略可以灵活的设置object存放的区域。比如可以指定 pool1中所有objecst放置在机架1上,所有objects的第1个副本放置在机架1上的服务器A上,第2个副本分布在机架1上的服务器B上。 pool2中所有的object分布在机架2、3、4上,所有Object的第1个副本分布在机架2的服务器上,第2个副本分布在机架3的服 器上,第3个副本分布在机架4的服务器上。


对 Ceph client 来说,只要它获得了 Cluster map,就可以使用 CRUSH 算法计算出某个 object 所在的 OSD。

(a)Ceph client 从 MON 获取最新的 cluster map,它包含所有的 monitors, OSDs, 和 metadata servers。

(b)Ceph client 根据上面的第(1)步计算出该 object 所在的 PG 的 ID。

(c)Ceph client 再根据 CRUSH 算法计算出 PG 中目标主 OSD 的 ID。

(d)Ceph client 向主 OSD 写入二进制数据块。

以存放一个文件为例,下图 说明了完整的计算过程:



wKiom1YuIYij0p_yAAHp43vYUNk693.jpg



这张图也有助于理清其中的关系:          

wKiom1YuI_CCy2FAAAGWo2f6owA598.jpg




Ceph client 向一个 RBD image 写入二进制数据(假设 pool 的拷贝份数为 3):          


Ceph的读写操作采用Primary-Replica模型,Client只向Object所对应OSD set的Primary发起读写请求,这保证了数据的强一致性。

由于每个Object都只有一个Primary OSD,因此对Object的更新都是顺序的,不存在同步问题。

当Primary收到Object的写请求时,它负责把数据发送给其他Replicas,只要这个数据被保存在所有的OSD上时,Primary才应答Object的写请求,这保证了副本的一致性。


(1)Ceph client 调用 librados 创建一个 RBD image,这时候不会做存储空间分配,而是创建若干元数据对象来保存元数据信息。

(2)Ceph client 调用 librados 开始写数据。librados 计算条带、object 等,然后开始写第一个 stripe 到特定的目标 object。

(3)librados 根据 CRUSH 算法,计算出 object 所对应的主 OSD ID,并将二进制数据发给它。

(4)主 OSD 负责调用文件系统接口将二进制数据写入磁盘上的文件(每个 object 对应一个 file,file 的内容是一个或者多个 stripe)。

(5)主 ODS 完成数据写入后,它使用 CRUSH 算啊计算出第二个OSD(secondary OSD)和第三个OSD(tertiary OSD)的位置,然后向这两个 OSD 拷贝对象。都完成后,它向 ceph client 反馈该 object 保存完毕。

wKiom1YuJPmRpdP9AACEoq-xjU8839.jpg




容错性                               


在分布式系统中,常见的故障有网络中断、掉电、服务器宕机、硬盘故障等,Ceph能够容忍这些故障,并进行自动修复,保证数据的可靠性和系统可用性。


Monitors是Ceph管家,维护着Ceph的全局状态。Monitors的功能和zookeeper类似,它们使用Quorum和Paxos算法去建立全局状态的共识。

OSDs可以进行自动修复,而且是并行修复。



故障检测:                 


OSD之间有心跳检测,当OSD A检测到OSD B没有回应时,会报告给Monitors说OSD B无法连接,则Monitors给OSD B标记为down状态,并更新OSD Map。当过了M秒之后还是无法连接到OSD B,则Monitors给OSD B标记为out状态(表明OSD B不能工作),并更新OSD Map。


备注:可以在Ceph中配置M的值。


故障恢复 :               


当某个PG对应的OSD set中有一个OSD被标记为down时(假如是Primary被标记为down,则某个Replica会成为新的Primary,并处理所有读写 object请求),则该PG处于active+degraded状态,也就是当前PG有效的副本数是N-1。

过了M秒之后,假如还是无法连接该OSD,则它被标记为out,Ceph会重新计算PG到OSD set的映射(当有新的OSD加入到集群时,也会重新计算所有PG到OSD set的映射),以此保证PG的有效副本数是N。

新OSD set的Primary先从旧的OSD set中收集PG log,得到一份Authoritative History(完整的、全序的操作序列),并让其他Replicas同意这份Authoritative History(也就是其他Replicas对PG的所有objects的状态达成一致),这个过程叫做Peering。

当Peering过程完成之后,PG进 入active+recoverying状态,Primary会迁移和同步那些降级的objects到所有的replicas上,保证这些objects 的副本数为N。

 

高性能                   


Client和Server直接通信,不需要代理和转发

多个OSD带来的高并发度。objects是分布在所有OSD上。

负载均衡。每个OSD都有权重值(现在以容量为权重)。

client不需要负责副本的复制(由primary负责),这降低了client的网络消耗


高可靠性               


数据多副本。可配置的per-pool副本策略和故障域布局,支持强一致性。

没有单点故障。可以忍受许多种故障场景;防止脑裂;单个组件可以滚动升级并在线替换。

所有故障的检测和自动恢复。恢复不需要人工介入,在恢复期间,可以保持正常的数据访问。

并行恢复。并行的恢复机制极大的降低了数据恢复时间,提高数据的可靠性。


高扩展性                 


高度并行。没有单个中心控制组件。所有负载都能动态的划分到各个服务器上。把更多的功能放到OSD上,让OSD更智能。

自管理。容易扩展、升级、替换。当组件发生故障时,自动进行数据的重新复制。当组件发生变化时(添加/删除),自动进行数据的重分布。








参考资料:

分布式文件系统Ceph


你可能感兴趣的:(ceph,推送一个文件,创建pool,查看对象)