文档章节

解析 Ceph : OSD , OSDMap 和 PG, PGMap

shadowalker911
 shadowalker911
发布于 2015/02/13 16:08
字数 2007
阅读 250
收藏 0

 在 2014 年 01 月 25 日 上公布 作者为 麦子迈 文章分类 Ceph                    

ditaa-ae8fc6ae5b4014f064a0bed424507a7a247cd113

图A

Ceph致力于提供PB级的集群存储能力,并且提供自动故障恢复,方便的扩容和缩容能力,这些能力在典型的分布式存储系统就需要 Metadata Server 来提供,因为完全分布式系统对于数据迁移和扩容有着非常强的痛点,但是 Metadata Server 另一方面又需要避免单点故障和数据瓶颈的问题。,在这里,Ceph 要提供更自由和更强大的集群自动故障处理和恢复能力,这使得 Metadata Server 是不可或缺的,但是为了避免 Metadata Server 存在瓶颈问题,维护哪些 Metadata 成为最重要的问题。Monitor 作为Ceph的 Metada Server 维护了集群的信息,它包括了6个 Map,分别是 MONMap,OSDMap,PGMap,LogMap,AuthMap,MDSMap。其中 PGMap 和 OSDMap 是最重要的两张Map,会在本文主要涉及。

OSDMap

OSDMap 是 Ceph 集群中所有 OSD 的信息,所有 OSD 节点的改变如进程退出,节点的加入和退出或者节点权重的变化都会反映到这张 Map 上。这张 Map 不仅会被 Monitor 掌握,OSD 节点和 Client 也会从 Monitor 得到这张表,因此实际上我们需要处理所有 “Client” (包括 OSD,Monitor 和 Client)的 OSDMap 持有情况,实际上,每个 “Client” 可能会具有不同版本的 OSDMap,当 Monitor 所掌握的权威 OSDMap 发生变化时,它并不会发送 OSDMap 给所有 “Client” ,而是需要了解到变化的 “Client” 会被 Push,如一个新的 OSD 加入会导致一些 PG 的迁移,那么这些 PG 的 OSD 会得到通知。除此之外,Monitor 也会随机的挑选一些 OSD 发送 OSDMap。那么如何让 OSDMap 慢慢传播呢?比如 OSD.a, OSD.b得到了新的 OSDMap,那么 OSD.c 和 OSD.d 可能部分 PG 也会在 OSD.a, OSD.b 上,这时它们的通信就会附带上 OSDMap 的 epoch,如果版本较低,OSD.c 和 OSD.d 会主动向 Monitor pull OSDMap,而部分情况 OSD.a, OSD.b 也会主动向 OSD.c 和 OSD.d push 自己的 OSDMap (如果更新)。因此,OSDMap 会在接下来一段时间内慢慢在节点间普及。在集群空闲时,很有可能需要更长的时间完成新 Map的更新,但是这并不会影响 OSD 之间的状态一致性,因为OSD没有得到新的Map所有它们不需要知晓新的OSDMap变更。

Ceph 通过管理多个版本的 OSDMap 来避免集群状态的同步,这使得 Ceph 丝毫不会畏惧在数千个 OSD 规模的节点变更导致集群可能出现的状态同步。

Snip20140125_12

图B

接下来会简单介绍 OSD 在启动时对 OSDMap 进行变更的情况,当一个新的 OSD 启动时,这时 Monitor 所掌握的最新 OSDMap 并没有该 OSD 的情况,因此该 OSD 会向 Monitor 申请加入,Monitor 再验证其信息后会将其加入 OSDMap 并标记为IN,并且将其放在 Pending Proposal 中会在下一次 Monitor “讨论”中提出,OSD 在得到 Monitor 的回复信息后发现自己仍然没在 OSDMap 中会继续尝试申请加入,接下来 Monitor 会发起一个 Proposal ,申请将这个 OSD 加入 OSDMap 并且标记为 UP 。然后按照 Paxos 的流程,从 proposal->accept->commit 到最后达成一致,OSD 最后成功加入 OSDMap 。当新的 OSD 获得最新 OSDMap 发现它已经在其中时。这时,OSD 才真正开始建立与其他OSD的连接,Monitor 接下来会开始给他分配PG。

