存儲叢集
儲存設備
有兩個在磁盤上存儲資料的
Ceph
守護程式:
- Ceph OSD 是大多數資料存儲在
中的地方。一般而言,每個Ceph
都由單個儲存設備支援。OSD
還可以由多種裝置組合來支援,例如用于大多數資料的OSD
和用于某些中繼資料的HDD
。群集中SSD
的數量通常取決于存儲的資料量,每個儲存設備的容量以及備援(複制或OSD
)的級别和類型Erasure
- Ceph Monitor 管理關鍵的群集狀态,例如群內建員身份和身份驗證資訊。對于較小的群集,隻需要幾 GB 的容量,盡管對于較大的群集,監控器資料庫可以達到數十或數百GB的容量
OSD 後端
OSD
可以通過兩種方式管理它們存儲的資料。從
Luminous 12.2.z
版本開始,新的預設(推薦)後端是
BlueStore
。在
Luminous
之前,預設(也是唯一的選項)是
FileStore
BlueStore
BlueStore
是專用于存儲的後端,專門用于管理
Ceph OSD
中的資料。
BlueStore
的主要功能包括:
- 直接管理儲存設備:
建構在裸磁盤裝置之上,直接使用原始塊裝置或分區BlueStore
-
的中繼資料管理:嵌入RocksDB
的鍵/值資料庫管理内部中繼資料,例如從對象名稱到磁盤上塊位置的映射RocksDB
- 完整的資料和中繼資料校驗和:預設情況下,所有寫入
的資料和中繼資料都受到一個或多個校驗和的保護。未經驗證,不會從磁盤讀取任何資料或中繼資料或将其傳回給使用者BlueStore
- 内聯壓縮:寫入的資料在寫入磁盤之前可以選擇壓縮
- 多裝置中繼資料分層:
允許将其内部日志寫入單獨的高速裝置,以提高性能。如果有大量的快速存儲可用,内部中繼資料也可以存儲在更快的裝置上BlueStore
- 高效的寫時複制:
和RBD
快照依賴于在CephFS
中有效實作的寫時複制克隆機制。這将為正常快照和BlueStore
(依賴克隆實作高效的兩階段送出)提供高效的Erasure Code
IO
FILESTORE
-
是在FileStore
中存儲對象的傳統方法。它依賴于标準檔案系統(建議使用Ceph
)以及鍵/值資料庫(傳統上是XFS
,現在是LevelDB
)來處理某些中繼資料RocksDB
-
經過了充分的測試,并在生産中廣泛使用,但是由于其總體設計和對用于存儲對象資料的傳統檔案系統的依賴,是以存在許多性能缺陷FileStore
- 盡管
通常能夠在大多數FileStore
相容檔案系統(包括POSIX
btrfs
)上運作,但是我們僅建議使用ext4
。XFS
btrfs
都有已知的錯誤和缺陷,使用它們可能會導緻資料丢失。預設情況下,所有ext4
工具都使用Ceph
XFS
配置 Ceph
當你啟動
Ceph
服務時,初始化過程
将激活一系列在背景運作的守護程式。一個 Ceph 的存儲叢集上運作三種類型的守護程式:
-
Ceph Monitor
-
Ceph Manager
-
Ceph OSD
支援
Ceph File System
的
Ceph
存儲叢集至少運作一台
Ceph Metadata Server
;支援
Ceph Object Storage
Ceph
叢集至少運作一個
Gateway
守護程式
配置源
每個 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
使用 CLI 指令配置叢集
# 檢視叢集所有可配置對象
$ 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)管理
檢視池
# 列出叢集中的所有池
[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}
放置組總數,預設為 8,不适用于大多數情況pool
-
{pgp-num}
用于放置目的的放置組總數,這應等于展示位置組的總數,預設為 8pool
-
{replicated|erasure}
類型通過保留對象的多個副本(預設是3),以便replicated
發生故障時恢複;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 參數
# 設定 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}