Ceph 管理和使用

ceph 管理

上次介紹了Ceph集群架構並且搭建了ceph集群,本節介紹ceph用戶認證流程和掛載、cephFS、ceph RBD以及ceph mds高可用

1. ceph 授權流程和用戶許可權管理

1.1. ceph 認證機制

Ceph 使用 cephx 協議對客戶端進行身份認證。cephx 用於對 ceph 保存的數據進行認證訪問和授權,用於對訪問 ceph 的請求進行認證和授 權檢測,與 mon 通訊的請求都要經過 ceph 認證通過,但是也可以在 mon 節點關閉 cephx 認證,但是關閉認證之後任何訪問都將被允許,因此無法保證數據的安全性。

1.1.1. 授權流程

首先客戶端向 ceph-mon 服務請求數據,mon 節點會返回用於身份認證的數據結構,其中包含獲取 ceph 服務時用到的 session key,session key 通過客戶端秘鑰進行加密,秘鑰是在客戶端提前配置好的,/etc/ceph/ceph.client.admin.keyring,客戶端使用key解密後得到session key, 然後使用 session key 向 ceph-mon 請求所需要的服務,ceph-mon 收到請求後會向客戶端提供一個 tiket,用於向實際處理數據的 OSD 等服務驗證客戶端身份, ceph-mon 和 ceph-osd 服務共享同一個 secret,因此 ceph-osd 會信任所有 ceph-mon 發放的 tiket。

每個 ceph-mon 節點都可以對客戶端進行身份認證並分發秘鑰,因此多個 ceph-mon 節點就不存在單點故障和認證性能瓶頸。同時請注意,tiket 存在有效期,認證流程圖如下:

ceph認證

無論 ceph 客戶端是哪種類型,例如塊設備、對象存儲、文件系統,ceph 都會在存儲池中將所有數據存儲為對象:

  • ceph 用戶需要擁有存儲池訪問許可權,才能讀取和寫入數據
  • ceph 用戶必須擁有執行許可權才能使用 ceph 的管理命令

1.2 ceph 用戶管理

用戶是指個人(ceph 管理者)或系統參與者(MON/OSD/MDS)。通過創建用戶,可以控制用戶或哪個參與者能夠訪問 ceph 存儲集群、以及可訪問的存儲池 及存儲池中的數據。ceph 支援多種類型的用戶,但可管理的用戶都屬於 client 類型區分用戶類型的原因在於,MON/OSD/MDS 等系統組件都使用 cephx 協議,但是它們不算是客戶端。

用戶管理功能可讓 Ceph 集群管理員能夠直接在 Ceph 集群中創建、更新和刪除用戶。 在 Ceph 集群中創建或刪除用戶時,可能需要將密鑰分發到客戶端,以便將密鑰添加到密鑰環文件中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一個或者多個用戶認證資訊,凡是擁有此文件的節點,將具備訪問 ceph 的許可權,而且可以使用其中任何一個賬戶的許可權,此文件類似於 linux 系統的中的/etc/passwd 文件。

# 列出用戶
ubuntu@ceph-deploy:~$ sudo ceph auth list
installed auth entries:

osd.0
        key: AQD2GxphV+RyDBAAQFRomuzg4uDfIloEq5BI1g==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.1
        key: AQC6HBph1knDMhAA35GE09CWb6OLmS5JqmJQOQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.10
        key: AQBUHRphi4mpBBAAoWWLdTr4g6o6ACRS5N1OQw==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.11
        key: AQBfHRphtKOUDRAA29zlbCF0ucKFP7lAo+zrIQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.12
        key: AQBsHRphvK+HORAAT5bs2AlrqrMEw7gtu21bMQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.13
        key: AQB4HRphOHNuEhAAa98YTpyZFo/mrS3BmNHnTg==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.14
        key: AQCDHRphWeMVGxAA+NagThVA2EhR/f8w5a+3SA==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.15
        key: AQCOHRphFZOUJxAArQGoaoRw3B8D1aJ6ixv+9g==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.2
        key: AQDFHBphCMUdNRAAZnDeDQE5QqTkBSiE2aXYeA==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.21
        key: AQAMZCBhQAFIHhAAM5NaqCIldLooGGV0EI3j3A==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.3
        key: AQAnryFhN432FBAAeUMWfj0O7jraGwRfMXMoJQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.4
        key: AQANHRphwInjJBAA7vOTTU2kfLVthu0tuRTjRw==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.5
        key: AQAYHRph3xokMRAAyqYTH0DBO8RPbhEH/mn7vQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.6
        key: AQAjHRphKMkMMRAAOPxDEQK/zQ+HDO31ONl95A==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.7
        key: AQAuHRphiH+cOhAAAdQNL/bausHnAWyokLISEg==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.8
        key: AQA9HRph8Xp0ExAAVNo/SvF9GNZWZT69+eDgeQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.9
        key: AQBIHRphEYHPNhAAkOM4JfKztb+RpVaJ2gyplQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
client.admin
        key: AQD+BBphi27lEhAAMrU7KnwfJfn8SvOTVubqZQ==
        caps: [mds] allow *
        caps: [mgr] allow *
        caps: [mon] allow *
        caps: [osd] allow *
client.bootstrap-mds
        key: AQD+BBphn4TlEhAAZIRY7MzA5EmBBn6VIB0NWQ==
        caps: [mon] allow profile bootstrap-mds
client.bootstrap-mgr
        key: AQD+BBphFJPlEhAAXIb6KfAtBAS6SDU6TW9pCA==
        caps: [mon] allow profile bootstrap-mgr
client.bootstrap-osd
        key: AQD+BBph8p/lEhAAlZzVZrUoKFMsHqzZV/eT+g==
        caps: [mon] allow profile bootstrap-osd
client.bootstrap-rbd
        key: AQD+BBphwK3lEhAAkx5vuPcOg25bLKS+14HoFA==
        caps: [mon] allow profile bootstrap-rbd
client.bootstrap-rbd-mirror
        key: AQD+BBphXrvlEhAAtPPtNSikm8u8zPmamAUhqQ==
        caps: [mon] allow profile bootstrap-rbd-mirror
client.bootstrap-rgw
        key: AQD+BBph7cflEhAA9LZFIKACQh7CeK6E/EeB+Q==
        caps: [mon] allow profile bootstrap-rgw
mgr.ceph-mgr1
        key: AQCmFBphsiG/NRAAKgyv3gbmwv30PDMgmMPegw==
        caps: [mds] allow *
        caps: [mon] allow profile mgr
        caps: [osd] allow *
mgr.ceph-mgr2
        key: AQBQJBphSEBXNhAAH+NZhGJipY8IRw4YOIeOww==
        caps: [mds] allow *
        caps: [mon] allow profile mgr
        caps: [osd] allow *

# 列出指定用戶資訊
ubuntu@ceph-deploy:~$ sudo ceph auth get client.admin
exported keyring for client.admin
[client.admin]
        key = AQD+BBphi27lEhAAMrU7KnwfJfn8SvOTVubqZQ==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"


注意: TYPE.ID 表示法
針對用戶採用TYPE.ID表示法,例如osd.0指定是osd類並且ID為0的用戶(節點),client.admin 是 client 類型的用戶,其 ID 為 admin。

