Ceph 集羣管理-入門篇

存儲集羣

存儲設備

有兩個在磁盤上存儲數據的 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 容許將其內部日誌寫入單獨的高速設備,以提升性能。若是有大量的快速存儲可用,內部元數據也能夠存儲在更快的設備上
  • 高效的寫時複製:RBDCephFS 快照依賴於在 BlueStore 中有效實現的寫時複製克隆機制。這將爲常規快照和Erasure Code(依賴克隆實現高效的兩階段提交)提供高效的 IO
FILESTORE
  • FileStore 是在 Ceph 中存儲對象的傳統方法。它依賴於標準文件系統(建議使用 XFS)以及鍵/值數據庫(傳統上是 LevelDB,如今是 RocksDB )來處理某些元數據bash

  • FileStore 通過了充分的測試,並在生產中普遍使用,可是因爲其整體設計和對用於存儲對象數據的傳統文件系統的依賴,所以存在許多性能缺陷服務器

  • 儘管 FileStore 一般可以在大多數 POSIX 兼容文件系統(包括 btrfsext4 )上運行,可是咱們僅建議使用 XFSbtrfsext4 都有已知的錯誤和缺陷,使用它們可能會致使數據丟失。默認狀況下,全部 Ceph 工具都使用 XFS

配置 Ceph

當你啓動 Ceph 服務時,初始化過程網絡

將激活一系列在後臺運行的守護程序。一個 Ceph 的存儲集羣上運行三種類型的守護程序:app

  • Ceph Monitor
  • Ceph Manager
  • Ceph OSD

支持 Ceph File SystemCeph 存儲集羣至少運行一臺 Ceph Metadata Server ;支持 Ceph Object StorageCeph 集羣至少運行一個 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 守護程序

使用 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 在啓用身份驗證和受權的狀況下運行(默認狀況下啓用)時,您必須指定用戶名和包含指定用戶的私鑰的密鑰環(一般是經過命令行)。若是您未指定用戶名,則 Cephclient.admin 用做默認用戶名。若是您未指定密鑰環,則 Ceph 將經過 keyringCeph 的設置中尋找密鑰環。例如,若是在不指定用戶或密鑰環的狀況下執行命令: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.IDclient.admin,或 client.user1

引入用戶類型的緣由是由於 Ceph 監視器,OSDMetadata Servers 也使用 Cephx 協議,但它們不是客戶端。區分用戶類型有助於區分客戶端用戶和其餘用戶-簡化訪問控制,用戶監控和可追溯性

在使用 Ceph 命令行時,若是指定 --user--id 則可省略用戶類型,若是指定 --name-n 則必須指定類型和名稱

對象存儲和文件系統

Ceph 存儲羣集用戶Ceph 對象存儲用戶和 Ceph 文件系統用戶不一樣

Ceph 對象網關使用 Ceph 存儲羣集用戶在網關守護程序和存儲羣集之間進行通訊,可是網關對最終用戶具備本身的用戶管理功能

Ceph 文件系統使用 POSIX 語義,與 Ceph 文件系統關聯的用戶空間與 Ceph 存儲集羣用戶不一樣

受權

Ceph 使用 caps 來描述受權通過身份驗證的用戶行使監視器,OSDMDS 的功能

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-monceph-osdceph-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)管理

poolceph 存儲數據時的邏輯分區,它起到 namespace 的做用。每一個 pool 包含必定數量的 PGPG 裏的對象被映射到不一樣的 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=&lt;on,off,warn&gt;:自動縮放模式,若是將自動縮放模式設置爲 onwarn,則可讓系統根據實際使用狀況自動調整或建議對池中的放置組數量進行更改,默認行爲由 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}
相關文章
相關標籤/搜索