Ceph獨一無二地統一的系統提供了對象存儲、塊存儲和文件存儲功能。Ceph存儲集羣由幾個不一樣的軟件守護進程組成(比較重要的兩個是MON和OSD),每一個守護進程負責Ceph的一個獨特功能並將值添加到相應的組件中。
算法
Ceph術語簡介:服務器
RADOS是Ceph存儲系統的核心,也稱爲Ceph存儲集羣。Ceph的數據訪問方法(如RBD、CephFS、RADOSGW、librados)的全部操做都是在RADOS層之上構建的。當Ceph集羣接收到來自客戶端的寫請求時,CRUSH算法首先計算出存儲位置,而後這些信息傳遞到RADOS層進行進一步處理。RADOS以小對象的形式將數據分發到集羣內的全部節點,最後將這些對象存儲在OSD中。當配置的複製數大於1時,RADOS負責數據的可靠性,它複製對象,建立副本並將它們存儲在不一樣的故障區域中。
RADOS包含兩個核心組件:OSD和MON。restful
OSD是Ceph存儲集羣中最重要的一個基礎組件,它負責將實際的數據以對象的形式
存儲在每個集羣節點的物理磁盤中。對於任何讀寫操做,客戶端首先向MON請求集羣的map,而後客戶端就能夠直接和OSD進行I/O操做。
一個Ceph集羣包含多個OSD。一個典型的Ceph集羣部署方案會爲集羣節點上的每一個物理磁盤建立一個OSD守護進程,這是推薦的作法。
OSD上的每一個對象都有一個主副本和幾個輔副本,輔副本分散在其餘OSD。一個OSD對於一些對象是主副本,同時對於其餘對象多是輔副本,存放輔副本的OSD手主副本OSD控制,若是主副本OSD異常(或者對應的磁盤故障),輔副本OSD能夠成爲主副本OSD。
OSD由一個已經存在Linux文件系統的物理磁盤驅動器和OSD服務組成。Ceph推薦OSD使用的文件系統是XFS。OSD的全部寫都是先到日誌,再到存儲。
架構
MON負責監控整個集羣的健康情況。它以守護進程的形式存在,一個MON爲每個組件維護一個獨立的map,如OSD、MON、PG、CRUSH和MDS map。這些map統稱爲集羣map。MON不爲客戶端存儲和提供數據,它爲客戶端以及集羣內其餘節點提供更新集羣map的服務。客戶端和集羣內其餘節點按期與MON確認本身持有的是不是集羣最新的map。一個Ceph集羣一般包含多個MON節點,可是同一時間只有一個領導者MON。分佈式
librados是一個本地的C語言庫,經過它應用程序能夠直接和RADOS通訊,提升性能。函數
RBD對外提供塊存儲,能夠被映射、格式化進而像其餘磁盤同樣掛載到服務器。
性能
Linux內核RBD(KRBD)經過librados映射Ceph塊設備,而後RADOS將Ceph塊設備的對象以分佈式模式存儲在集羣中。一旦Ceph塊設備映射到Linux主機,它也能夠看成裸分區或標記爲文件系統進行掛載。RBD利用librbd庫來獲取RADOS的好處並提供高可靠、分佈式、基於對象的塊存儲。當客戶端向RBD寫入數據時,librbd庫將數據塊映射到對象進而存儲在Ceph集羣中,刪除這些數據對象,並跨集羣複製這些對象,從而提供更好的性能和可靠性。spa
RGW,Ceph對象網關,也稱作RADOS網關,它是一個代理,能夠將HTTP請求轉換爲RADOS,也能夠把RADOS轉換爲HTTP請求,從而提供restful接口,兼容S3和Swift。Ceph對象網關使用Ceph對象網關守護進程(RGW)與librgw、librados交互。Ceph對象網關支持三類接口:S三、Swift、管理API(經過restful接口管理Ceph集羣)。RGW有本身的用戶管理體系。
插件
MDS是元數據服務器,跟蹤文件層次結構並存儲元數據。只有CephFS才須要。代理
CephFS在RADOS層之上提供了一個兼容POSIX的文件系統。它使用MDS做爲守護進程,負責管理其元數據並將它和其餘數據分開。CephFS使用cephfuse模塊(FUSE)擴展其在用戶空間文件系統方面的支持(就是將CephFS掛載到客戶端機器上)。它還容許直接與應用程序交互,使用libcephfs庫直接訪問RADOS集羣。
Ceph管理器軟件,能夠收集整個集羣的全部狀態。有儀表板插件。
一個對象一般包含綁定在一塊兒的數據和元數據,而且用一個全局惟一的標識符標識。這個惟一的標識符確保在整個存儲集羣中沒有其餘對象使用相同的對象ID,保證對象惟一性。基於文件的存儲中,文件大小是有限制的,與此不一樣的是,對象的大小是能夠隨着大小可變的元數據而變得很大。對象不使用一個目錄層次結構或樹結構來存儲,相反,它存儲在一個包含數十億對象且沒有任何複雜性的線性地址空間中。對象能夠存儲在本地,也能夠存放在地理上分開的線性地址空間中,也就是說,在一個連續的存儲空間中。任何應用程序均可以基於對象ID經過調用restful API從對象中獲取數據。這個URL能夠以一樣的方式工做在因特網上,一個對象ID做爲一個惟一的指針指向對象。這些對象都以複製的方式存儲在OSD中,由於能提供高可用性。
對於Ceph集羣的一次讀寫操做,客戶端首先聯繫MON獲取一個集羣map副本,而後使用對象和池名/ID將數據轉換爲對象。接着將對象和PG數一塊兒通過散列來生成其在Ceph池中最終存放的那一個PG。而後前面計算好的PG通過CRUSH查找來肯定存儲或獲取數據所需的主OSD的位置。獲得準確的OSD ID以後,客戶端直接聯繫這個OSD來存取數據。全部這些計算操做都由客戶端來執行,所以它不會影響Ceph集羣的性能。一旦數據被寫入主OSD,主OSD所在節點將執行CRUSH查找輔助PG和OSD的位置來實現數據複製,進而實現高可用。
簡單地說,首先基於池ID將對象名和集羣PG數應用散列函數獲得一個PG ID,而後,針對這個PG ID執行CRUSH查找獲得主OSD和輔助OSD,最後寫入數據。
PG是一組對象地邏輯集合,經過複製它到不一樣的OSD上來提供存儲系統的可靠性。根據Ceph池的複製級別,每一個PG的數據會被複制並分發到Ceph集羣的多個OSD上。能夠將PG當作一個邏輯容器,這個容器包含多個對象,同時這個邏輯容器被映射到多個OSD。
計算正確的PG數對一個Ceph存儲集羣來講是相當重要的一步。PG數計算公式以下:
PG總數 = (OSD總數 * 100) / 最大副本數
Ceph池是一個用來存儲對象的邏輯分區,每一個池都包含必定數量的PG,進而實現把必定數量的對象映射到集羣內部不一樣OSD上的目的。每個池都是交叉分佈在集羣全部節點上的,這樣就能提供足夠的彈性。池能夠經過建立須要的副本數來保障數據的高可用性。
Ceph的池還支持快照功能,咱們可使用ceph osd pool mksnap
命令來給特定的池製做快照。此外,Ceph池還容許咱們爲對象設置全部者和訪問權限。
數據管理始於客戶端向Ceph池中寫數據。一旦客戶端準備寫數據到Ceph池中,數據首先寫入基於池副本數的主OSD中。主OSD再複製相同的數據到每一個輔助OSD中,並等待它們確認寫入完成。只要輔助OSD完成數據寫入,就會發送一個應答信號給主OSD。最後主OSD再返回一個應答信號給客戶端,以確認完成整個寫入操做。