Ceph14.2.22源代码:https://download.ceph.com/tarballs/
ceph-14.2.22根目录
-
【admin】:管理工具,用于架设文档服务器等
-
【cmake】:Ceph对cmake的支持
-
【debian】:用于制作debian(Ubuntu)安装包的相关脚本和文件
-
【doc】:用于生成项目文档,生成结果参考https://docs.ceph.com/en/latest/
-
【examples】:librados和librbd的HelloWorld例子
-
【qa】:各个模块的功能测试脚本和代码
-
【systemd】:Ceph对于systemd的支持目录
-
【udev】:Ceph的udev规则
KERNEL=="rbd[0-9]*", ENV{DEVTYPE}=="disk", PROGRAM="/usr/bin/ceph-rbdnamer %k", SYMLINK+="rbd/%c" KERNEL=="rbd[0-9]*", ENV{DEVTYPE}=="partition", PROGRAM="/usr/bin/ceph-rbdnamer %k", SYMLINK+="rbd/%c-part%n"# This is a placeholder, uncomment and edit as necessary #KERNEL=="rbd[0-9]*", ENV{DEVTYPE}=="disk", ACTION=="add|change", ATTR{bdi/read_ahead_kb}="128"
这个文件用于定义udev规则,以自动配置Ceph RBD(块设备)的名称和符号链接。
- 第一行定义了一个udev规则,当内核设备名称以"rbd"开头,并且设备类型为"disk"时,将执行以下操作:
- PROGRAM:定义了一个执行"/usr/bin/ceph-rbdnamer %k"命令的程序。其中,%k表示内核设备名称。
- SYMLINK:定义了一个符号链接,其名称是"rbd/%c"。其中,%c表示内核设备名称。
- 第二行定义了一个udev规则,当内核设备名称以"rbd"开头,并且设备类型为"partition"时,将执行以下操作:
- PROGRAM:定义了一个执行"/usr/bin/ceph-rbdnamer %k"命令的程序。其中,%k表示内核设备名称。
- SYMLINK:定义了一个符号链接,其名称是"rbd/%c-part%n"。其中,%c表示内核设备名称,%n表示分区编号。
- 注释掉的一行是另一个udev规则,当内核设备名称以"rbd"开头,并且设备类型为"disk"或"partition"时,将执行以下操作:
- ACTION:定义了当设备添加或更改时执行操作。
- ATTR{bdi/read_ahead_kb}:定义了一个名为"bdi/read_ahead_kb"的属性,其值为"128"。
- 第一行定义了一个udev规则,当内核设备名称以"rbd"开头,并且设备类型为"disk"时,将执行以下操作:
-
【src】
:功能模块的源代码 -
ceph.spec.in:Ceph打包的spec文件
-
CMakeLists.txt:CMake工具使用的描述文件
-
CodingStyle:Ceph的代码编写规范
src目录
-
【arch】:检测CPU架构和指令集特性
-
【auth】:授权模块,实现了三方认知机制。
-
【boost】:boost库,Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发、维护。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。
-
【ceph-volume】:
-
【client】:client模块,实现了用户态的CephFS客户端
-
【common】:通用模块,包含各类共有机制的实现,例如线程池、管理端口、节流阀等
-
【doc】:关于代码的一些说明文档
-
【global】:全局模块,主要是声明和初始化各类全局变量(全局上下文)、构建驻留进程、信号处理等。
-
【googletest】:googletest测试框架
-
【crush】:Crush模块,Ceph的数据分布算法
-
【include】:头文件,包含各种基本类型的定义,简单通用功能等
-
【json_spirit】:外部项目json_spirit
-
【kv】:四种KV store的调用接口
-
【librados】:rados库模块的代码
-
【librdb】:librbd库模块的代码
-
【log】:日志模块,主要负责记录本地log信息(默认/var/log/ceph/目录)
-
【mds】:mds模块
-
【messages】:消息模块,定义了Ceph各节点之间消息通讯中用到的消息类型。
-
【mgr】:mgr模块
-
【mon】:mon模块
-
【mount】:mount模块
-
【msg】:消息通讯模块,包括用于定义通讯功能的抽象类Messenger以及目前的实现SimpleMessager
-
【os】:对象(Object Store)模块,用于实现本地的对象存储功能,
-
【osd】:osd模块
-
【osdc】:OSD客户端(OSD Client),封装了各类访问OSD的方法。
-
【perfglue】:与性能优化相关的源代码
-
【pybind】:python的包装器
-
【rgw】:rgw模块
-
【rocksdb】:外部项目rocksdb模块
-
【script】:各种python脚本
-
【spdk】:spdk模块
-
【test】:单元测试
-
【tools】:各类工具
-
【zstd】:数据压缩模块
-
ceph_fuse.cc:工具ceph_fuse
-
ceph_mds.cc:驻留程序mds
-
ceph_mgr.cc:驻留程序mgr
-
ceph_mon.cc:驻留程序mon
-
ceph_osd.cc:驻留程序osd
-
ceph_syn.cc:工具ceph_syn
-
krdb.cc:kernel rdb库
-
libcephfs.cc:cephfs库
-
sample.ceph.conf:配置文件样例
src整体可分为三层:
-
Base
基础层包含了与业务无关的各类模块,例如对数值类型的定义、线程池、序列化等。
-
【include】:头文件,包含各种基本类型的定义,简单通用功能等。
-
【common】:共有模块,包含各类共有机制的实现,例如线程池、管理端口、节流阀等。
-
【log】:日志模块,主要负责记录本地log信息(默认/var/log/ceph/目录)
-
【global】:全局模块,主要是声明和初始化各类全局变量(全局上下文)、构建驻留进程、信号处理等。
-
【tracing】:Ceph tracing模块,目前支持使用lttng,可以在该目录下定义lttng的tracepoint。
-
-
Component
组件层是为实现各项业务提供的功能组件,例如消息通讯、认证授权、数据分布算法等。
-
【crush】:Crush模块,Ceph的数据分布算法 。其中CrushCompiler.cc主要负责对crushtool命令传入的crushmap.txt进行compile和parse(parse_tunable、parse_device、parse_bucket_type、parse_bucket、parse_rule),拿parse rule来说,解析后会通过CrushWrapper.h中的add_rule调用builder.cc的crush_add_rule实现rule的添加。总的来说crush.h 中定义了crush_map的结构和四种bucket类型,builder.c文件定义了crushmap中关于rule、bucket的增删改查操作。mapper定义了crushmap中的step、choose操作,而hash.c中定义了crush中使用的rjenkins算法。
-
【os】:对象存储(Object Store)模块,用于实现本地的对象存储功能,目前包括:bluestore、filestore、kstore、memstore;其中*store的基类为ObjectStore,定义在ObjectStore.h中。常用的是FileStore,定义在filestore目录,而Ceph为了解决性能问题,目前正在全力开发bluestore。这里先主要关注一下FileStore,在FileStore.h中主要定义了FileStore和FileStoreBackend两个类,其中FileStore中定义了Op的操作模型(OpWQ、OpSequencer)和transaction的操作模型,它继承自JournalingObjectStore类。而FileStoreBackend类定义了FileStore获取后端具体文件系统的一些操作。
-
【auth】:授权模块,实现了三方认知机制。
-
【msg】:消息通讯模块, OSD使用msg模块进行网络通讯,包括监听客户端的IO,与其它osd收发消息,以及与mon进行通讯等。该目录下包括用于定义通讯功能的抽象类Messenger以及目前的实现SimpleMessager、AsyncMessenger、XIO。
-
【messages】:消息模块,定义了Ceph各节点之间消息通讯中用到的消息类型。
-
【osdc】:OSD客户端(OSD Client),主要包括Objecter、ObjectCacher、Striper、Filer和Journaler。Objecter主要是将request封装成对应的Ops、计算出request需要发送的OSD并且以message的方式将Op发送出去。ObjectCacher是client端的Cache层。Stripper是将一个块设备映射成object,而Filer是把file的range映射成object。Journaler主要是用于MDS的
-
【kv】:定义了keyvaluestore的后端存储实现。
-
【cls】:针对第三方插件的支持。
-
-
SubSystem
子系统层即Ceph中各个功能节点,包括:
-
【mon】:Monitor作为Ceph集群状态管理者管理MonMap、PGMap和OSDMap,其主要由各种Monitor组件组成,并使用Paxos协议实现Mon之间数据同步来保证数据一致性,通过quorum协议来保证Mon之间的高可用。
- AuthMonitor、LogMonitor、MDSMonitor、MonmapMonitor、OSDMonitor、PGMonitor、HealthMonitor
- MonMap、PGMap、OSDMap
- MonClient、MonCommands
- Paxos、PaxosService、QuorumService
- ConfigKeyService
- MonitorDBStore
-
【osd】:定义了后端OSD、PG相关的类和处理逻辑。 在OSD模块中,最核心、也是实际处理IO请求和故障恢复的模块类是PG。 PG是一个对象的集合,包含对象名称的哈希值与PG的ID相符的所有对象。而在Ceph的软件设计中,PG是osd中处理IO的类,即属于某一个PG的对象的请求,全部由该对象对应的PG类的实例进行处理。 相对于PG,OSD实际扮演了一个服务者的角色,即为PG提供了以下服务:1)通过调用os模块提供本地存储服务;2)通过调用msg模块提供消息通讯服务;3)通过提供线程池提供计算服务。 可以将OSD理解为PG的运行环境。PG“生活”在某一个OSD中,也可能由于系统的变化,而迁移到另一个OSD中,这一过程实际也就是数据迁移的过程。
- OSD、OSDService、OSDMap
- PG、PGBackend、ReplicatedBackend、PGLog
- ECBackend、ECTransaction
- HitSet
-
【mds】:MDS定义了维护了CephFS中的元数据,包括文件系统的树形结构、文件的属性、访问控制信息等,这些数据都是存在MDS节点的内存中,而真正的数据是存储在Rados里的。
- MDSDaemon、MDSRank、MDSMap、Beacon、MDCache、MDBalancer
- CDir、CDentry、CInode
- MDSTable、InoTable
-
【client】:Client主要定义了CephFS client端的代码。
-
【rbd】:实现包括两部分:krbd(kernel版的rbd,源码在drivers/block/rbd.c)和librbd。
-
【rgw】:实现了rgw的功能,rgw的主要作用是协议转换,即把HTTP协议的请求转化为RGW Object再转换为Rados Object,交由Rados处理。
-
【tools】:Ceph中的各种工具的实现:cephfs、rados、rbd、rbd-nbd、ceph-authtool、ceph-conf、ceph-kvstore-tool、ceph-monstore-tool、ceph-objectstore-tool、crushtool、monmaptool、osdmaptool
-
【librados】:librados实现了rados层的接口,其中几个重要的数据结构有Rados、RadosClient、IoCtx、IoCtxImpl。IoCtx(include/rados/librados.hpp)是Rados I/O的一个上下文,其定义了大部分的I/O接口如read、write等
-
参考
-
https://www.cnblogs.com/wangbin/p/10689169.html
-
https://blog.csdn.net/don_chiang709/article/details/99289441