天天看點

Ceph 心得分享

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

Ceph 心得分享

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 設計思想

大前提是基于的對象尋址機制,流程圖如下

Ceph 心得分享

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
Ceph 心得分享

對象存儲的寫入流程

以 3 副本的例子畫圖介紹

Ceph 心得分享

寫流程解讀(資料副本強一緻性)

  • 某個 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

繼續閱讀