ditaa-2ad4d285aa0fb0ed30f32eb7137638c5d045f92a

图C

当一个 OSD 因为意外 crash 时,其他与该 OSD 保持 Heartbeat 的 OSD 都会发现该 OSD 无法连接,在汇报给 Monitor 后,该 OSD 会被临时性标记为 OUT,所有位于该 OSD 上的 Primary PG 都会将 Primary 角色交给其他 OSD(下面会解释)。

PG 和 PGMap

Snip20140125_14

图D

PG(Placement Group)是 Ceph 中非常重要的概念,它可以看成是一致性哈希中的虚拟节点,维护了一部分数据并且是数据迁移和改变的最小单位。它在 Ceph 中承担着非常重要的角色,在一个 Pool 中存在一定数量的 PG (可动态增减),这些 PG 会被分布在多个 OSD ,分布规则可以通过 CRUSH RULE 来定义。Monitor 维护了每个Pool中的所有 PG 信息,比如当副本数是三时,这个 PG 会分布在3个 OSD 中,其中有一个 OSD 角色会是 Primary ,另外两个 OSD 的角色会是 Replicated。Primary PG负责该 PG 的对象写操作,读操作可以从 Replicated PG获得。而 OSD 则只是 PG 的载体,每个 OSD 都会有一部分 PG 角色是 Primary,另一部分是 Replicated,当 OSD 发生故障时(意外 crash 或者存储设备损坏),Monitor 会将该 OSD 上的所有角色为 Primary 的 PG 的 Replicated 角色的 OSD 提升为 Primary PG,这个 OSD 所有的 PG 都会处于 Degraded 状态。然后等待管理员的下一步决策,如果原来的 OSD 无法启动, OSD 会被踢出集群,这些 PG 会被 Monitor 根据 OSD 的情况分配到新的 OSD 上。

ceph-peering-state-model

图E

在 Ceph 中,PG 存在多达十多种状态和数十种事件的状态机去处理 PG 可能面临的异常,每个PG就像一个家族,PG掌握的数据就是其财富,而 OSD 只是一个城堡,每个城堡为多个家族提供了住所,但是为了保证财富的传承,每个家族都会在多个城堡建立住所。OSD 如果城堡一样只是为 PG 提供一个通讯地址(IP:Port)和一些基础设施(如 OSDMap 和消息通讯机制),当城堡发生意外后,所有家族在其他城堡的住所都会及时更新状态并且重新选择新的城堡作为住所。或者城堡从意外中恢复过来,这个城堡的所有家族会与自己家族在其他城堡的住所沟通来得知在意外过程中财富发生变化的情况。这个例子是为了说明Object(即用户数据)是跟着PG走,而不是跟OSD产生联系。

从上面的描述中我们可以了解到 Monitor 掌握了整个集群的 OSD 状态和 PG 状态,每个PG都是一部分 Object 的拥有者,维护 Object 的信息也每个 PG 的责任,Monitor 不会掌握 Object Level 的信息。因此每个PG都需要维护 PG 的状态来保证 Object 的一致性。但是每个 PG 的数据和相关故障恢复、迁移所必须的记录都是由每个 PG 自己维护,也就是存在于每个 PG 所在的 OSD 上。

PGMap 是由 Monitor 维护的所有 PG 的状态,每个 OSD 都会掌握自己所拥有的 PG 状态,PG 迁移需要 Monitor 作出决定然后反映到 PGMap 上,相关 OSD 会得到通知去改变其 PG 状态。在一个新的 OSD 启动并加入 OSDMap 后,Monitor 会通知这个OSD需要创建和维护的 PG ,当存在多个副本时,PG 的 Primary OSD 会主动与 Replicated 角色的 PG 通信并且沟通 PG 的状态,其中包括 PG 的最近历史记录。通常来说,新的 OSD 会得到其他 PG 的全部数据然后逐渐达成一致,或者 OSD 已经存在该 PG 信息,那么 Primary PG 会比较该 PG 的历史记录然后达成 PG 的信息的一致。这个过程称为 Peering ,它是一个由 Primary PG OSD 发起的“讨论”,多个同样掌握这个 PG 的 OSD 相互之间比较 PG 信息和历史来最终协商达成一致。

