一.什么是块存储?
单机块设备
光盘
磁盘
分布式块存储
ceph
cinder
ceph块设备也叫做RADOS块设备
RADOS block device : RBD
二.当集群osd节点成千上万时,管理节点的集群(mon)的负载会很大,那么osd本身能不能分担一些管理节点集群的任务呢?
RADOS应运而生.
1)RADOS(概念):是ceph的核心之一,作为ceph分布式文件系统的一个子项目,特别为ceph的需求设计,能够在 动态变化 和 异质结构 的 存储设备 机群 之上 提供一种稳定, 可扩展,高性能的 单一 逻辑对象 存储接口 和 能够实现节点的自适应和自管理的 存储系统 --->即实现集群一定程度上的智能化
2)RADOS分布方式:授权给OSDs自主管理对象复制(即实现osd的智能化,减轻mon监控压力),,,通过这种分布方式,授权给OSDs自主管理对象复制,OSD集群扩展,错误检测和恢复的权利,来实现 在能力和总体性能 的 线性增长。RADOS将文件映射到Objects(逻辑对象)后利用Cluster Map通过CRUSH计算而不是查找表方式定位文件数据在存储设备中的位置。省去了传统的File到Block的映射和BlockMap管理。
我的理解:osd只能执行命令的读写,本身没有数据处理(迁移等),错误检查等的功能,这一切由管理集群来处理,当osd节点非常多的时候,管理集群的性能就是ceph的瓶颈,而rados可以实现osd(通过授权的方式)自主的数据管理(复制,迁移等),错误检查等的功能,这样就减轻了管理集群的压力.
3)RADOS可扩展的集群管理:
1>RADOS系统包括大量OSD节点(包括一个CPU、一些易失性内存、一个网络接口、本地磁盘或RAID)和规模小的负责管理的monitor(有单机进程并且需要少量的本地内存 )集合。
2>Cluster(指示PostgreSQL 基于索引 (indexname 的度量)对表 table进行存储 建簇。)
4)Cluster Map:
1>Monitor集群管理维护Cluster map。Cluster map描述了数据在系统中的分布情况。客户端提供一个简单的接口把整个存储集群虚拟成一个单一的逻辑对象存储。
2>在非常大的集群中,节点上千,OSD的出错和恢复都是比较平常的,因此,Cluser map的变动会很频繁。Cluster map的改变会触发map epoch的递增。Cluster map的更新以incremental maps的形式来进行分布,即用samll message来表示两个map epoch间的差异。很多更新被集中捆绑,以便描述间隔较长的map版本(看着有点像日志)。
5)数据的放置:
1>RADOS使用CRUSH伪随机算法,将数据伪随机地分布到设备上,当新设备增加,一个随机的现存数据的副本迁移到新设备上用以实现负载均衡。这个过程涉及到两个方面:1.计算正确的对象存储位置,2.不需要维护一个大型的集中分配表。
2>对象先被映射到PG组(placement(放置) group),PG组表示逻辑上的对象集合,每个对象的PG由以下公式来计算得到:pgid=(r,hash(o)&m),r表示数据主从复制的等级,hash(o)表示对象名为o的键值,m表示控制PG总数的位掩码。
个人理解:
backup1
cluster map backup2
Client---->PG---------------> backup3
(逻辑对象组) <--------- backup4
(携带map epoch) backup5
......
PG由其中一个osd负责
当有新设备增加时,随机一个节点将数据副本反馈给PG,PG再根据cluster map来找到新增的节点,并将数据副本传给此节点,实现负载均衡
3>PG组根据cluster map来映射到OSD节点上。每个PG被映射到有序的包含r个OSD节点的链表中。该映射通过CRUSH算法来实现(一个PG往一组设备OSD上映射)。CRUSH算法和hash算法的相似之处在于其PG值是确定的,但却是伪随机分布的;但不同的是,CRUSH是未定的,当一个或多个设备加入或离开集群时,PGs保持不变,CRUSH负责转移足够的数据来维护一个均衡的分布,HASH则更倾向于强制重新映射。
6)Map传播(Map Propagation)
由于ODS的数据很多,所以以广播的形式来更新所有的map是不合适的。但不同的map epochs之间的差异是很明显的,所以,当两个通信的OSD(或者客户端和OSD)不同时,map才会更新。这种方式可以使得RADOS对map的更新延迟,有效地将分布的负载转移到OSD上。
个人理解:
由于osd存储节点比较多,所以通过广播的方式不能做到数据实时更新,所以采用 检测 客户端与OSD(或者两个客户端之间通信)数据不同时,才会更新.
OSD 智能存储设备
上面我们提到了再RADOS当中,OSD拥有智能,减少了管理节点集群的负担,那么,接下来,我们就看一下OSD具体可以实现哪些任务
7)RADOS实现三种不同复制策略:
1>Primary copy:读和写都在第一个OSD上,然后并行地更新副本到其他OSD上
2>chain:写在第一个OSD上,读在最后一个OSD上
3>splay replication:hybrid方法,从最后一个OSD开始读,先在第一个OSD上写,然后并行地更新副本到其他OSD上
8)强一致性
首先,RADOS中的所有信息都携带发送方的map epoch,这是前提条件。
1>如果一个发送方由于data map过期,定位到错误的OSD,该OSD会返回给它一个增量保证他更新之后重新定位到正确的OSD。
2>如果cluster map的主拷贝更新了一个特定的PG中的成员,其他老成员依然可以处理更新;如果这个更新先被一个PG副本节点接收,这个change就会被立刻发现,当住OSD转发更新消息到这个节点时,这个副本节点就会返回map增量给主OSD。因为任何一个新负责一个PG的OSD都需要与原来负责的OSD进行联系(工作交接),来保证PG内容的正确。
3>当新的OSD要负责一个PG时(工作交接),该组内所有老OSD都要被通知到,已确认自己的角色(类似于一个组换领导了,组内成员都得被通知一遍)。所以需要周期性地发送报文。这样为了保证主OSD故障时数据不可用的时间很短。(文章建议设定两秒)
9)故障检测
1>RADOS 采用一种异步的,有序的,点对点 的消息 传递方式 进行通信。OSD会与自己的对端(共享同一PG data的OSD)交换周期性报文,这样,如果一个OSD出现故障,几次连接都失败后会报告给管理集群,集群将报文周期性发送,OSD发现自己被标记为down后,会同步硬盘数据,然后挂掉自己来保证系统的一致性。
10)数据迁移和故障恢复
1>RADOS数据迁移和故障恢复完全是由Cluster map的更新和PG到OSD的映射驱动的。新的CRUSH策略会使所有数据重新分布。
2>分层复制(declustered replication)能够进行并行的故障恢复。
3>通过观察I/O读是否被限制来触发RADOS的recovery。
4>RADOS中PG的恢复由primary OSD协调,可将任何对象推送到replia OSD,保证每个拷贝对象只读一次。
11)MONITORS监视器
1>Monitors是一个小的管理集群,通过春初Cluster Map的主拷贝,并周期性更新配置和OSD状态,管理整个存储系统。这个集群基于Paxos part-time parliament算法,保证数据一致性以及更新的延迟性。
2>monitors集群的工作负载比较小,大部分map 的分配是由OSD承担的,monitors需要承担的时候是当设备状态出现变化的时候,比如设备故障了,但是通常这种状态变化是不经常发生的。
3>monitors集群采用租约机制,允许任何monitor可以从OSD或Client请求Cluster map的拷贝。通常情况下,OSD很少发起更新请求,因为通常在此之前,map更新已经被共享了。而对于Client发起更新请求的情况也比较少,通常在OSD操作超时,或发生错误的时候。
4>对Map update的请求会被转发给Monitors集群的当前leader。Leader汇集这些请求到一个Map Update。最坏的情况下Leader的负载情况如何?当大量OSD在一个短时间内同时发生故障,比如一个OSD中放了u个PG,有f个OSD发生故障,那么,最多会有uf个错误报告。当f比较大时,消息会非常多,OSD会在伪随机时间间隔发送报文,以保证这些错误被陆续检测,压制和分别报告。非leader的monitor对一个报错转发一次,因此,leader的请求负载为fm,m为集群中monitor的数量。
5>我的感觉就是RADOS这个分发系统,通过OSD增加任务承担能力,减轻monitor的工作量。关键词是存储系统动态变化,集群扩建,更替,数据迁移,数据恢复。为了保证集群数据的一致性和可访问性引入Cluster map等机制,为ceph提供实现的基础。
##Os:
架构师真的需要很多的细节,不能只停留在知其然,还要知其所以然.