另請注意,每個項包含一個 key=xxx 項,以及一個或多個 caps 項。

可以結合使用-o 文件名選項和 ceph auth list 將輸出保存到某個文件

$ ceph auth list -o client.admin.key

1.2.1. ceph授權

ceph 基於使能/能力(Capabilities,簡稱 caps )來描述用戶,可針對 MON/OSD 或 MDS 使用的授權範圍或級別。
通用的語法格式:daemon-type ‘allow caps’ […]
能力一覽表:

許可權 說明
r 向用戶授予讀取許可權。訪問監視器(mon)以檢索 CRUSH 運行圖時需具有此能力。
w 向用戶授予針對對象的寫入許可權。
x 授予用戶調用類方法(包括讀取和寫入)的能力,以及在監視器中執行 auth 操作的能力。
* 授予用戶對特定守護進程/存儲池的讀取、寫入和執行許可權,以及執行管理命令的能力
class-read 授予用戶調用類讀取方法的能力,屬於是 x 能力的子集。
class-write 授予用戶調用類寫入方法的能力,屬於是 x 能力的子集。
profile osd 授予用戶以某個 OSD 身份連接到其他 OSD 或監視器的許可權。授予 OSD 許可權,使 OSD 能夠處理複製檢測訊號流量和狀態報告。
profile mds 授予用戶以某個 MDS 身份連接到其他 MDS 或監視器的許可權。
profile bootstrap-osd 授予用戶引導 OSD 的許可權(初始化 OSD 並將 OSD 加入 ceph 集群),授 權給部署工具,使其在引導 OSD 時有權添加密鑰。
profile bootstrap-mds 授予用戶引導元數據伺服器的許可權,授權部署工具許可權,使其在引導 元數據伺服器時有權添加密鑰。

MON 能力:

包括 r/w/x 和 allow profile cap(ceph 的運行圖),示例:

mon 'allow rwx'
mon 'allow profile osd'

OSD 能力:

包括 r、w、x、class-read、class-write(類讀取))和 profile osd(類寫入),另外 OSD 能力還允許進行存儲池和名稱空間設置。
osd 'allow capability' [pool=poolname] [namespace=namespace-name]

MDS 能力:

只需要 allow 或空都表示允許。 
mds 'allow'

1.2.2. 管理操作

添加一個用戶會創建用戶名 (TYPE.ID)、機密密鑰,以及包含在命令中用於創建該用戶的所 有能力,用戶可使用其密鑰向 Ceph 存儲集群進行身份驗證。用戶的能力授予該用戶在 Ceph monitor (mon)、Ceph OSD (osd) 或 Ceph 元數據伺服器 (mds) 上進行讀取、寫入或執行的 能力,可以使用以下幾個命令來添加用戶:

ceph auth add

此命令是添加用戶的規範方法。它會創建用戶、生成密鑰,並添加所有指定的能力。

# 先創建一個存儲池,現有集群一共16個osd,根據官方建議,每個osd一般建議100~200個PG,而我們的osd磁碟控制項較小,定為60個PG每個osd,總的可設置的PG 16 x 60 / 3 = 320個可設置的PG,每個存儲池的PG暫定為32個總共可設置10個pool

# 1、創建存儲池
ubuntu@ceph-deploy:~$ sudo ceph osd pool create mypool1 32 32
pool 'mypool1' created
ubuntu@ceph-deploy:~$ sudo ceph osd lspools
1 device_health_metrics
5 mypool1

# 給客戶端alice添加認證key
ubuntu@ceph-deploy:~$ sudo ceph auth add client.alice mon 'allow r' osd 'allow rwx pool=mypool1'
added key for client.alice
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
        key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
        caps mon = "allow r"
        caps osd = "allow rwx pool=mypool1"
ceph auth get-or-create

ceph auth get-or-create 此命令是創建用戶較為常見的方式之一,它會返回包含用戶名(在方括弧中)和密鑰的密鑰文,如果該用戶已存在,此命令只以密鑰文件格式返回用戶名和密鑰, 還可以使用 -o 指定文件名選項將輸出保存到某個文件。

# 創建一個新用戶
ubuntu@ceph-deploy:~$ sudo ceph auth get-or-create client.tom mon 'allow r' osd 'allow rwx pool=mypool1'
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
# 驗證用戶
ubuntu@ceph-deploy:~$ sudo ceph auth get client.tom
exported keyring for client.tom
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
        caps mon = "allow r"
        caps osd = "allow rwx pool=mypool1"
# 再次創建
ubuntu@ceph-deploy:~$ sudo ceph auth get-or-create client.tom mon 'allow r' osd 'allow rwx pool=mypool1'
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==

ceph auth get-or-create-key

此命令是創建用戶並僅返回用戶密鑰,對於只需要密鑰的客戶端(例如 libvirt),此命令非 常有用。如果該用戶已存在,此命令只返回密鑰。您可以使用 -o 文件名選項將輸出保存到 某個文件。 創建客戶端用戶時,可以創建不具有能力的用戶。不具有能力的用戶可以進行身份驗證,但 不能執行其他操作,此類客戶端無法從監視器檢索集群地圖,但是,如果希望稍後再添加能 力,可以使用 ceph auth caps 命令創建一個不具有能力的用戶。

典型的用戶至少對 Ceph monitor 具有讀取功能,並對 Ceph OSD 具有讀取和寫入功能。此外,用戶的 OSD 許可權通常限制為只能訪問特定的存儲池。

ubuntu@ceph-deploy:~$ sudo ceph auth get-or-create-key client.tom mon 'allow r' osd 'allow rwx pool=mypool1'
AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
# 用戶有 key 就顯示沒有就創建
ceph auth print-key

只獲取單個指定用戶的 key 資訊

ubuntu@ceph-deploy:~$ sudo ceph auth print-key client.alice
AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
修改用戶能力

使用 ceph auth caps 命令可以指定用戶以及更改該用戶的能力,設置新能力會完全覆蓋當前 的能力,因此要加上之前的用戶已經擁有的能和新的能力,如果看當前能力,可以運行 ceph auth get USERTYPE.USERID,如果要添加能力,使用以下格式時還需要指定現有能力:

# 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]']

示例

# 查看用戶當前許可權
ubuntu@ceph-deploy:~$ sudo ceph auth get client.tom
exported keyring for client.tom
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
        caps mon = "allow r"
        caps osd = "allow rwx pool=mypool1"
        
# 修改用戶許可權
ubuntu@ceph-deploy:~$ sudo ceph auth caps client.tom mon 'allow r' osd 'allow rw pool=mypool1'
updated caps for client.tom
# 驗證
ubuntu@ceph-deploy:~$ sudo ceph auth get client.tom
exported keyring for client.tom
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
        caps mon = "allow r"
        caps osd = "allow rw pool=mypool1"
刪除用戶
# 要刪除用戶使用 ceph auth del TYPE.ID,其中 TYPE 是 client、osd、mon 或 mds 之一,ID 是用戶名或守護進程的 ID。
ubuntu@ceph-deploy:~$ sudo ceph auth del client.tom
updated

