1. Ceph 架構
1.1 Ceph 接口
Ceph 支持三種接口:
- Object:有原生的API,而且也兼容 Swift 和 S3 的 API
- Block:支持精簡配置、快照、克隆
- File:Posix 接口,支持快照
1.2 Ceph 核心組件及概念介紹
- Monitor:一個 Ceph 集群需要多個 Monitor 組成的小集群,它們通過 Paxos 同步數據,用來保存 OSD 的元數據。
- OSD:OSD 全稱 Object Storage Device,也就是負責響應客戶端請求返回具體數據的進程,一個Ceph集群一般有很多個OSD。
- CRUSH:CRUSH 是 Ceph 使用的數據分布算法,類似一致性哈希,讓數據分配到預期的位置。
- PG:PG全稱 Placement Groups,是一個邏輯的概念,一個PG 包含多個 OSD 。引入 PG 這一層其實是為了更好的分配數據和定位數據。
- Object:Ceph 最底層的存儲單元是 Object對象,每個 Object 包含元數據和原始數據。
- RADOS:實現數據分配、Failover 等集群操作。
- Libradio:Libradio 是RADOS提供庫,因為 RADOS 是協議,很難直接訪問,因此上層的 RBD、RGW和CephFS都是通過libradios訪問的,目前提供 PHP、Ruby、Java、Python、C 和 C++的支持。
- MDS:MDS全稱Ceph Metadata Server,是CephFS服務依賴的元數據服務。
- RBD:RBD全稱 RADOS Block Device,是 Ceph 對外提供的塊設備服務。
- RGW:RGW全稱RADOS gateway,是Ceph對外提供的對象存儲服務,接口與S3和Swift兼容。
- CephFS:CephFS全稱Ceph File System,是Ceph對外提供的文件系統服務。
2. 三種存儲類型
塊設備:主要是將裸磁盤空間映射給主機使用,類似於SAN存儲,使用場景主要是文件存儲,日志存儲,虛擬化鏡像文件等。
文件存儲:典型代表:FTP 、NFS 為了克服塊存儲無法共享的問題,所以有了文件存儲。
對象存儲:具備塊存儲的讀寫高速和文件存儲的共享等特性並且通過 Restful API 訪問,通常適合圖片、流媒體存儲。
2.1 Ceph IO流程及數據分布
步驟:
- client 創建cluster handler。
- client 讀取配置文件。
- client 連接上monitor,獲取集群map信息。
- client 讀寫io 根據crushmap 算法請求對應的主osd數據節點。
- 主osd數據節點同時寫入另外兩個副本節點數據。
- 等待主節點以及另外兩個副本節點寫完數據狀態。
- 主節點及副本節點寫入狀態都成功后,返回給client,io寫入完成。
新主IO流程圖
說明:
如果新加入的OSD1取代了原有的 OSD4成為 Primary OSD, 由於 OSD1 上未創建 PG , 不存在數據,那么 PG 上的 I/O 無法進行,怎樣工作的呢?
步驟:
(1)client連接monitor獲取集群map信息。
(2)同時新主osd1由於沒有pg數據會主動上報monitor告知讓osd2臨時接替為主。
(3)臨時主osd2會把數據全量同步給新主osd1。
(4)client IO讀寫直接連接臨時主osd2進行讀寫。
(5)osd2收到讀寫io,同時寫入另外兩副本節點。
(6)等待osd2以及另外兩副本寫入成功。
(7)osd2三份數據都寫入成功返回給client, 此時client io讀寫完畢。
(8)如果osd1數據同步完畢,臨時主osd2會交出主角色。
(9)osd1成為主節點,osd2變成副本。
3. Ceph 如何存取數據
這里有一篇文章寫的通俗易懂:http://www.xuxiaopang.com/2016/11/08/easy-ceph-CRUSH/