内容简介
本书作者通过多年的开发经验,总结了自己使用Ceph的实战经验,并对Ceph的框架和主要源代码进行了分析,为开发分布式系统提供了重要参考。主要内容包括:Ceph整体架构、Ceph通用模块、Ceph网络通信模块、Ceph客户端实现、CephCRUSH算法、Ceph底层对象存储机制、CephOsd、Cephmon等。
目录
序言
前言
第1章 Ceph整体架构1
1.1 Ceph的发展历程1
1.2 Ceph的设计目标2
1.3 Ceph基本架构图2
1.4 Ceph客户端接口3
1.4.1 RBD4
1.4.2 CephFS4
1.4.3 RadosGW4
1.5 RADOS6
1.5.1 Monitor6
1.5.2 对象存储7
1.5.3 pool和PG的概念7
1.5.4 对象寻址过程8
1.5.5 数据读写过程9
1.5.6 数据均衡10
1.5.7 Peering11
1.5.8 Recovery和Backfill11
1.5.9 纠删码11
1.5.10 快照和克隆12
1.5.11 Cache Tier12
1.5.12 Scrub13
1.6 本章小结13
第2章 Ceph通用模块14
2.1 Object14
2.2 Buffer16
2.2.1 buffer::raw16
2.2.2 buffer::ptr17
2.2.3 buffer::list17
2.3 线程池19
2.3.1 线程池的启动20
2.3.2 工作队列20
2.3.3 线程池的执行函数21
2.3.4 超时检查22
2.3.5 ShardedThreadPool22
2.4 Finisher23
2.5 Throttle23
2.6 SafeTimer24
2.7 本章小结25
第3章 Ceph网络通信26
3.1 Ceph网络通信框架26
3.1.1 Message27
3.1.2 Connection29
3.1.3 Dispatcher 29
3.1.4 Messenger29
3.1.5 网络连接的策略30
3.1.6 网络模块的使用30
3.2 Simple实现32
3.2.1 SimpleMessager33
3.2.2 Accepter33
3.2.3 DispatchQueue33
3.2.4 Pipe34
3.2.5 消息的发送35
3.2.6 消息的接收36
3.2.7 错误处理37
3.3 本章小结38
第4章 CRUSH数据分布算法39
4.1 数据分布算法的挑战39
4.2 CRUSH算法的原理40
4.2.1 层级化的Cluster Map40
4.2.2 Placement Rules42
4.2.3 Bucket随机选择算法46
4.3 代码实现分析49
4.3.1 相关的数据结构49
4.3.2 代码实现50
4.4 对CRUSH算法的评价52
4.5 本章小结52
第5章 Ceph客户端53
5.1 Librados53
5.1.1 RadosClient54
5.1.2 IoCtxImpl56
5.2 OSDC56
5.2.1 ObjectOperation56
5.2.2 op_target57
5.2.3 Op57
5.2.4 Striper58
5.2.5 ObjectCacher59
5.3 客户写操作分析59
5.3.1 写操作消息封装60
5.3.2 发送数据op_submit61
5.3.3 对象寻址_calc_target61
5.4 Cls62
5.4.1 模块以及方法的注册62
5.4.2 模块的方法执行63
5.4.3 举例说明64
5.5 Librbd65
5.5.1 RBD的相关的对象65
5.5.2 RBD元数据操作66
5.5.3 RBD数据操作67
5.5.4 RBD的快照和克隆69
5.6 本章小结71
第6章 Ceph的数据读写72
6.1 OSD模块静态类图72
6.2 相关数据结构73
6.2.1 Pool74
6.2.2 PG75
6.2.3 OSDMap75
6.2.4 OSDOp77
6.2.5 Object_info_t77
6.2.6 ObjectState78
6.2.7 SnapSetContext79
6.2.8 ObjectContext79
6.2.9 Session80
6.3 读写操作的序列图81
6.4 读写流程代码分析83
6.4.1 阶段1:接收请求83
6.4.2 阶段2:OSD的op_wq处理85
6.4.3 阶段3:PGBackend的处理95
6.4.4 从副本的处理95
6.4.5 主副本接收到从副本的应答95
6.5 本章小结96
第7章 本地对象存储97
7.1 基本概念介绍98
7.1.1 对象的元数据98
7.1.2 事务和日志的基本概念98
7.1.3 事务的封装99
7.2 ObjectStore对象存储接口100
7.2.1 对外接口说明101
7.2.2 ObjectStore代码示例101
7.3 日志的实现102
7.3.1 Jouanal对外接口102
7.3.2 FileJournal103
7.4 FileStore的实现109
7.4.1 日志的三种类型110
7.4.2 JournalingObjectStore111
7.4.3 Filestore的更新操作112
7.4.4 日志的应用115
7.4.5 日志的同步115
7.5 omap的实现116
7.5.1 omap存储117
7.5.2 omap的克隆118
7.5.3 部分代码实现分析119
7.6 CollectionIndex120
7.6.1 CollectIndex接口122
7.6.2 HashIndex123
7.6.3 LFNIndex124
7.7 本章小结124
第8章 Ceph纠删码125
8.1 EC的基本原理125
8.2 EC的不同插件126
8.2.1 RS编码126
8.2.2 LRC编码126
8.2.3 SHEC编码128
8.2.4 EC和副本的比较129
8.3 Ceph中EC的实现129
8.3.1 Ceph中EC的基本概念129
8.3.2 EC支持的写操作130
8.3.3 EC的回滚机制131
8.4 EC的源代码分析132
8.4.1 EC的写操作132
8.4.2 EC的write_full133
8.4.3 ECBackend133
8.5 本章小结133
第9章 Ceph快照和克隆134
9.1 基本概念134
9.1.1 快照和克隆134
9.1.2 RDB的快照和克隆比较135
9.2 快照实现的核心数据结构137
9.3 快照的工作原理139
9.3.1 快照的创建139
9.3.2 快照的写操作139
9.3.3 快照的读操作140
9.3.4 快照的回滚141
9.3.5 快照的删除141
9.4 快照读写操作源代码分析141
9.4.1 快照的写操作141
9.4.2 make_writeable函数142
9.4.3 快照的读操作145
9.5 本章小结146
第10章 Ceph Peering机制147
10.1 statechart状态机147
10.1.1 状态147
10.1.2 事件 148
10.1.3 状态响应事件148
10.1.4 状态机的定义149
10.1.5 context函数150
10.1.6 事件的特殊处理150
10.2 PG状态机151
10.3 PG的创建过程151
10.3.1 PG在主OSD上的创建151
10.3.2 PG在从OSD上的创建153
10.3.3 PG的加载154
10
前言/序言
前 言 随着云计算技术的兴起和普及,云计算基石:分布式共享存储系统受到业界的重视。Ceph以其稳定、高可用、可扩展的特性,乘着开源云计算管理系统OpenStack的东风,迅速成为最热门的开源分布式存储系统。 Ceph作为一个开源的分布式存储系统,人人都可以免费获得其源代码,并能够安装部署,但是并不等于人人都能用起来,人人都能用好。用好一个开源分布式存储系统,首先要对其架构、功能原理等方面有比较好的了解,其次要有修复漏洞的能力。这些都是在采用开源分布式存储系统时所面临的挑战。 要用好Ceph,就必须深入了解和掌握Ceph源代码。Ceph源代码的实现被公认为比较复杂,阅读难度较大。阅读Ceph源代码,不但需要对C++语言以及boost库和STL库非常熟悉,还需要有分布式存储系统相关的基础知识以及对实现原理的深刻理解,最后还需要对Ceph框架和设计原理以及具体的实现细节有很好的把握。所以Ceph源代码的阅读是相当有挑战性的。 本着对Ceph源代码的浓厚兴趣以及实践工作的需要,需要对Ceph在源代码层级有比较深入的了解。当时笔者尽可能地搜索有关Ceph源代码的介绍,发现这方面的资料比较少,笔者只能自己对着Ceph源代码开始了比较艰辛的阅读之旅。在这个过程中,每一个小的进步都来之不易,理解一些实现细节,都需要对源代码进行反复地推敲和琢磨。自己在阅读的过程中,特别希望有人能够帮助理清整体代码的思路,能够解答一下关键的实现细节。本书就是秉承这样一个简单的目标,希望指引和帮助广大Ceph爱好者更好地理解和掌握Ceph源代码。 本书面向热爱Ceph的开发者,想深入了解Ceph原理的高级运维人员,想基于Ceph做优化和定制的开发人员,以及想对社区提交代码的研究人员。官网上有比较详细的介绍Ceph安装部署以及操作相关的知识,希望阅读本书的人能够自己动手实践,对Ceph进一步了解。本书基于目前最新的Ceph 10.2.1版本进行分析。 本书着重介绍Ceph的整体框架和各个实现模块的实现原理,对核心源代码进行分析,包括一些关键的实现细节。存储系统的实现都是围绕数据以及对数据的操作来展开,只要理解核心的数据结构,以及数据结构的相关操作就可以大致了解核心的实现和功能。本书的写作思路是先介绍框架和原理,其次介绍相关的数据结构,最后基于数据结构,介绍相关的操作实现流程。 最后感谢一起工作过的同事们,同他们在Ceph技术上进行交流沟通并加以验证实践,使我受益匪浅。感谢机械工业出版社的编辑吴怡对本书出版所做的努力,以及不断提出的宝贵意见。感谢我的妻子孙盛南女士在我写作期间默默的付出,对本书的写作提供了坚强的后盾。 由于Ceph源代码比较多,也比较复杂,写作的时间比较紧,加上个人的水平有限,错误和疏漏在所难免,恳请读者批评指正。有任何的意见和建议都可发送到我的邮箱changtao381@163.com,欢迎读者与我交流Ceph相关的任何问题。 常涛2016年6月于北京 序 言自从2013年加入Ceph社区以来,我一直想写一本分析Ceph源码的书,但是两年多来提交了数万行的代码后,我渐渐放下了这个事情。Ceph每个月、每周都会发生巨大变化,我总是想让Ceph源码爱好者看到最新最棒的设计和实现,社区一线的模块维护和每周数十个代码提交集的阅读,让我很难有时间回顾和把握其他Ceph爱好者的疑问和需求点。 今天看到这本书让我非常意外,作者常涛把整个Ceph源码树肢解得恰到好处,如庖丁解牛般将Ceph的核心思想和实现展露出来。虽然目前Ceph分分钟都有新的变化,但无论是新的模块设计,还是重构已有逻辑,都是已有思想的翻新和延续,这些才是众多Ceph开发者能十年如一日改进的秘密! 我跟作者常涛虽然只有一面之缘,但是在开源社区中的交流已经足够成为彼此的相知。他对于分布式存储的设计和实现都有独到见解,其代码阅读和理解灵感更是超群。我在年前看到他一些对Ceph核心模块的创新性理解,相信这些都通过这本书展现出来了。 这本书是目前我所看到的从代码角度解读Ceph的最好作品,即使在全球范围内,都没有类似的书籍能够与之媲美。相信每个Ceph爱好者都能从这本书中找到自己心中某些疑问的解答途径。 作为Ceph社区的主要开发者,我也想在这里强调Ceph的魅力,希望每个读者都能充分感受到Ceph社区生机勃勃的态势。Ceph是开源世界中存储领域的一个里程碑!在过去很难想像,从IT巨无霸们组成的巨大存储壁垒中能够诞生一个真正被大量用户使用并投入生产环境的开源存储项目,而Ceph这个开源存储项目已经成为全球众多海量存储项目的主要选择。 众所周知,在过去十年里,IT技术领域中巨大的创新项目很多来自于开源世界,从垄断大数据的Hadoop、Spark,到风靡全球的Docker,都证明了开源力量推动了新技术的产生与发展。而再往以前看十年,从Unix到Linux,从Oracle到MySQL/PostgreSQL,从 VMWare到KVM,开源世界从传统商业技术继承并给用户带来更多的选择。处于开源社区一线的我欣喜地看到,在IT基础设施领域,越来越多的创业公司从创立之初就以开源为基石,而越来越多的商业技术公司也受益于开源,大量的复杂商业软件基于开源分布式数据库、缓存存储、中间件构建。相信开源的Ceph也将成为IT创新的驱动力。正如Sage Weil在2016 Ceph Next会议上所说,Ceph将成为存储里的Linux! 王豪迈,XSKY公司CTO2016年9月8日
Ceph源码分析 电子书 下载 mobi epub pdf txt