ubuntu@ceph-deploy:~$ sudo ceph auth get client.tom
Error ENOENT: failed to find client.tom in keyring
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
        key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
        caps mon = "allow r"
        caps osd = "allow rwx pool=mypool1"

1.3. 秘鑰環管理

ceph 的秘鑰環是一個保存了 secrets、keys、certificates 並且能夠讓客戶端通認證訪問 ceph 的 keyring file(集合文件),一個 keyring file 可以保存一個或者多個認證資訊,每一個 key 都有一個實體名稱加許可權,類型為:

{client、mon、mds、osd}.name

當客戶端訪問 ceph 集群時,ceph 會使用以下四個密鑰環文件預設置密鑰環設置:

/etc/ceph/<$cluster name>.<user $type>.<user $id>.keyring # 保存單個用戶的 keyring 
/etc/ceph/cluster.keyring                                 # 保存多個用戶的 keyring
/etc/ceph/keyring                                         # 未定義集群名稱的多個用戶的 keyring
/etc/ceph/keyring.bin                                     # 編譯後的二進位文件

1.3.1. 通過秘鑰環文件備份與恢復用戶

使用 ceph auth add 等命令添加的用戶還需要額外使用 ceph-authtool 命令為其創建用戶秘鑰環文件。創建 keyring 文件命令格式:

ceph-authtool --create-keyring FILE
1.3.1.1 導出用戶認證資訊至 keyring 文件
# 創建密鑰環文件
ubuntu@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.alice.keyring
creating ceph.client.alice.keyring
ubuntu@ceph-deploy:~$ ls
ceph-cluster  ceph.client.alice.keyring
ubuntu@ceph-deploy:~$ cat ceph.client.alice.keyring 
ubuntu@ceph-deploy:~$ file ceph.client.alice.keyring
ceph.client.alice.keyring: empty

# 導出 keyring 到指定文件
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice -o ceph.client.alice.keyring
exported keyring for client.alice
ubuntu@ceph-deploy:~$ cat ceph.client.alice.keyring
[client.alice]
	key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool1"

在創建包含單個用戶的密鑰環時,通常建議使用 ceph 集群名稱、用戶類型和用戶名及 keyring 來命名,並將其保存在 /etc/ceph 目錄中。例如為 client.alice 用戶創建 ceph.client.alice.keyring。

1.3.1.2 keyring 文件恢復用戶認證資訊

可以使用 ceph auth import -i 指定 keyring 文件並導入到 ceph,其實就是起到用戶備份和恢復的目的:

# 驗證用戶
ubuntu@ceph-deploy:/etc/ceph$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
	key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool1"
# 刪除用戶
ubuntu@ceph-deploy:/etc/ceph$ sudo ceph auth del client.alice
updated
# 驗證
ubuntu@ceph-deploy:/etc/ceph$ sudo ceph auth get client.alice
Error ENOENT: failed to find client.alice in keyring
ubuntu@ceph-deploy:/etc/ceph$ cd ~/
ubuntu@ceph-deploy:~$ ls
ceph-cluster  ceph.client.alice.keyring
# 恢復賬戶
ubuntu@ceph-deploy:~$ sudo ceph auth import -i ceph.client.alice.keyring
imported keyring
# 驗證用戶
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
	key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool1"

1.3.2 秘鑰環文件多用戶

一個 keyring 文件中可以包含多個不同用戶的認證文件。

將多用戶導出至秘鑰環:

# 創建一個空的 keyring
ubuntu@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.user1.keyring
creating ceph.client.user1.keyring
# 把指定的 admin 用戶的 keyring 文件內容導入到 user1 用戶的 keyring 文件
ubuntu@ceph-deploy:~$ sudo ceph-authtool --import-keyring /etc/ceph/ceph.client.admin.keyring ceph.client.user1.keyring
importing contents of /etc/ceph/ceph.client.admin.keyring into ceph.client.user1.keyring
# 驗證
ubuntu@ceph-deploy:~$ sudo ceph-authtool -l ceph.client.user1.keyring
[client.admin]
	key = AQD+BBphi27lEhAAMrU7KnwfJfn8SvOTVubqZQ==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"

# 導入另一個用戶的密鑰環
ubuntu@ceph-deploy:~$ sudo ceph-authtool --import-keyring ceph.client.alice.keyring ceph.client.user1.keyring
importing contents of ceph.client.alice.keyring into ceph.client.user1.keyring
# 驗證
ubuntu@ceph-deploy:~$ sudo ceph-authtool -l ceph.client.user1.keyring
[client.admin]
	key = AQD+BBphi27lEhAAMrU7KnwfJfn8SvOTVubqZQ==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
[client.alice]
	key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool1"

2. 普通用戶掛載rbd和cephfs

2.1 Ceph RBD 使用

RBD 架構圖

Ceph 可以同時提供對象存儲 RADOSGW、塊存儲 RBD、文件系統存儲 Ceph FS,RBD 即 RADOS Block Device 的簡稱,RBD 塊存儲是常用的存儲類型之一,RBD 塊設備類似磁碟可以被掛載, RBD 塊設備具有快照、多副本、克隆和一致性等特性,數據以條帶化的方式存儲在 Ceph 集 群的多個 OSD 中。

條帶化技術就是一種自動的將 I/O 的負載均衡到多個物理磁碟上的技術,條帶化技術就是將一塊連續的數據分成很多小部分並把他們分別存儲到不同磁碟上去。這就能使多個進程同時訪問數據的多個不同部分而不會造成磁碟衝突,而且在需要對這種數據進行順序訪問的時候可以獲得最大程度上的 I/O 並行能力,從而獲得非常好的性能。

image-20210822164342588

# 1、創建存儲池
ubuntu@ceph-deploy:~$ sudo ceph osd pool create rbd-pool-1 32 32
pool 'rbd-pool-1' created

ubuntu@ceph-deploy:~$ sudo ceph osd pool ls
device_health_metrics
mypool1
rbd-pool-1

# 2、對存儲池啟用 rbd
ubuntu@ceph-deploy:~$ sudo ceph osd pool application enable rbd-pool-1 rbd
enabled application 'rbd' on pool 'rbd-pool-1'

# 3、初始化 rbd
ubuntu@ceph-deploy:~$ sudo rbd pool init -p rbd-pool-1

創建 img 映像

# rbd 存儲池並不能直接用於塊設備,而是需要事先在其中按需創建映像(image),並把映像文件作為塊設備使用。rbd 命令可用於創建、查看及刪除塊設備相在的映像(image), 以及克隆映像、創建快照、將映像回滾到快照和查看快照等管理操作。例如,下面的命令能夠在指定的 RBD 即 rbd-1 創建一個名為 rbd-img-1 的映像

ubuntu@ceph-deploy:~$ sudo rbd create rbd-img-1 --size 3G --pool rbd-pool-1 --image-format 2 --image-feature layering
ubuntu@ceph-deploy:~$ sudo rbd create rbd-img-2 --size 5G --pool rbd-pool-1 --image-format 2 --image-feature layering
# 驗證
ubuntu@ceph-deploy:~$ sudo rbd ls --pool rbd-pool-1
rbd-img-1
rbd-img-2

