1 简介
该代码架构基于版本10.0.5整理,先整理根目录里的代码,再整理出src目录的架构。

2 代码架构
2.1 Ceph源码根目录
Ceph的根目录下包含了一些文件夹和若干编译、代码格式相关的文件。

[admin]:架设Document服务器,包括依赖内容并介绍修改doc的流程。

[bin]:目前只包含一个在当前目录针对所有内容生产tar包的脚本

[cmake]:Ceph对cmake的支持。CMake 是一个跨平台的自动化安装编译系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig 更简洁的语法。

[debian]:用于制作debian(Ubuntu)安装包的相关脚本和文件。

[doc]:Ceph文档系统的源码,Ceph的文档和manpages都使用rst格式,该目录的内容将通过doc web服务器导出,最终效果如:http://docs.ceph.com/docs/master/

[etc]:Ceph的etc文件

[examples]:一些Ceph开发、命令使用、trace使用的例子。

[qa]:各个模块的功能测试(测试脚本和测试代码)

[src]:Ceph各个模块的源码目录

[systemd]:Ceph对于systemd的支持目录

[udev]:Ceph的udev规则

AUTHORS:记录了Ceph的Maintainer、CTL(Component Technical Leads)以及Contributors信息。

do_autogen.sh/autogen.sh/configure.ac:生成configure文件

run-cmake-check.sh :使用cmake编译ceph,适用于首次自动化编译,自动安装依赖包,需要运行用户有安装包的权限。
run-make-check.sh :使用make编译ceph,适用于首次自动化编译,自动安装依赖包,需要运行用户有安装包的权限。

Makefile.am:用于生成Makefile文件

ceph.spec.in:Ceph打包的spec文件

CMakeLists.txt:CMake工具使用的描述文件

CodingStyle:Ceph的代码编写规范

2.2 Ceph src目录内容
src目录包含了Ceph主要模块的源码,整体上可以分为三层,如下图所示:

1)Base

基础层包含了与业务无关的各类模块,例如对数值类型的定义、线程池、序列化等。

[include]:头文件,包含各种基本类型的定义,简单通用功能等。

[common]:共有模块,包含各类共有机制的实现,例如线程池、管理端口、节流阀等。

[log]:日志模块,主要负责记录本地log信息(默认/var/log/ceph/目录)

[global]:全局模块,主要是声明和初始化各类全局变量(全局上下文)、构建驻留进程、信号处理等。

[tracing]:Ceph tracing模块,目前支持使用lttng,可以在该目录下定义lttng的tracepoint。

2)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]:针对第三方插件的支持。

3)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
DataHealthService、HealthService、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模块可以从一下类开始,稍后会整理出各类的作用以及相互之间的关系。

OSD、OSDService、OSDMap
PG、PGBackend、ReplicatedPG、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等;

从GitHub上Clone的Ceph项目,其目录下主要文件夹和文件的内容为: 
1 根目录 
[src]:各功能某块的源代码 
[qa]:各个模块的功能测试(测试脚本和测试代码) 
[wireshark]:#wireshark的ceph插件。 
[admin]:管理工具,用于架设文档服务器等 
[debian]:用于制作debian(Ubuntu)安装包的相关脚本和文件

[doc]:用于生成项目文档,生成结果参考http://ceph.com/docs/master/ 
[man]:ceph各命令行工具的man文件 
configure.ac:用于生成configure的脚本 
Makefile.am:用于生成Makefile的脚本 
autogen.sh:负责生成configure。 
do_autogen.sh:生成configure的脚本,实际上通过调用autogen.sh实现 
ceph.spec.in:RPM包制作文件

2 src目录

[include]:头文件,包含各种基本类型的定义,简单通用功能等。 
[common]:共有模块,包含各类共有机制的实现,例如线程池、管理端口、节流阀等。 
[log]:日志模块,主要负责记录本地log信息(默认/var/log/ceph/目录) 
[global]:全局模块,主要是声明和初始化各类全局变量(全局上下文)、构建驻留进程、信号处理等。 
[auth]:授权模块,实现了三方认知机制。 
[crush]:Crush模块,Ceph的数据分布算法 
[msg]:消息通讯模块,包括用于定义通讯功能的抽象类Messenger以及目前的实现SimpleMessager 
[messages]:消息模块,定义了Ceph各节点之间消息通讯中用到的消息类型。 
[os]:对象(Object Store)模块,用于实现本地的对象存储功能, 
[osdc]:OSD客户端(OSD Client),封装了各类访问OSD的方法。 
[mon]:mon模块 
[osd]:osd部分 
[mds]:mds模块 
[rgw]:rgw模块的 
[librados]:rados库模块的代码 
[librdb]:libbd库模块的代码 
[client]:client模块,实现了用户态的CephFS客户端 
[mount]:mount模块 
[tools]:各类工具 
[test]:单元测试 
[perfglue]:与性能优化相关的源代码 
[json_spirit]:外部项目json_spirit 
[leveldb]:外部项目leveldb from google 
[gtest]:gtest单元测试框架 
[doc]:关于代码的一些说明文档 
[bash_completion]:部分bash脚本的实现 
[pybind]:python的包装器 
[script]:各种python脚本 
[upstart]:各种配置文件

