随着云计算技术的兴起和普及,云计算基石:分布式共享存储系统受到业界的重视。Ceph以其稳定、高可用、可扩展的特性,乘着开源云计算管理系统OpenStack的东风,迅速成为最热门的开源分布式存储系统。
Ceph作为一个开源的分布式存储系统,人人都可以免费获得其源代码,并能够安装部署,但是并不等于人人都能用起来,人人都能用好。用好一个开源分布式存储系统,首先要对其架构、功能原理等方面有比较好的了解,其次要有修复漏洞的能力。这些都是在采用开源分布式存储系统时所面临的挑战。
要用好Ceph,就必须深入了解和掌握Ceph源代码。Ceph源代码的实现被公认为比较复杂,阅读难度较大。阅读Ceph源代码,不但需要对C++语言以及boost库和STL库非常熟悉,还需要有分布式存储系统相关的基础知识以及对实现原理的深刻理解,最后还需要对Ceph框架和设计原理以及具体的实现细节有很好的把握。所以Ceph源代码的阅读是相当有挑战性的。
目录
- 序言
- 前言
- 第1章 Ceph整体架构 1
- 1.1 Ceph的发展历程 1
- 1.2 Ceph的设计目标 2
- 1.3 Ceph基本架构图 2
- 1.4 Ceph客户端接口 3
- 1.4.1 RBD 4
- 1.4.2 CephFS 4
- 1.4.3 RadosGW 4
- 1.5 RADOS 6
- 1.5.1 Monitor 6
- 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 Peering 11
- 1.5.8 Recovery和Backfill 11
- 1.5.9 纠删码 11
- 1.5.10 快照和克隆 12
- 1.5.11 Cache Tier 12
- 1.5.12 Scrub 13
- 1.6 本章小结 13
- 第2章 Ceph通用模块 14
- 2.1 Object 14
- 2.2 Buffer 16
- 2.2.1 buffer::raw 16
- 2.2.2 buffer::ptr 17
- 2.2.3 buffer::list 17
- 2.3 线程池 19
- 2.3.1 线程池的启动 20
- 2.3.2 工作队列 20
- 2.3.3 线程池的执行函数 21
- 2.3.4 超时检查 22
- 2.3.5 ShardedThreadPool 22
- 2.4 Finisher 23
- 2.5 Throttle 23
- 2.6 SafeTimer 24
- 2.7 本章小结 25
- 第3章 Ceph网络通信 26
- 3.1 Ceph网络通信框架 26
- 3.1.1 Message 27
- 3.1.2 Connection 29
- 3.1.3 Dispatcher 29
- 3.1.4 Messenger 29
- 3.1.5 网络连接的策略 30
- 3.1.6 网络模块的使用 30
- 3.2 Simple实现 32
- 3.2.1 SimpleMessager 33
- 3.2.2 Accepter 33
- 3.2.3 DispatchQueue 33
- 3.2.4 Pipe 34
- 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 Map 40
- 4.2.2 Placement Rules 42
- 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 Librados 53
- 5.1.1 RadosClient 54
- 5.1.2 IoCtxImpl 56
- 5.2 OSDC 56
- 5.2.1 ObjectOperation 56
- 5.2.2 op_target 57
- 5.2.3 Op 57
- 5.2.4 Striper 58
- 5.2.5 ObjectCacher 59
- 5.3 客户写操作分析 59
- 5.3.1 写操作消息封装 60
- 5.3.2 发送数据op_submit 61
- 5.3.3 对象寻址_calc_target 61
- 5.4 Cls 62
- 5.4.1 模块以及方法的注册 62
- 5.4.2 模块的方法执行 63
- 5.4.3 举例说明 64
- 5.5 Librbd 65
- 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 Pool 74
- 6.2.2 PG 75
- 6.2.3 OSDMap 75
- 6.2.4 OSDOp 77
- 6.2.5 Object_info_t 77
- 6.2.6 ObjectState 78
- 6.2.7 SnapSetContext 79
- 6.2.8 ObjectContext 79
- 6.2.9 Session 80
- 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 FileJournal 103
- 7.4 FileStore的实现 109
- 7.4.1 日志的三种类型 110
- 7.4.2 JournalingObjectStore 111
- 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 CollectionIndex 120
- 7.6.1 CollectIndex接口 122
- 7.6.2 HashIndex 123
- 7.6.3 LFNIndex 124
- 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_full 133
- 8.4.3 ECBackend 133
- 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.4 PG创建后状态机的状态转换 154
- 10.5 Ceph的Peering过程分析 156
- 10.5.1 基本概念 156
- 10.5.2 PG日志 159
- 10.5.3 Peering的状态转换图 166
- 10.5.4 pg_info数据结构 167
- 10.5.5 GetInfo 169
- 10.5.6 GetLog 176
- 10.5.7 GetMissing 181
- 10.5.8 Active操作 183
- 10.5.9 副本端的状态转移 187
- 10.5.10 状态机异常处理 188
- 10.6 本章小结 188
- 第11章 Ceph数据修复 189
- 11.1 资源预约 190
- 11.2 数据修复状态转换图 191
- 11.3 Recovery过程 193
- 11.3.1 触发修复 193
- 11.3.2 ReplicatedPG 195
- 11.3.3 pgbackend 199
- 11.4 Backfill过程 205
- 11.4.1 相关数据结构 205
- 11.4.2 Backfill的具体实现 205
- 11.5 本章小结 210
- 第12章 Ceph一致性检查 211
- 12.1 端到端的数据校验 211
- 12.2 Scrub概念介绍 213
- 12.3 Scrub的调度 213
- 12.3.1 相关数据结构 214
- 12.3.2 Scrub的调度实现 214
- 12.4 Scrub的执行 217
- 12.4.1 相关数据结构 217
- 12.4.2 Scrub的控制流程 219
- 12.4.3 构建ScrubMap 221
- 12.4.4 从副本处理 224
- 12.4.5 副本对比 225
- 12.4.6 结束Scrub过程 228
- 12.5 本章小结 228
- 第13章 Ceph自动分层存储 230
- 13.1 自动分层存储技术 230
- 13.2 Ceph分层存储架构和原理 231
- 13.3 Cache Tier的模式 231
- 13.4 Cache Tier的源码分析 234
- 13.4.1 pool中的Cache Tier数据结构 234
- 13.4.2 HitSet 236
- 13.4.3 Cache Tier的初始化 237
- 13.4.4 读写路径上的Cache Tier处理 238
- 13.4.5 cache的flush和evict操作 245
- 13.5 本章小结 250