# 列出詳細資訊
ubuntu@ceph-deploy:~$ sudo rbd ls --pool rbd-pool-1 -l
NAME       SIZE   PARENT  FMT  PROT  LOCK
rbd-img-1  3 GiB            2
rbd-img-2  5 GiB            2

查看鏡像的詳細資訊

ubuntu@ceph-deploy:~$ sudo rbd --image rbd-img-1 --pool rbd-pool-1 info
rbd image 'rbd-img-1':
	size 3 GiB in 768 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: d41dee2cd129
	block_name_prefix: rbd_data.d41dee2cd129
	format: 2
	features: layering
	op_features:
	flags:
	create_timestamp: Sun Aug 22 08:53:33 2021
	access_timestamp: Sun Aug 22 08:53:33 2021
	modify_timestamp: Sun Aug 22 08:53:33 2021

ubuntu@ceph-deploy:~$ sudo rbd --image rbd-img-2 --pool rbd-pool-1 info
rbd image 'rbd-img-2':
	size 5 GiB in 1280 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: d420cab622d4
	block_name_prefix: rbd_data.d420cab622d4
	format: 2
	features: layering
	op_features:
	flags:
	create_timestamp: Sun Aug 22 08:53:48 2021
	access_timestamp: Sun Aug 22 08:53:48 2021
	modify_timestamp: Sun Aug 22 08:53:48 2021

以 json 格式顯示鏡像資訊

ubuntu@ceph-deploy:~$ sudo rbd ls --pool rbd-pool-1 -l --format json --pretty-format
[
    {
        "image": "rbd-img-1",
        "id": "d41dee2cd129",
        "size": 3221225472,
        "format": 2
    },
    {
        "image": "rbd-img-2",
        "id": "d420cab622d4",
        "size": 5368709120,
        "format": 2
    }
]

鏡像的其他特性

  • layering: 支援鏡像分層快照特性,用於快照及寫時複製,可以對 image 創建快照並保護,然 後從快照克隆出新的 image 出來,父子 image 之間採用 COW 技術,共享對象數據。默認添加的特性

  • striping: 支援條帶化 v2,類似 raid 0,只不過在 ceph 環境中的數據被分散到不同的對象中, 可改善順序讀寫場景較多情況下的性能。

  • exclusive-lock: 支援獨佔鎖,限制一個鏡像只能被一個客戶端使用。

  • object-map: 支援對象映射(依賴 exclusive-lock),加速數據導入導出及已用空間統計等,此特 性開啟的時候,會記錄 image 所有對象的一個點陣圖,用以標記對象是否真的存在,在一些場 景下可以加速 io。

  • fast-diff: 快速計算鏡像與快照數據差異對比(依賴 object-map)。 deep-flatten: 支援快照扁平化操作,用於快照管理時解決快照依賴關係等。

  • journaling: 修改數據是否記錄日誌,該特性可以通過記錄日誌並通過日誌恢複數據(依賴獨 占鎖),開啟此特性會增加系統磁碟 IO 使用。

jewel 默認開啟的特性包括: layering/exlcusive lock/object map/fast diff/deep flatten

鏡像特性的啟用

# 啟用指定存儲池中的指定鏡像的特性
ubuntu@ceph-deploy:~$ sudo rbd feature enable exclusive-lock --pool rbd-pool-1 --image rbd-img-1
ubuntu@ceph-deploy:~$ sudo rbd feature enable object-map --pool rbd-pool-1 --image rbd-img-1
ubuntu@ceph-deploy:~$ sudo rbd feature enable fast-diff --pool rbd-pool-1 --image rbd-img-1

# 驗證鏡像特性
ubuntu@ceph-deploy:~$ sudo rbd info --image rbd-img-1 --pool rbd-pool-1
rbd image 'rbd-img-1':
	size 3 GiB in 768 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: d41dee2cd129
	block_name_prefix: rbd_data.d41dee2cd129
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff
	op_features:
	flags: object map invalid, fast diff invalid
	create_timestamp: Sun Aug 22 08:53:33 2021
	access_timestamp: Sun Aug 22 08:53:33 2021
	modify_timestamp: Sun Aug 22 08:53:33 2021

鏡像特性的禁用

ubuntu@ceph-deploy:~$ sudo rbd feature disable fast-diff --pool rbd-pool-1 --image rbd-img-1
ubuntu@ceph-deploy:~$ sudo rbd feature disable exclusive-lock --pool rbd-pool-1 --image rbd-img-1
ubuntu@ceph-deploy:~$ sudo rbd info --image rbd-img-1 --pool rbd-pool-1
rbd image 'rbd-img-1':
	size 3 GiB in 768 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: d41dee2cd129
	block_name_prefix: rbd_data.d41dee2cd129
	format: 2
	features: layering
	op_features:
	flags:
	create_timestamp: Sun Aug 22 08:53:33 2021
	access_timestamp: Sun Aug 22 08:53:33 2021
	modify_timestamp: Sun Aug 22 08:53:33 2021

2.2 配置客戶端使用 RBD

在客戶端掛載 RBD,並使用普通用戶掛載 RBD 並驗證使用。

客戶端需要安裝ceph-common

# 1、添加源
ubuntu@client:~$ wget -q -O- '//download.ceph.com/keys/release.asc' | sudo apt-key add -
ubuntu@client:~$ apt-add-repository 'deb //mirrors.tuna.tsinghua.edu.cn/ceph/debian-octopus/ bionic main'
# 2、安裝 ceph-common
ubuntu@client:~$ sudo apt install -y ceph-common

# 3、在客戶端映射 rbd 映像
ubuntu@client:~$ sudo rbd map --pool rbd-pool-1 --image rbd-img-1
/dev/rbd0
ubuntu@client:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                         8:0    0   30G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    1G  0 part /boot
└─sda3                      8:3    0   29G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   20G  0 lvm  /
sr0                        11:0    1  945M  0 rom
rbd0                      252:0    0    3G  0 disk

# 4、使用普通用戶掛載測試
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
	key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool1"
# 更改用戶許可權
ubuntu@ceph-deploy:~$ sudo ceph auth caps client.alice mon 'allow r' osd 'allow rwx pool=rbd-pool-1'
updated caps for client.alice
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
	key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
	caps mon = "allow r"
	caps osd = "allow rwx pool=rbd-pool-1"

# 5、創建密鑰環並拷貝到客戶端
ubuntu@ceph-deploy:~$ sudo ceph-authtool --create-keyring ceph.client.alice.keyring
creating ceph.client.alice.keyring
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice -o ceph.client.alice.keyring
exported keyring for client.alice
ubuntu@ceph-deploy:~$ sudo cat ceph.client.alice.keyring
[client.alice]
	key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
	caps mon = "allow r"
	caps osd = "allow rwx pool=rbd-pool-1"
# 拷貝密鑰環
ubuntu@ceph-deploy:~$ scp ceph.client.alice.keyring ubuntu@ceph-client:/etc/ceph