参考

  1. 图A, C来自Ceph官方文档

  2. 图E来自ceph peering state model

本文转载自:http://www.wzxue.com/ceph-osd-and-pg/

共有 人打赏支持
shadowalker911
粉丝 6
博文 28
码字总数 3041
作品 0
徐汇
私信 提问
Openstack 之 ceph存储池分级

上面左边是我的个人微信,如需进一步沟通,请加微信。 右边是我的公众号“Openstack私有云”,如有兴趣,请关注。 上篇《Openstack 之使用外部ceph存储》中提到,为了达到不同的pool可以使用...

余伟兵
07/11
0
0
ceph安装配置完成,pgs degraded; pgs stuck unclean

[root@ceph01 ~]# ceph -s cluster 950ff068-1065-4667-977e-c75b6a2ce1dd health HEALTH_WARN 192 pgs degraded; 192 pgs stuck unclean monmap e1: 1 mons at {ceph01=10.1.8.235:6789/0},......

AndrewSun
2015/01/08
10K
4
Ceph学习笔记1-Mimic版本多节点部署

特别说明: 本方法也可以用于单节点部署,只部署一个(只是会形成单点故障而已),最低要求是使用两个分区创建个(因为默认最小副本是);如果不需要使用,则可以不部署服务;如果不使用对象...

LastRitter
10/22
0
0
Ceph 0.80.8/0.91 发布,分布式文件系统

Ceph 0.91 发布,我们正在快速的达到 Hammer 版本的特性冻结阶段,但还有一些更多的开发版需要推出。Ceph 0.91 最值得关注的是 CephFS 基于子树的配额支持(ceph-fuse、libcephfs 客户端支持...

oschina
2015/01/15
2.6K
2
Ceph v10.0.3 发布,分布式存储系统

Ceph v10.0.3 发布,这是 Jewel 的第四个开发版本,该版本增加了一些大的特性,包括 BlueStore (全新的 OSD 用于替换 FileStore 的后端), 修复了很多 ceph-disk 相关问题,全新的可调整 CRUS...

oschina
2016/02/11
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

【58沈剑 架构师之路】1分钟了解MyISAM与InnoDB的索引差异

《数据库索引,到底是什么做的?》介绍了B+树,它是一种非常适合用来做数据库索引的数据结构: (1)很适合磁盘存储,能够充分利用局部性原理,磁盘预读; (2)很低的树高度,能够存储大量数据;...

张锦飞
13分钟前
1
0
代码优化----使用builder模式构造对象

看《effective java》的时候,创建对象章节提到使用builder模式来创建对象。觉得非常好用,做一个记录。以后应该就会这么写啦~~~~~~ 对于一个有很多属性的类,在为属性赋值时,通常会用到两种...

wuyiyi
14分钟前
2
0
一文带你看懂cookie,面试前端不用愁

本文由云+社区发表 在前端面试中,有一个必问的问题:请你谈谈cookie和localStorage有什么区别啊? localStorage是H5中的一种浏览器本地存储方式,而实际上,cookie本身并不是用来做服务器存...

腾讯云加社区
15分钟前
1
0
随行付微服务测试之接口测试和契约测试

背景 日常开发过程中,项目的接口通常由服务提供方约定和提供,微服务模式下接口被多个消费者调用更是常态,那么提供方接口的变更如何快速、高效、无遗漏的通知给消费者呢?另外,当一个ser...

马力-随行付
16分钟前
1
0
为什么Python是2019最值得学的编程语言?

对于那些从来没有学习编程小伙伴,Python 是最好的选择之一, Python 是一种清晰的语言,用缩进来表示程序的嵌套关系可谓是一种创举,把过去软性的编程风格升级为硬性的语法规定。再不需要在...

糖宝lsh
16分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部