有兩個在磁盤上存儲數據的 Ceph
守護程序:數據庫
Ceph
中的地方。通常而言,每一個 OSD
都由單個存儲設備支持。OSD
還能夠由多種設備組合來支持,例如用於大多數數據的 HDD
和用於某些元數據的 SSD
。羣集中 OSD
的數量一般取決於存儲的數據量,每一個存儲設備的容量以及冗餘(複製或Erasure
)的級別和類型OSD
能夠經過兩種方式管理它們存儲的數據。從 Luminous 12.2.z
版本開始,新的默認(推薦)後端是 BlueStore
。在 Luminous
以前,默認(也是惟一的選項)是 FileStore
後端
BlueStore
是專用於存儲的後端,專門用於管理 Ceph OSD
中的數據。BlueStore
的主要功能包括:安全
BlueStore
構建在裸磁盤設備之上,直接使用原始塊設備或分區RocksDB
的元數據管理:嵌入 RocksDB
的鍵/值數據庫管理內部元數據,例如從對象名稱到磁盤上塊位置的映射BlueStore
的數據和元數據都受到一個或多個校驗和的保護。未經驗證,不會從磁盤讀取任何數據或元數據或將其返回給用戶BlueStore
容許將其內部日誌寫入單獨的高速設備,以提升性能。若是有大量的快速存儲可用,內部元數據也能夠存儲在更快的設備上RBD
和 CephFS
快照依賴於在 BlueStore
中有效實現的寫時複製克隆機制。這將爲常規快照和Erasure Code
(依賴克隆實現高效的兩階段提交)提供高效的 IO
FileStore
是在 Ceph
中存儲對象的傳統方法。它依賴於標準文件系統(建議使用 XFS
)以及鍵/值數據庫(傳統上是 LevelDB
,如今是 RocksDB
)來處理某些元數據bash
FileStore
通過了充分的測試,並在生產中普遍使用,可是因爲其整體設計和對用於存儲對象數據的傳統文件系統的依賴,所以存在許多性能缺陷服務器
FileStore
一般可以在大多數 POSIX
兼容文件系統(包括 btrfs
和 ext4
)上運行,可是咱們僅建議使用 XFS
。btrfs
和 ext4
都有已知的錯誤和缺陷,使用它們可能會致使數據丟失。默認狀況下,全部 Ceph
工具都使用 XFS
當你啓動 Ceph
服務時,初始化過程網絡
將激活一系列在後臺運行的守護程序。一個 Ceph 的存儲集羣上運行三種類型的守護程序:app
Ceph Monitor
Ceph Manager
Ceph OSD
支持 Ceph File System
的 Ceph
存儲集羣至少運行一臺 Ceph Metadata Server
;支持 Ceph Object Storage
的 Ceph
集羣至少運行一個 Gateway
守護程序ide
每一個 Ceph 守護進程,進程和庫都將從如下列出的幾個來源中提取其配置。若是同時存在,則列表後面的源將覆蓋列表前面的源工具
Ceph
進程在啓動時要作的第一件事之一就是解析命令行參數,環境和本地配置文件提供的配置選項。而後,該過程將與監視器羣集聯繫,以檢索整個羣集集中存儲的配置。一旦可得到完整的配置視圖,則將繼續執行守護程序或進程性能
全局配置(global
):global
的配置會影響 Ceph
存儲集羣中的全部守護進程和客戶端
監視器配置(mon
):影響 ceph-mon
,並覆蓋相同設置的 global
管理器配置(mgr
):影響 ceph-mgr
,並覆蓋相同設置的 global
OSD
配置:影響 ceph-osd
,並覆蓋相同設置的 global
元數據服務器配置(mds
):影響 ceph-mds
,並覆蓋相同設置的 global
client
:客戶端配置,影響全部的 Ceph
客戶端(例如,已安裝的 Ceph
文件系統,已安裝的 Ceph
塊設備等)以及 Rados Gateway
守護程序# 查看集羣全部可配置對象 $ ceph config dump # 獲取指定對象的配置信息 $ ceph config get <who> # 例如查看 mon 的配置信息 $ ceph config get mon # 修改指定組件的配置 $ ceph config set <who> <option> <value> # 例如修改配置以容許用戶刪除 pool $ ceph config set mon "mon_allow_pool_delete" true # 查看當前組件的運行時配置信息 $ ceph config show <who> # 例如查看 osd 組件信息 $ ceph config show osd.0 # 將從輸入文件中提取配置文件,並將全部有效選項移至監視器的配置數據庫。監視器沒法識別,無效或沒法控制的任何設置都將在輸出文件中存儲的簡短配置文件中返回 。此命令對於從舊版配置文件過渡到基於集中式監視器的配置頗有用。 $ ceph config assimilate-conf -i <input file> -o <output file> # 查看指定組件的全部選項 $ ceph config show-with-defaults <who> # 例如查看 osd 組件支持的全部選項 $ ceph config show osd.0
當 Ceph
在啓用身份驗證和受權的狀況下運行(默認狀況下啓用)時,您必須指定用戶名和包含指定用戶的私鑰的密鑰環(一般是經過命令行)。若是您未指定用戶名,則 Ceph
將 client.admin
用做默認用戶名。若是您未指定密鑰環,則 Ceph
將經過 keyring
在 Ceph
的設置中尋找密鑰環。例如,若是在不指定用戶或密鑰環的狀況下執行命令:ceph health
$ ceph health # ceph 將解釋以下 $ ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health # 或者, 可使用 CEPH_ARGS 環境變量來避免從新輸入用戶名和密碼
不管 Ceph
客戶端的類型是什麼(例如,塊設備,對象存儲,文件系統,本機 API 等),Ceph
都將全部數據存儲做爲對象在 pool
中。Ceph
用戶必須有權訪問 pool
才能讀取和寫入數據。此外,Ceph
用戶必須具備執行權限才能使用 Ceph
的管理命令
Ceph
用戶具備用戶類型 Type
的概念。出於用戶管理的目的,類型始終爲 client
Ceph
識別用戶分隔形式由用戶類型和用戶 ID
組成:例如,TYPE.ID
,client.admin
,或 client.user1
引入用戶類型的緣由是由於 Ceph
監視器,OSD
和 Metadata Servers
也使用 Cephx
協議,但它們不是客戶端。區分用戶類型有助於區分客戶端用戶和其餘用戶-簡化訪問控制,用戶監控和可追溯性
在使用 Ceph
命令行時,若是指定 --user
或 --id
則可省略用戶類型,若是指定 --name
或 -n
則必須指定類型和名稱
Ceph 存儲羣集用戶
與 Ceph
對象存儲用戶和 Ceph
文件系統用戶不一樣
Ceph 對象網關
使用 Ceph
存儲羣集用戶在網關守護程序和存儲羣集之間進行通訊,可是網關對最終用戶具備本身的用戶管理功能
Ceph 文件系統
使用 POSIX
語義,與 Ceph
文件系統關聯的用戶空間與 Ceph
存儲集羣用戶不一樣
Ceph
使用 caps
來描述受權通過身份驗證的用戶行使監視器,OSD
和 MDS
的功能
caps
能夠根據應用程序標記來限制對池中數據,池中的名稱空間或一組池的訪問。Ceph
管理用戶在建立或更新用戶時設置用戶的 caps
caps
語法格式:
{daemon-type} '{cap-spec}[, {cap-spec} ...]'
監控器受權:
# mon cap 包括 r, w, x 訪問設置 或 profile {name} $ mon 'allow {access-spec} [network {network/prefix}]' $ mon 'profile {name}' # {access-spec} 語法 $ * | all | [r][w][x] # 可選的 [network {network/prefix}] 表示限制受權客戶端網絡來源(例如10.3.0.0/16)
OSD受權:
# OSD cap 包括 r, w, x, class-read, class-write 訪問設置 或 profile {name}; 此外 OSD 還支持 pool 和 namespace 的設置 $ osd 'allow {access-spec} [{match-spec}] [network {network/prefix}]' $ osd 'profile {name} [pool={pool-name} [namespace={namespace-name}]] [network {network/prefix}]' # {access-spec} 語法是如下狀況之一 $ * | all | [r][w][x] [class-read] [class-write] $ class {class name} [{method name}] # {match-spec} 語法是如下狀況之一 $ pool={pool-name} [namespace={namespace-name}] [object_prefix {prefix}] $ [namespace={namespace-name}] tag {application} {key}={value}
Manager 受權:
# mgr cap 包括 r, w, x 訪問設置 或 profile {name} $ mgr 'allow {access-spec} [network {network/prefix}]' $ mgr 'profile {name} [{key1} {match-type} {value1} ...] [network {network/prefix}]' # 還能夠爲特定命令, 內置管理器服務導出的全部命令或特定附加模塊導出的全部命令指定管理器功能 $ mgr 'allow command "{command-prefix}" [with {key1} {match-type} {value1} ...] [network {network/prefix}]' $ mgr 'allow service {service-name} {access-spec} [network {network/prefix}]' $ mgr 'allow module {module-name} [with {key1} {match-type} {value1} ...] {access-spec} [network {network/prefix}]' # {access-spec} 語法 $ * | all | [r][w][x] # {service-name} 語法是如下狀況之一 mgr | osd | pg | py # {match-type} 語法是如下狀況之一 = | prefix | regex
添加用戶會建立一個用戶名和一個祕鑰。用戶的密鑰使用戶能夠經過 Ceph 存儲羣集進行身份驗證。用戶受權使用戶在 ceph-mon
,ceph-osd
或 ceph-mds
上進行讀取,寫入或執行
添加用戶的方式有如下幾種:
ceph auth add
:此命令是添加用戶的規範方法。它將建立用戶,生成祕鑰並添加指點權限ceph auth get-or-creat
:建立用戶並返回用戶名和密鑰。若是用戶已存在,則返回用戶名和密鑰ceph auth get-or-create-key
:建立用戶並返回密鑰。若是用戶已存在,返回密鑰通常狀況下,一個用戶至少須要在 ceph-mon
上具備讀取功能,在 ceph-osd
上具備讀寫功能
示例:
[root@ceph01 ~]# ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool' added key for client.john [root@ceph01 ~]# ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool' [client.paul] key = AQBn5/peFEb0NhAA1PNAW7BNdW98xsIEsSyh1A== [root@ceph01 ~]# ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring [root@ceph01 ~]# cat george.keyring [client.george] key = AQB75/peKljJCBAAmXGwZJHVVGbQ/jFKnHQH/A== [root@ceph01 ~]# ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key [root@ceph01 ~]# cat ringo.key AQCT5/peSuHhJxAAr8sgvdoYO6iQnSr48NG3lA==
# 列出當前集羣中的全部用戶 [root@ceph01 ~]# ceph auth ls installed auth entries: client.admin key: AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ== caps: [mds] allow * caps: [mgr] allow * caps: [mon] allow * caps: [osd] allow * ...... # 查看指定用戶的信息 [root@ceph01 ~]# ceph auth get client.admin exported keyring for client.admin [client.admin] key = AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" # 導出用戶 [root@ceph01 ~]# ceph auth export client.admin -o client.admin export auth(key=AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ==) [root@ceph01 ~]# cat client.admin [client.admin] key = AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" # 打印用戶祕鑰 [root@ceph01 ~]# ceph auth print-key client.admin AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ==
# 語法 $ ceph auth caps USERTYPE.USERID {daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]' [{daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]'] # 示例 # 獲取當前用戶信息 [root@ceph01 ~]# ceph auth get client.john exported keyring for client.john [client.john] key = AQBU5/pew+gMLBAAbBj2BK+nrqt8Gm7zk/xRug== caps mon = "allow r" caps osd = "allow rw pool=liverpool" # 修改 mon 權限爲 rw, osd 權限爲 rwx, 添加 mgr 只讀權限 [root@ceph01 ~]# ceph auth caps client.john mon 'allow rw' osd 'allow rwx pool=liverpool' mgr 'allow r' updated caps for client.john [root@ceph01 ~]# ceph auth get client.john exported keyring for client.john [client.john] key = AQBU5/pew+gMLBAAbBj2BK+nrqt8Gm7zk/xRug== caps mgr = "allow r" caps mon = "allow rw" caps osd = "allow rwx pool=liverpool"
# 語法 $ ceph auth del {TYPE}.{ID} # 刪除 client.john [root@ceph01 ~]# ceph auth del client.john updated # 查看用戶, 發現已經不存在 [root@ceph01 ~]# ceph auth get client.john Error ENOENT: failed to find client.john in keyring
# 語法 $ ceph auth import -i /etc/ceph/ceph.keyring # 示例 [root@ceph01 ~]# ceph auth import -i /etc/ceph/ceph.keyring # 注意:ceph 存儲集羣將添加新用戶, 生成其密鑰和權限; 並將更新現有用戶和密鑰即權限
pool
是 ceph
存儲數據時的邏輯分區,它起到 namespace
的做用。每一個 pool
包含必定數量的 PG
,PG
裏的對象被映射到不一樣的 OSD
上,所以 pool
是分佈到整個集羣的
除了隔離數據,咱們也能夠分別對不一樣的 pool
設置不一樣的策略,好比副本數、數據清洗次數、數據塊及對象大小等
# 列出集羣中的全部池 [root@ceph01 ~]# ceph osd lspools 1 device_health_metrics 2 cephfs_data 3 cephfs_metadata ...... # 查看池的規則 [root@ceph01 ~]# ceph osd pool get cephfs_data crush_rule crush_rule: replicated_rule # 列出集羣中池的詳細信息 [root@ceph01 ~]# ceph osd dump
# 建立池 # 語法 $ ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \ [crush-rule-name] [expected-num-objects] $ ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] erasure \ [erasure-code-profile] [crush-rule-name] [expected_num_objects] [--autoscale-mode=<on,off,warn>] # 示例 [root@ceph01 ~]# ceph osd pool create test_pool 16 16 pool 'test_pool' created
{pool-name}
:pool
名稱,集羣惟一{pg-num}
:pool
放置組總數,默認爲 8,不適用於大多數狀況{pgp-num}
:pool
用於放置目的的放置組總數,這應等於展現位置組的總數,默認爲 8{replicated|erasure}
:replicated
類型經過保留對象的多個副本(默認是3),以便 OSD
發生故障時恢復; erasure
類型實現相似於 RAID5
功能。replicated
須要更多存儲空間,但比 erasure
更加安全,erasure
須要較少的存儲空間且性能相對較好,安全性相對較差。默認爲 replicated
[crush-rule-name]
:用於此池的 CRUSH
規則的名稱。指定的規則必須存在[erasure-code-profile=profile]
:僅用於 erasure pool
--autoscale-mode=<on,off,warn>
:自動縮放模式,若是將自動縮放模式設置爲 on
或 warn
,則可讓系統根據實際使用狀況自動調整或建議對池中的放置組數量進行更改,默認行爲由 osd pool default pg autoscale mode
選項控制,使用 ceph config get osd osd_pool_default_pg_autoscale_mode
查看[expected-num-objects]
:pool
預期對象數# 將 pool 關聯到應用程序。池在使用前須要與應用程序關聯 [root@ceph01 ~]# ceph osd pool application enable test_pool rbd enabled application 'rbd' on pool 'test_pool'
# 設置 mon 參數, 運行刪除 pool [root@ceph01 ~]# ceph config set mon mon_allow_pool_delete true # 刪除 pool, 要求指定兩次 pool 以肯定 [root@ceph01 ~]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it pool 'test_pool' removed
# 設置 pool 參數, 語法以下 $ ceph osd pool set {pool-name} {key} {value} # 具體參數設置參考 https://ceph.readthedocs.io/en/latest/rados/operations/pools/#set-pool-values # 獲取 pool 參數, 語法以下 $ ceph osd pool get {pool-name} {key} # 可獲取 key 信息參考 https://ceph.readthedocs.io/en/latest/rados/operations/pools/#get-pool-values # 設置對象副本數 $ ceph osd pool set {poolname} size {num-replicas} # 設置最小副本數 $ ceph osd pool set {poolname} min_size 2 # 獲取對象副本數 $ ceph osd dump | grep 'replicated size'
# 重命名池 $ ceph osd pool rename {current-pool-name} {new-pool-name} # 列出集羣中全部池的使用信息 $ rados df # 得到集羣中全部池或指定池的 I/O 信息 $ ceph osd pool stats [{pool-name}] # 建立快照 $ ceph osd pool mksnap {pool-name} {snap-name} # 查看快照 $ rados lssnap -p {pool-name} # 刪除快照 $ ceph osd pool rmsnap {pool-name} {snap-name}