# 6、查看集群,默認使用的是admin,需要使用 --user 指定用戶
ubuntu@ceph-client:~$ sudo ceph --user alice -s
  cluster:
    id:     b7c42944-dd49-464e-a06a-f3a466b79eb4
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 8h)
    mgr: ceph-mgr1(active, since 32h), standbys: ceph-mgr2
    osd: 16 osds: 16 up (since 7h), 16 in (since 7h)

  data:
    pools:   3 pools, 65 pgs
    objects: 10 objects, 51 B
    usage:   16 GiB used, 143 GiB / 160 GiB avail
    pgs:     65 active+clean
    
# 7、使用普通用戶映射rbd
ubuntu@ceph-client:~$ sudo rbd device map --pool rbd-pool-1 --image rbd-img-1 --user alice
/dev/rbd0
ubuntu@ceph-client:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                         8:0    0   30G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    1G  0 part /boot
└─sda3                      8:3    0   29G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   20G  0 lvm  /
sr0                        11:0    1  945M  0 rom
rbd0                      252:0    0    3G  0 disk

# 8、格式化並使用
ubuntu@ceph-client:~$ sudo mkfs.ext4 /dev/rbd0
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done
Creating filesystem with 786432 4k blocks and 196608 inodes
Filesystem UUID: bfcf3ca0-56ae-4cc1-a059-7579c98a4cd8
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