ceph_mds.cc:驻留程序mds 
ceph_mon.cc:驻留程序mon 
ceph_osd.cc:驻留程序osd 
libcephfs.cc:cephfs库 
librdb.cc:rdb库 
ceph_authtool.cc:工具ceph_authtool 
ceph_conf.cc:工具ceph_conf 
ceph_fuse.cc:工具ceph_fuse 
ceph_syn.cc:工具ceph_syn 
cephfs.cc:工具cephfs 
crushtool.cc:工具crushtool 
dupstore.cc:工具dupstore 
librados-config.cc:rados库配置工具 
monmaptool.cc:工具monmap 
osdmaptool.cc:工具osdmap 
psim.cc:工具psim 
rados.cc:工具rados 
rdb.cc:工具rdb 
rados_export.cc:rados工具相关类 
rados_import.cc:rados工具相关类 
rados_sync.cc:rados工具相关类 
rados_sync.h:rados工具相关类 
sample.ceph.conf:配置文件样例 
ceph.conf.twoosds:配置文件样例 
Makefile.am:makefile的源文件 
valgrind.supp:内存检查工具valgrind的配置文件 
init-ceph.in:启动和停止ceph的脚本 
mkcephfs.in:cephfs部署脚本

cept源代码目录结构详解_知识树(转)的更多相关文章

  1. Linux内核源代码目录结构详解

    http://blog.csdn.net/u013014440/article/details/44024207

  2. Linux文件系统的目录结构详解

    Linux文件系统的目录结构详解   一.前 言 文章对Linux下所有目录一一说明,对比较重要的目录加以重点解说,以帮助初学者熟练掌握Linux的目录结构. 二.目 录 1.什么是文件系统 2.文件 ...

  3. Angular-cli新建项目目录结构详解

    Angular-cli新建项目目录结构详解 在上一篇博客中我们已经通过Angular CLI命令行工具创建出来一个全新的Angular项目,要想写项目,首先我们要先搞清楚项目的目录结构是怎样的,每个文 ...

  4. [转帖]Tomcat目录结构详解

    Tomcat目录结构详解 https://www.cnblogs.com/veggiegfei/p/8474484.html 之前应该是知道一点 但是没有这么系统 感谢原作者的描述. 1.bin: 该 ...

  5. Linux目录结构(目录结构详解是重点)

    1.Linux目录与Windows目录对比 1.Windows目录结构 2.Linux目录结构 深刻理解Linux 树状文件目录是非常重要的,只有记住他们,你才能在命令行中任意切换,想去哪里去哪里 2 ...

  6. Nuxt.js学习(二) --- Nuxt目录结构详解、Nuxt常用配置项、Nuxt路由配置和参数传递

    [TOC] 1.Nuxt目录结构详解 Nuxt项目文件目录结构 |-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build |-- assets // 用于组织未编译的静态资源入LE ...

  7. Linux 目录结构详解

    Linux目录详解 Linux目录详解(RHEL5.4) 由于linux是开放源代码,各大公司和团体根据linux的核心代码做各自的操作,编程.这样就造成在根下的目录的不同.这样就造成个人不能使用他人 ...

  8. Vue脚手架(vue-cli)搭建和目录结构详解

    一.环境搭建 1.安装node.npm.webpack,不多说 2.安装vue-cli脚手架构建工具,打开命令行工具输入:npm install vue-cli -g,安装完成之后输入 vue -V( ...

  9. Linux中的文件和目录结构详解

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

随机推荐

  1. MySQL Execution Plan--IN子查询包含超多值引发的查询异常1

    ======================================================================= SQL语句: SELECT wave_no, SUM(I ...

  2. 18.7 修改IP地址

    ifconfig   #查看ip sudo ifconfig eth3 10.3.10.232      #修改ip

  3. httpd日志格式

    日志的缺省格式有如下几种: LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{U ...

  4. 精读《C++ primer》学习笔记(第四至六章)

    第四章: 重要知识点: 4.1 基础 函数调用是一种特殊的运算符,它对运算对象的数量没有限制. 重载运算符时可以定义运算对象的类型,返回值类型,但运算对象的个数,运算符的优先级,结合律无法改变. 当一 ...

  5. 提取配置文件中无注释的内容方法--findstr

    findstr /v /r # nginx.conf C:\Users\Liang>findstr /?在文件中寻找字符串. FINDSTR [/B] [/E] [/L] [/R] [/S] [ ...

  6. windows下的拷贝利器robocopy

    robocopy xxcopy http://www.cnblogs.com/zhanglei1371/p/6724167.html [转载]robocopy的用法 经常进行文件管理操作的朋友们,不满 ...

  7. centos7安装mysql,以及设置root密码

    1.首先进入mysql官网的下载-社区https://dev.mysql.com/downloads/ 2.点击下载后,切换版本5.7(这里的版本对于rpm没有作用),然后在新的页面中选择操作系统 3 ...

  8. SQL FOR JSON PATH 返回 json

    --直接返回 age FOR JSON PATH --返回值 [{"name":"张学友","age":60}] select c1, c2 ...

  9. 怎么精确控制solidworks里面的表格的位置

    手工移动是不可能的,总是有点误差,虽然有主动捕捉的功能. public void SetTablePosition(TableAnnotation table, double x, double y) ...

  10. .net core2.2

    GetCurrentDirectory returns the worker directory of the process started by IIS rather than the app's ...