1 簡介
該代碼架構基於版本10.0.5整理,先整理根目錄裏的代碼,再整理出src目錄的架構。node
2 代碼架構
2.1 Ceph源碼根目錄
Ceph的根目錄下包含了一些文件夾和若干編譯、代碼格式相關的文件。python
[admin]:架設Document服務器,包括依賴內容並介紹修改doc的流程。web
[bin]:目前只包含一個在當前目錄針對全部內容生產tar包的腳本算法
[cmake]:Ceph對cmake的支持。CMake 是一個跨平臺的自動化安裝編譯系統,它使用一個名爲 CMakeLists.txt 的文件來描述構建過程,能夠產生標準的構建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 須要手工編寫,也能夠經過編寫腳本進行半自動的生成。CMake 提供了比 autoconfig 更簡潔的語法。json
[debian]:用於製做debian(Ubuntu)安裝包的相關腳本和文件。後端
[doc]:Ceph文檔系統的源碼,Ceph的文檔和manpages都使用rst格式,該目錄的內容將經過doc web服務器導出,最終效果如:http://docs.ceph.com/docs/master/性能優化
[etc]:Ceph的etc文件bash
[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包製做文件
[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部署腳本