# 創建掛載點
ubuntu@ceph-client:~$ sudo mkdir -p /data
ubuntu@ceph-client:~$ sudo mount /dev/rbd0 /data/
ubuntu@ceph-client:~$  df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               954M     0  954M   0% /dev
tmpfs                              198M   11M  187M   6% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   20G  5.4G   14G  30% /
tmpfs                              986M     0  986M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              986M     0  986M   0% /sys/fs/cgroup
/dev/sda2                          976M  150M  759M  17% /boot
tmpfs                              198M     0  198M   0% /run/user/1000
/dev/rbd0                          2.9G  9.0M  2.8G   1% /data
# 通過nginx設置
ubuntu@ceph-client:~$ sudo apt install -y nginx
ubuntu@ceph-client:~$ cd /data
ubuntu@ceph-client:/data$ sudo mkdir -p www/html
ubuntu@ceph-client:/data$ ls
lost+found  www
ubuntu@ceph-client:/data$ cd www/html/
# 一個比較好看的index首頁
ubuntu@ceph-client:/data/www/html$ sudo vim index.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta http-equiv="content-type" content="text/html;charset=utf-8">
	<link rel="icon" href="img/avatar.jpg" type="image/x-icon">
	<link rel="dns-prefetch" href="/music">
	<link rel="dns-prefetch" href="//azwnini.github.io">
	<link rel="dns-prefetch" href="/lab">
	<link rel="dns-prefetch" href="/code">
	<link rel="prerender" href="/music/index.html">
	<link rel="shortcut icon" href="/avatar.jpg">
	<meta http-equiv="X-UA-Compatible" content="IE=Edge">
	<meta content="always" name="referrer">
	<meta http-equiv="x-dns-prefetch-control" content="on" />
	<title>Arch_Villain的個人主頁</title>
	<canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas> 
    	<script type="text/javascript" src="js/anime.min.js"></script> 
    	<script type="text/javascript" src="js/fireworks.js"></script>
	<style type="text/css">
		body{font-family: arial, sans-serif;background-color: #ddd;transition:1s;}
		.title{position: fixed;bottom: 0;left: 0;text-align: center;width: 100%;color:#454545;}
		.nav{overflow:hidden;position: fixed;bottom: 0;left: 0;height: 420px;width: 100%;}
		.navs{width: 800px;height: 840px;margin:0 auto;transform-origin:50% 50%;transition: 1s;transform:rotate(0deg);z-index: 0;}
		.rotate{animation: rotate1 20s linear infinite;}
		.navs li{position: absolute;left: 50%;top: 20px;margin-left: -50px;width: 100px;height: 100px;line-height:100px;transform-origin:50% 400px;text-align: center;
				border-radius:5px;transition:border-radius .3s,box-shadow 1s;
				box-shadow:0 0px 10px 0 rgba(0, 0, 0, 0.12);
		}
		.navs li:hover{border-radius:50%;z-index: 1;}
		.navs li a:hover{transform:scale(1.1);}
		.navs li a{text-decoration: none;color:#fff;font-family:Microsoft YaHei;font-size: 20px;display:inline-block;width: 100%;height: 100%;}
		ul,li{margin: 0;padding: 0;list-style:none;}
		@keyframes rotate1{
			0%{
				transform:rotate(0deg);
			}
			50%{
				transform:rotate(180deg);
			}
			100%{
				transform:rotate(360deg);
			}
		}
		/*.resumes{text-align: center;margin-top: 50px;position: relative;z-index: 1;line-height:40px;}
		.resumes a{padding:5px 10px;background-color: #fff;text-decoration: none;color:#454545;font-family: microsoft YaHei;}*/
		.octicon{vertical-align:middle;vertical-align:text-bottom;padding-right: 5px;width: 22px;height: 22px;}
	</style>
</head>
<body>
	<div class="nav" id="nav">
		<ul class="navs" id="navs"</ul>
	</div>
	<h1 class="title">Arch_Villain的個人主頁</h1>
	<br>
	<br>
	<br>
	<center><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=430 height=86 src="//music.163.com/outchain/player?type=2&id=536622304&auto=1&height=66"></iframe></center>
	<!--<div style="
	    font-family: 微軟雅黑;
	    font-weight: bold;
	    color: #fff;
	    font-size: 60px;
	    text-align: center;
		    width:100%;
		    position: fixed;
		    bottom:500px">Hello World!</div> -->
	<!--div class="resumes">
		<a target="_blank" href="//lmaomaoz.com/resume-md/">web版簡歷</a>
		<a target="_blank" href="//github.com/CheshireJCat/resume-md">github版簡歷</a>
		<a target="_blank" href="//lmaomaoz.com/resume-md/sources/cheshireCat.pdf">pdf版簡歷下載</a>
		<br>
		<a target="_blank" href="//github.com/CheshireJCat"><svg aria-hidden="true" class="octicon" version="1.1" viewBox="0 0 16 16"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg>github</a>
		<a href="mail:[email protected]"><svg class="octicon" viewBox="0 0 200 200" version="1.1" xmlns="//www.w3.org/2000/svg" xmlns:xlink="//www.w3.org/1999/xlink"><g class="transform-group"><g transform="scale(0.1953125, 0.1953125)"><path d="M512 63.791885c-247.538793 0-448.208115 200.669322-448.208115 448.208115s200.669322 448.208115 448.208115 448.208115 448.208115-200.669322 448.208115-448.208115S759.538793 63.791885 512 63.791885zM774.58958 323.779198 512.332575 544.363082l-262.240633-220.583884L774.58958 323.779198zM248.078075 342.614172l175.202301 148.376329L248.078075 700.015118 248.078075 342.614172zM268.360004 700.220802l167.104879-197.293435 76.81141 63.081711 76.95058-65.046459 167.096692 199.258183L268.360004 700.220802zM775.921925 700.015118 600.727811 490.9905l175.194114-148.376329L775.921925 700.015118z" fill="#272636"></path></g></g></svg>[email protected]</a>
<br>
	<a href="//lmaomaoz.com/music/" target="_blank">html5 音樂播放器</a>
	<a href="//lmaomaoz.com/lab/css3/animatevideo/" target="_blank">純css3影片</a>
	<a href="//lmaomaoz.com/lab/canvas/mmd2/index.html" target="_blank">threejs-MMD-loader</a>
	</div-->
	<script type="text/javascript">
	(function(){
		function gc(){
			return '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).substr(-6);
		}
		var data = [['首頁','/home','#afaee8'],['音樂','music','#272626'],['部落格','/','#0eb3af'],['番劇推薦','content/404.html','#40c4ff'],['code','content/404.html','#ee6e73'],['相冊','picture','#bfafa0']];
		var max = 12;
		if(data.length<max){data = data.concat(data);}
		var mode = '<li style="background:{{background}};transform:rotate({{rotate}}deg)" data-index={{index}}><a href="{{href}}">{{word}}</a></li>',
			count = data.length,
			angle = 360/count,
			navs = document.getElementById('navs');
			navs.innerHTML = data.concat().map(function(x,i) {
				return mode.replace(/{{href}}/g,x[1])
						   .replace(/{{word}}/g,x[0])
						   .replace(/{{background}}/g,x[2])
						   .replace(/{{rotate}}/g,angle*i)
						   .replace(/{{index}}/g,i);
			}).join('');
		var t = new Date();
		var nowData = 0;
		var nowAngle = 0;
		function scrollFun(event){	
			var t2 = new Date();
			if(t2-t<600){
				return false;
			}else{
				t = t2;
			}
			var e = event||window.event;
			var delta = arguments.length>0?(e.wheelDelta||-e.detail):1;
			var d = delta>0?1:-1;
			//var nowAngle = navs.style.transform.match(/rotate\((-?\d+)deg\)/);
			//nowAngle = nowAngle==null?0:nowAngle[1]*1;
			//nowAngle += angle*d;
			nowData += -d;
			nowData = nowData>max-1?nowData%max:nowData<0?nowData+max:nowData;
			nowAngle += angle*d;
			navs.style.transform = 'rotate('+nowAngle+'deg)';
			document.getElementsByTagName('body')[0].style.background = data[nowData][2];
		}
		var it = setInterval(scrollFun,2000);
		navs.onmouseenter = function(){
			//navs.classList.remove('rotate');
			clearInterval(it);
		};
		navs.onmouseleave = function(){
			//navs.classList.add('rotate');
			it = setInterval(scrollFun,2000);
		};
		if(document.addEventListener){
		    document.addEventListener('DOMMouseScroll',scrollFun,false);
		}//W3C
		window.onmousewheel=document.onmousewheel=scrollFun;//IE/Opera/Chrome
	})();
	</script>
</body>
</html>

修改 nginx 配置

ubuntu@ceph-client:/data/www/html$ sudo vim /etc/nginx/sites-enabled/default
# 重啟nginx服務
ubuntu@ceph-client:/data/www/html$ sudo /usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ubuntu@ceph-client:/data/www/html$ sudo systemctl restart nginx

image-20210822175826611

訪問結果

image-20210822180315244

掛載 rbd 之後系統內核會自動載入 libceph.ko 模組

image-20210822180423890

2.3 Ceph FS 使用

ceph FS 即 ceph filesystem,可以實現文件系統共享功能,客戶端通過 ceph 協議掛載並使用 ceph 集群作為數據存儲伺服器。
Ceph FS 需要運行 Meta Data Services(MDS)服務,其守護進程為 ceph-mds,ceph-mds 進程管 理與 cephFS 上存儲的文件相關的元數據,並協調對 ceph 存儲集群的訪問。

cephfs 的元數據使用的動態子樹分區,把元數據劃分名稱空間對應到不同的 mds,寫入元數據 的時候將元數據按照名稱保存到不同主 mds 上,有點類似於 nginx 中的快取目錄分層一樣.

2.3.1 部署MDS服務

如果要使用 cephFS,需要部署 ceph-mds 服務。這裡將ceph-mds與ceph-mgr部署到一起

ubuntu@ceph-mgr1:~$ sudo apt -y install ceph-mds
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mgr1

root@ceph-mgr1:~# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 172.31.0.11:3300        0.0.0.0:*               LISTEN      1127/ceph-mon
tcp        0      0 172.31.0.11:6789        0.0.0.0:*               LISTEN      1127/ceph-mon
tcp        0      0 172.31.0.11:6800        0.0.0.0:*               LISTEN      16734/ceph-mds
tcp        0      0 172.31.0.11:6801        0.0.0.0:*               LISTEN      16734/ceph-mds
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1025/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1539/sshd
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1659/master
tcp6       0      0 :::22                   :::*                    LISTEN      1539/sshd
tcp6       0      0 :::25                   :::*                    LISTEN      1659/master

創建 CephFS metadata 和 data 存儲池

使用 CephFS 之前需要事先於集群中創建一個文件系統,並為其分別指定元數據和數據相關 的存儲池。下面創建一個名為 cephfs 的文件系統用於測試,它使用 cephfs-metadata 為元數 據存儲池,使用 cephfs-data 為數據存儲池:

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph osd pool create cephfs-metadata-pool-1 32 32
pool 'cephfs-metadata-pool-1' created
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph osd pool create cephfs-data-pool-1 64 64
pool 'cephfs-data-pool-1' created

創建 cephFS 並驗證

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs new cephfs-test-1 cephfs-metadata-pool-1 cephfs-data-pool-1
new fs with metadata pool 7 and data pool 8

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs ls
name: cephfs-test-1, metadata pool: cephfs-metadata-pool-1, data pools: [cephfs-data-pool-1 ]
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status cephfs-test-1
cephfs-test-1 - 0 clients
=============
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata     0   45.0G
  cephfs-data-pool-1      data       0   45.0G
  
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph mds stat
cephfs-test-1:1 {0=ceph-mon1=up:active}

創建客戶端賬戶並驗證cephfs

# 創建賬戶
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph auth add client.cephfs-test mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data-pool-1'
added key for client.cephfs-test
# 創建密鑰環
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph-authtool --create-keyring ceph.client.cephfs-test.keyring
creating ceph.client.cephfs-test.keyring
# 驗證賬戶
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph auth get client.cephfs-test
exported keyring for client.cephfs-test
[client.cephfs-test]
	key = AQBwJiJhJ/N3EBAAMJXwn2zOABiZCj+HDSvqEA==
	caps mds = "allow rw"
	caps mon = "allow r"
	caps osd = "allow rwx pool=cephfs-data-pool-1"
# 寫入密鑰環資訊
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph auth get client.cephfs-test -o ceph.client.cephfs-test.keyring
exported keyring for client.cephfs-test

# 移動密鑰環到/etc/ceph
ubuntu@ceph-deploy:~/ceph-cluster$ sudo mv ceph.client.cephfs-test.keyring /etc/ceph/

# 拷貝密鑰
root@ceph-deploy:~# sudo ceph auth print-key client.cephfs-test > cephfs-test.key

# 查看集群
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph -s --user cephfs-test
  cluster:
    id:     b7c42944-dd49-464e-a06a-f3a466b79eb4
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 9h)
    mgr: ceph-mgr1(active, since 33h), standbys: ceph-mgr2
    mds: cephfs-test-1:1 {0=ceph-mon1=up:active}
    osd: 16 osds: 16 up (since 8h), 16 in (since 8h)

  data:
    pools:   5 pools, 161 pgs
    objects: 58 objects, 75 MiB
    usage:   17 GiB used, 143 GiB / 160 GiB avail
    pgs:     161 active+clean
    
# 掛載ceph文件系統
root@ceph-deploy:~# mount -t ceph -o name=cephfs-test,secretfile=cephfs-test.key 172.31.0.11:6789/ /data2
source mount path was not specified
unable to parse mount source: -22
# 注意別少加冒號吆
root@ceph-deploy:~# mount -t ceph -o name=cephfs-test,secretfile=cephfs-test.key 172.31.0.11:6789:/ /data2
root@ceph-deploy:~# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               954M     0  954M   0% /dev
tmpfs                              198M   11M  187M   6% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   20G  5.5G   14G  30% /
tmpfs                              986M     0  986M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              986M     0  986M   0% /sys/fs/cgroup
/dev/sda2                          976M  150M  759M  17% /boot
tmpfs                              198M     0  198M   0% /run/user/1000
172.31.0.11:6789:/                  46G     0   46G   0% /data2

root@ceph-deploy:~# mkdir -p /data2/www/html/

root@ceph-deploy:~# vim /data2/www/html/index.html
# 將之前的首頁弄過來
root@ceph-deploy:~# vim /etc/nginx/sites-enabled/default
# 修改nginx配置
root /data2/www/html;
# 重啟nginx服務

訪問頁面成功

image-20210824213952036

3. mds高可用

3.1. 添加MDS伺服器

# 當前 ceph mds 集群狀態
root@ceph-deploy:~# ceph mds stat
cephfs-test-1:1 {0=ceph-mon1=up:active}

# 添加 ceph-mon2、ceph-mon3 作為ceph mds 伺服器
ubuntu@ceph-mon2:~$ sudo apt install ceph-mds -y
ubuntu@ceph-mon3:~$ sudo apt install ceph-mds -y

# 添加 mds 伺服器
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mon2
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mon3

# 查看狀態,1台激活,2台備份
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph mds stat
cephfs-test-1:1 {0=ceph-mon1=up:active} 2 up:standby

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status
cephfs-test-1 - 1 clients
=============
RANK  STATE      MDS        ACTIVITY     DNS    INOS
 0    active  ceph-mon1  Reqs:    0 /s    15     16
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata  2099k  45.0G
  cephfs-data-pool-1      data     192k  45.0G
STANDBY MDS
 ceph-mon2
 ceph-mon3
MDS version: ceph version 15.2.14 (cd3bb7e87a2f62c1b862ff3fd8b1eec13391a5be) octopus (stable)

3.2. 查看當前文件系統

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs ls
name: cephfs-test-1, metadata pool: cephfs-metadata-pool-1, data pools: [cephfs-data-pool-1 ]

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs get cephfs-test-1
Filesystem 'cephfs-test-1' (1)
fs_name	cephfs-test-1
epoch	34
flags	12
created	2021-08-22T10:20:06.781676+0000
modified	2021-08-24T13:12:39.190491+0000
tableserver	0
root	0
session_timeout	60
session_autoclose	300
max_file_size	1099511627776
min_compat_client	0 (unknown)
last_failure	0
last_failure_osd_epoch	289
compat	compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds	1
in	0
up	{0=64707}
failed
damaged
stopped
data_pools	[8]
metadata_pool	7
inline_data	disabled
balancer
standby_count_wanted	1
[mds.ceph-mon1{0:64707} state up:active seq 4 addr [v2:172.31.0.11:6800/1064976942,v1:172.31.0.11:6801/1064976942]]

3.3. 設置多主active

# 現在三台mds機器,可以設置多主存活
# 設置同時活躍的主 mds 最 大值為 2。
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs set cephfs-test-1 max_mds 2
# 驗證
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph mds stat
cephfs-test-1:2 {0=ceph-mon1=up:active,1=ceph-mon3=up:active} 1 up:standby
# 兩個存活,一個備份
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status
cephfs-test-1 - 1 clients
=============
RANK  STATE      MDS        ACTIVITY     DNS    INOS
 0    active  ceph-mon1  Reqs:    0 /s    15     16
 1    active  ceph-mon3  Reqs:    0 /s    10     13
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata  3251k  45.0G
  cephfs-data-pool-1      data     192k  45.0G
STANDBY MDS
 ceph-mon2
MDS version: ceph version 15.2.14 (cd3bb7e87a2f62c1b862ff3fd8b1eec13391a5be) octopus (stable)

# 可以繼續新增一台mds作為兩主兩從的架構
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mgr1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ubuntu/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy mds create ceph-mgr1
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  subcommand                    : create
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f3b6c08ec30>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  func                          : <function mds at 0x7f3b6c06b3d0>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  mds                           : [('ceph-mgr1', 'ceph-mgr1')]
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.mds][DEBUG ] Deploying mds, cluster ceph hosts ceph-mgr1:ceph-mgr1
[ceph-mgr1][DEBUG ] connection detected need for sudo
[ceph-mgr1][DEBUG ] connected to host: ceph-mgr1
[ceph-mgr1][DEBUG ] detect platform information from remote host
[ceph-mgr1][DEBUG ] detect machine type
[ceph_deploy.mds][INFO  ] Distro info: Ubuntu 18.04 bionic
[ceph_deploy.mds][DEBUG ] remote host will use systemd
[ceph_deploy.mds][DEBUG ] deploying mds bootstrap to ceph-mgr1
[ceph-mgr1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.mds][ERROR ] RuntimeError: config file /etc/ceph/ceph.conf exists with different content; use --overwrite-conf to overwrite
[ceph_deploy][ERROR ] GenericError: Failed to create 1 MDSs

# 上面如果報錯,執行如下命令覆蓋配置:
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf mds create ceph-mgr1
# 我們新增了ceph-mgr1作為mds,看下文件系統狀態
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status
cephfs-test-1 - 1 clients
=============
RANK  STATE      MDS        ACTIVITY     DNS    INOS
 0    active  ceph-mon1  Reqs:    0 /s    15     16
 1    active  ceph-mon3  Reqs:    0 /s    10     13
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata  3251k  45.0G
  cephfs-data-pool-1      data     192k  45.0G
STANDBY MDS
 ceph-mon2
 ceph-mgr1
MDS version: ceph version 15.2.14 (cd3bb7e87a2f62c1b862ff3fd8b1eec13391a5be) octopus (stable)

3.4. 設置多mds active加standby

  • 高可用優化

目前的狀態是 ceph-mon1 和 ceph-mon3 分別是 active 狀態,ceph-mon2 和 ceph-mgr1 分別處 於 standby 狀態,現在可以將 ceph-mgr1 設置為 ceph-mon1 的 standby,將 ceph-mon3 設置 為 ceph-mon2 的 standby,以實現每個主都有一個固定備份角色的結構,則修改配置文件如 下:

# 對應關係
ceph-mgr1 => ceph-mon1
ceph-mon3 => ceph-mon2

# 修改 ceph.conf 配置文件
ubuntu@ceph-deploy:~/ceph-cluster$ cat ceph.conf
[global]
fsid = b7c42944-dd49-464e-a06a-f3a466b79eb4
public_network = 172.31.0.0/24
cluster_network = 192.168.10.0/24
mon_initial_members = ceph-mon1
mon_host = 172.31.0.11
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
[mon]
mon allow pool delete = true

[mds.ceph-mgr1]
mds_standby_for_name = ceph-mon1
mds_standby_replay = true

[mds.ceph-mon3]
mds_standby_for_name = ceph-mon2
mds_standby_replay = true
  • 分發配置文件到mds伺服器並重啟服務
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf config push ceph-{mon1,mon2,mon3,mgr1}

ubuntu@ceph-deploy:~/ceph-cluster$ for node in ceph-{mon1,mon2,mon3,mgr1}; do
ssh $node "sudo systemctl restart ceph-mds@${node}"
done
  • ceph集群 mds 高可用狀態
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status
cephfs-test-1 - 1 clients
=============
RANK  STATE      MDS        ACTIVITY     DNS    INOS
 0    active  ceph-mon2  Reqs:    0 /s    18     16
 1    active  ceph-mon1  Reqs:    0 /s    10     13
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata  3251k  45.0G
  cephfs-data-pool-1      data     192k  45.0G
STANDBY MDS
 ceph-mon3
 ceph-mgr1
MDS version: ceph version 15.2.14 (cd3bb7e87a2f62c1b862ff3fd8b1eec13391a5be) octopus (stable)
# 高可用對應關係如下:
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs get cephfs-test-1

image-20210824223016214

4. Ceph Dashboard

Ceph dashboard 是通過一個 web 介面,對已經運行的 ceph 集群進行狀態查看及功能配置等 功能,早期 ceph 使用的是第三方的 dashboard 組件,如:

  • Calamari

Calamari 對外提供了十分漂亮的 Web 管理和監控介面,以及一套改進的 REST API 介面(不 同於 Ceph 自身的 REST API),在一定程度上簡化了 Ceph 的管理。最初 Calamari 是作為 Inktank 公司的 Ceph 企業級商業產品來銷售,紅帽 2015 年收購 Inktank 後為了更好地推動 Ceph 的 發展,對外宣布 Calamari 開源。官網地址://github.com/ceph/calamari

優點:

  • 管理功能好

  • 介面友好

  • 可以利用它來部署 Ceph 和監控 Ceph

缺點:

  • 非官方

  • 依賴 OpenStack 某些包

  • VSM

Virtual Storage Manager (VSM)是 Intel 公司研發並且開源的一款 Ceph 集群管理和監控軟體, 簡化了一些 Ceph 集群部署的一些步驟,可以簡單的通過 WEB 頁面來操作。官網地址://github.com/intel/virtual-storage-manager

優點:

  • 易部署
  • 輕量級
  • 靈活(可以自定義開發功能)

缺點:

  • 監控選項少
  • 缺乏 Ceph 管理功能
  • Inkscope

Inkscope 是一個 Ceph 的管理和監控系統,依賴於 Ceph 提供的 API,使用 MongoDB 來 存儲實時的監控數據和歷史資訊。官網地址://github.com/inkscope/inkscope

優點:

  • 易部署
  • 輕量級
  • 靈活(可以自定義開發功能)

缺點:

  • 監控選項少
  • 缺乏 Ceph 管理功能
  • Ceph-Dash

Ceph-Dash 是用 Python 開發的一個 Ceph 的監控面板,用來監控 Ceph 的運行狀態。同時 提供 REST API 來訪問狀態數據。官網地址://cephdash.crapworks.de/

優點:

  • 易部署
  • 輕量級
  • 靈活(可以自定義開發功能)

缺點:

  • 功能相對簡單

4.1. 啟動 dashboard 插件

Ceph mgr 是一個多插件(模組化)的組件,其組件可以單獨的啟用或關閉,星新版本需要安裝 dashboard 安保,而且必須安裝在 mgr 節點,否則報錯如下:

ubuntu@ceph-mgr1:~$ sudo apt-cache madison ceph-mgr-dashboard
ceph-mgr-dashboard | 15.2.14-1bionic | //mirrors.tuna.tsinghua.edu.cn/ceph/debian-octopus bionic/main amd64 Packages
ubuntu@ceph-mgr1:~$ sudo apt install -y ceph-mgr-dashboard
Reading package lists... Done
Building dependency tree
Reading state information... Done
ceph-mgr-dashboard is already the newest version (15.2.14-1bionic).
ceph-mgr-dashboard set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.
# 啟用模組
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph mgr module enable dashboard

4.2. 啟用 dashboard 模組

Ceph dashboard 在 mgr 節點進行開啟設置,並且可以配置開啟或者關閉 SSL

# 關閉 SSL
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph config set mgr mgr/dashboard/ssl false
# 指定 dashboard 監聽地址和埠
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph config set mgr mgr/dashboard/ceph-mgr1/server_addr 172.31.0.14
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph config set mgr mgr/dashboard/ceph-mgr1/server_port 9009

ubuntu@ceph-mgr1:~$ sudo systemctl restart [email protected]
ubuntu@ceph-mgr1:~$ sudo systemctl status [email protected][email protected] - Ceph cluster manager daemon
   Loaded: loaded (/lib/systemd/system/[email protected]; indirect; vendor preset: enabled)
   Active: active (running) since Tue 2021-08-24 15:01:07 UTC; 9s ago
 Main PID: 4044 (ceph-mgr)
    Tasks: 33 (limit: 2287)
   CGroup: /system.slice/system-ceph\x2dmgr.slice/[email protected]
           └─4044 /usr/bin/ceph-mgr -f --cluster ceph --id ceph-mgr1 --setuser ceph --setgroup ceph

Aug 24 15:01:07 ceph-mgr1 systemd[1]: Started Ceph cluster manager daemon.
ubuntu@ceph-mgr1:~$ sudo netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:33807         0.0.0.0:*               LISTEN      1444/containerd
tcp        0      0 172.31.0.14:6800        0.0.0.0:*               LISTEN      3750/ceph-mds
tcp        0      0 172.31.0.14:9009        0.0.0.0:*               LISTEN      4044/ceph-mgr
tcp        0      0 172.31.0.14:6801        0.0.0.0:*               LISTEN      3750/ceph-mds
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1115/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1864/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1864/sshd

4.3. 設置 dashboard 賬戶及密碼

ubuntu@ceph-deploy:~/ceph-cluster$ touch pass.txt
ubuntu@ceph-deploy:~/ceph-cluster$ echo "123456" > pass.txt
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph dashboard set-login-credentials admin -i pass.txt
******************************************************************
***          WARNING: this command is deprecated.              ***
*** Please use the ac-user-* related commands to manage users. ***
******************************************************************
Username and password updated

image-20210824230906136

image-20210824231046267

本節暫時結束

Tags: