Ceph
ceph :統一開、分布式的雲存儲
統一指的是 ceph 在業内同 openstack 、swift 一樣可以當作 塊存儲、檔案存儲、對象存儲來使用。并自帶了分布式的特性,保證了生産業務的高可用。其主要核心高頻的使用點就是 Ceph 的塊存儲以及對象存儲,我們逐一介紹。
塊存儲特性
- 通過 ceph clients 使用塊裝置
- 精簡配置
- 動态擴容
- 快照、克隆
- 寫實拷貝技術
- caching
- RBD 驅動已經內建到 Linux 核心中
- 支援計算子產品 kvm Qemu and libvirt
- 支援虛拟和實體伺服器
- 支援 format-1 和 format-2 兩種類型
對象存儲
不能直接當問檔案系統使用,隻能通過 API 通路,面向 restfull 的 API 或者第三方的指令行,目前相容了。
RESTful S3、RESTful Swift-compatible API、interfaces
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLjljZjVGZ4MmNlFGNmNTNyYTOlFzM5QTM3EWMlNmNhdzLc12bj5ycj5Wd5lGbh5SdvtWYpp2ZuFGa61ibj1ycz9mLn1WatITY0F2Lc9CX6MHc0RHaiojIsJye.png)
Ceph 塊裝置基本操作
以下操作是在 Ubuntu 系統執行
安裝 ceph 用戶端
ceph-deploy install ceph-client 或者 apt-get install ceph
建立塊裝置
rbd create {image-name} --size {mebytes} --pool {pool-name}
列出塊裝置
rbd ls {poolname}
檢索塊資訊
rbd --iamge {iamge-name} info
更改塊大小
rbd resize --image {image-name} --size {mebytes}
删除塊裝置
rbd rm {image-name}
對象存儲的關鍵組建
Ceph RADOS 組成
1、OSD,負責存儲所有 objects 資料
2、Monitors 儲存叢集中所有 OSD 狀态資訊,以及負責管理 Cluster Map ,其中 Cluster Map 是整個 RADOS 系統的關鍵資料結構,管理叢集中所有的成員、關系、屬性 等資訊以及資料的分發。多 Monitors 時,使用 paxos 算法來選擇 leader ,避免單點故障;
RADOS
可靠的,獨立自主的,分布式對象存儲
- 地位 cepth 存儲叢集的基石
- 功能 存儲資料,維護資料的一緻性、可靠性
- 執行政策 資料複制、故障檢測和恢複、以及跨叢集節點的資料遷移和重平衡等
OSD 底層儲存設備
- 資料存儲
- 資料複制
- 資料回填(backfilling 一般觸發在有新的 osd 加入時)
- 重平衡(觸發在新 OSD 加入 crush map 時)
- 心跳、OSD 需要和與其共同承載同一個 PG 的其他 OSD 交換資訊以确定各自是否工作正常,是否需要進行維護操作。
RADOS 設計思想
大前提是基于的對象尋址機制,流程圖如下
RADOS 尋址流程解讀
映射、映射、再映射...
File -> object 映射:
将使用者态的 file ,映射成 RADOS 能夠處理的 object ,是指以統一大小進行切塊,并配置設定 ID ,便于管理以及友善對多個 object 并行處理。
Object -> PG 映射:
利用靜态哈希函數得到 objectID 的僞随機值,再 “位與” mask 上使得每個 Object 擷取屬于自己的 PG;
PG -》 OSD 映射
将 PG 映射到資料的實際存儲單元 OSD,RADOS 利用 crush 算法,由 pgid 得到一組 n 個 OSD ,再由 OSD deaemon 執行映射到本地 object 在本地系統中存儲,通路、雲資料維護等操作。
特别注意的是:該次映射功能性特别強;直接收到 cluster map 以及 rule 的影響,隻有在 cluster map 和存儲政策均不發生改變時,PG 和 OSD 映射關系才固定。
計算 PG 的 ID 示例
- client 輸入 pool ID 和對象 ID (如 pool = 'chenlu',object-id = ‘sanqian')
- crush 獲得對象 ID 對其 hash
- crush 計算 osd 個數 hash 取模擷取得 PG 的 ID
- crush 擷取已命名 pool 的 ID (如 chenlu=4)
- crush 預先考慮到 pool id 相同的 pgid
對象存儲的寫入流程
以 3 副本的例子畫圖介紹
寫流程解讀(資料副本強一緻性)
- 某個 client 需要向 Ceph 叢集寫入 file 時,将 file 分割為 N 個 object 之後,确定存儲該 N 個 Object 的 N 組 OSD 。假設副本書為 3 ,下面取其中一個 object 以及對應的一組 OSD 來說明,這一組中 3 個 OSD 具有各自不同的序号,第一序号 OSD 為這一組的 Primary OSD ,而後兩個則一次是 Secondary OSD 和 tertiary OSD
- 确定三個 OSD 之後,client 直接與 Primary OSD 通信,發起寫入操作,primary OSD 收到請求後,分别向 Secondary OSD 和 Tertiary OSD 發起寫入操作做。當 Secondary OSD 和 Tertiary OSD 各自完成寫入操作後,将分别向 Primary OSD 發送确認資訊。當 Primary OSD 确信其他兩個 OSD 的寫入完成後,則自己也完成資料寫入,并向 client 确認 object 寫入操作完成。
- 采用這樣的寫入流程,本質上是為了保證寫入過程中的可靠性,盡可能避免造成資料丢失。
對象存儲的 CRUSH 機制
CRUSH 是整個 object 落盤配置設定的核心
CRUSH 算法根據每個裝置的權重經可能機率平均地配置設定資料,分布算法是由叢集可用存儲資源以及其邏輯單元的 map 控制的,這個 map 的描述類似于一個大型伺服器的描述:伺服器由一系列的機櫃組成,機櫃裝滿伺服器,伺服器裝滿磁盤,資料配置設定的政策是由定位規則來定義的,定位規則指定了叢集中将儲存多少個副本,以及資料副本的放置有什麼限制。
例如,可以制定資料有三個副本,這三個副本必須放置在不同的機櫃中,是的三個資料副本不公用一個實體電路。
例如,一個機架上有 20 個伺服器,每個伺服器有 2 個 disk ,一排有 8 個機架,有 10 排;擔心其中一個伺服器當機,可以設定 crush map ,確定這個伺服器熵的資料至少複制到其他 2 個伺服器上;擔心其中一個機架上斷電,確定副本存儲在其他機架上,獨立于主複制。
Ceph 叢集容災
1、primary 從其他 osd 收集 pg log ,獲得一份完整、全序的操作表,并讓其他 osd 認同這份操作表,該過程叫做 peering;在該過程中,primary osd 負責協調 peering 過程,若 primary out 或 down,則 second osd來充當 primary osd;
2、peering 之後進入 active+ recovering 狀态;遷移以及同步 object 到所有副本上,確定 object 副本為 N
3、擴容的形态分為 scale up 和 scale out