分散式儲存系統之Ceph叢集儲存池操作

2022-10-06 21:00:08

  前文我們瞭解了ceph的儲存池、PG、CRUSH、使用者端IO的簡要工作過程、Ceph使用者端計算PG_ID的步驟的相關話題,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/16733806.html;今天我們來聊一聊在ceph上操作儲存池相關命令的用法和說明;

  在ceph上操作儲存池不外乎就是檢視列出、建立、重新命名和刪除等操作,常用相關的工具都是「ceph osd pool」的子命令,ls、create、rename和rm等;

  1、建立儲存池

  副本型儲存池建立命令格式

 ceph osd pool create <pool-name> <pg-num> [pgp-num] [replicated] [crush-rule-name] [expected-num-objects]

  提示:建立副本型儲存池上面的必要選項有儲存池的名稱和PG的數量,後面可以不用跟pgp和replicated來指定儲存池的pgp的數量和型別為副本型;即預設建立不指定儲存池型別,都是建立的是副本池;

  糾刪碼池儲存池建立命令格式

 ceph osd pool create <pool-name> <pg-num> <pgp-num> erasure [erasure-code-profile] [crush-rule-name] [expected-num-objects]

  提示:建立糾刪碼池儲存池,需要給定儲存池名稱、PG的數量、PGP的數量已經明確指定儲存池型別為erasure;這裡解釋下PGP,所謂PGP(Placement Group for Placement purpose)就是用於歸置的PG數量,其值應該等於PG的數量; crush-ruleset-name是用於指定此儲存池所用的CRUSH規則集的名稱,不過,參照的規則集必須事先存在;

  erasure-code-profile引數是用於指定糾刪碼池組態檔;未指定要使用的糾刪編碼組態檔時,建立命令會為其自動建立一個,並在建立相關的CRUSH規則集時使用到它;預設組態檔自動定義k=2和m=1,這意味著Ceph將通過三個OSD擴充套件物件資料,並且可以丟失其中一個OSD而不會丟失資料,因此,在冗餘效果上,它相當於一個大小為2的副本池 ,不過,其儲存空間有效利用率為2/3而非1/2。

  範例:建立一個副本池

  範例:建立一個糾刪碼池

  2、獲取儲存池的相關資訊

  列出儲存池:ceph osd pool ls [detail]

[cephadm@ceph-admin ~]$ ceph osd pool ls 
testpool
rbdpool
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
cephfs-metadatpool
cephfs-datapool
reppool
erasurepool
[cephadm@ceph-admin ~]$ ceph osd pool ls detail 
pool 1 'testpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 16 pgp_num 16 last_change 42 flags hashpspool stripe_width 0
pool 2 'rbdpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 81 flags hashpspool,selfmanaged_snaps stripe_width 0 application rbd
        removed_snaps [1~3]
pool 3 '.rgw.root' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 84 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgw
pool 4 'default.rgw.control' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 87 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgw
pool 5 'default.rgw.meta' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 89 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgw
pool 6 'default.rgw.log' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 91 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgw
pool 7 'cephfs-metadatpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 99 flags hashpspool stripe_width 0 application cephfs
pool 8 'cephfs-datapool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 99 flags hashpspool stripe_width 0 application cephfs
pool 9 'reppool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 last_change 126 flags hashpspool stripe_width 0
pool 10 'erasurepool' erasure size 3 min_size 2 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 last_change 130 flags hashpspool stripe_width 8192

[cephadm@ceph-admin ~]$ 

  提示:後面接detail表示列出儲存池的詳細資訊;

  獲取儲存池的統計資料:ceph osd pool stats [pool-name]

[cephadm@ceph-admin ~]$ ceph osd pool stats reppool
pool reppool id 9
  nothing is going on

[cephadm@ceph-admin ~]$ ceph osd pool stats 
pool testpool id 1
  nothing is going on

pool rbdpool id 2
  nothing is going on

pool .rgw.root id 3
  nothing is going on

pool default.rgw.control id 4
  nothing is going on

pool default.rgw.meta id 5
  nothing is going on

pool default.rgw.log id 6
  nothing is going on

pool cephfs-metadatpool id 7
  nothing is going on

pool cephfs-datapool id 8
  nothing is going on

pool reppool id 9
  nothing is going on

pool erasurepool id 10
  nothing is going on

[cephadm@ceph-admin ~]$ 

  提示:不指定儲存池名稱表示檢視所有儲存池的統計資料;

  顯示儲存池的用量資訊:rados df 或者ceph df

[cephadm@ceph-admin ~]$ rados df
POOL_NAME              USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS     RD WR_OPS     WR 
.rgw.root           1.1 KiB       4      0     12                  0       0        0     27 18 KiB      4  4 KiB 
cephfs-datapool         0 B       0      0      0                  0       0        0      0    0 B      0    0 B 
cephfs-metadatpool  2.2 KiB      22      0     66                  0       0        0     49 51 KiB     46 13 KiB 
default.rgw.control     0 B       8      0     24                  0       0        0      0    0 B      0    0 B 
default.rgw.log         0 B     175      0    525                  0       0        0  16733 16 MiB  11158    0 B 
default.rgw.meta        0 B       0      0      0                  0       0        0      0    0 B      0    0 B 
erasurepool             0 B       0      0      0                  0       0        0      0    0 B      0    0 B 
rbdpool               389 B       5      0     15                  0       0        0     50 32 KiB     19 10 KiB 
reppool                 0 B       0      0      0                  0       0        0      0    0 B      0    0 B 
testpool                0 B       0      0      0                  0       0        0      2  2 KiB      2  1 KiB 

total_objects    214
total_used       10 GiB
total_avail      890 GiB
total_space      900 GiB
[cephadm@ceph-admin ~]$ 

  提示:rados df和ceph df顯示稍微有點差別,rados 資訊比較全面但偏底層;ceph df人類比較容易看懂;

  3、儲存池重新命名

  命令格式:ceph osd pool rename old-name new-name

  4、刪除儲存池

  我們知道刪除儲存池意味著資料的丟失;所以ceph為了防止我們意外刪除儲存池實施了兩個機制;我們要刪除儲存池,必須先禁用這兩個機制;

  第一個機制是NODELETE標誌,其值需要為false,預設也是false;即允許我們刪除;第二個機制是叢集範圍的設定引數mon allow pool delete,其預設值為「false」,這表示預設不能刪除儲存池;即我們要刪除儲存池,需要將第二個機制mon allow pool delete 的值修改為true即可刪除儲存池;

  檢視nodelete的值命令格式:ceph osd pool get pool-name nodelete

  修改命令nodelete的值命令格式:ceph osd pool set pool-name nodelete false|true

  提示:我們要刪儲存池,需要將nodelete的值設定為false,即不允許刪除為假,即表示允許刪除;

  修改mon allow pool delete的值命令格式:ceph tell mon.* injectargs --mon-allow-pool-delete={true|false}

  提示:刪除之前將其值設定為true,刪除完成後再改為false;

  刪除rep-pool儲存池

  提示:雖然我們進用了上述的兩個防止意外刪除儲存池的機制外,我們在直接刪除儲存池ceph還會提示我們需要將儲存池的名稱寫兩遍以及加--yes-i-really-really-mean-it選項來確定刪除儲存池的操作;

  提示:刪除需要刪除的儲存池以後,我們需要將mon allow pool delete的值修改為false防止後面誤刪除儲存池;

  5、設定儲存池配額

  Ceph支援為儲存池設定可儲存物件的最大數量(max_objects)和可佔用的最大空間(max_bytes)兩個緯度的配額,命令格式ceph osd pool set-quota <pool-name> max_objects|max_bytes <val>;獲取儲存池配額的相關資訊命令格式:ceph osd pool get-quota <pool-name>;

  6、設定儲存池引數

  儲存池的諸多設定屬性儲存於設定引數中,獲取設定:ceph osd pool get <pool-name> <key>;設定設定:ceph osd pool set <pool-name> <key> <value>;

  儲存池常用的可設定引數

  size:儲存池中的物件副本數;

  min_size:I/O所需要的最小副本數;

  pg_num:儲存池的PG數量;

  pgp_num:計算資料歸置時要使用的PG的有效數量;

  crush_ruleset:用於在叢集中對映物件歸置的規則組;

  nodelete:控制是否可刪除儲存池;

  nopgchange:控制是否可更改儲存池的pg_num和pgp_num;

  nosizechange:控制是否可更改儲存池的大小;

  noscrub和nodeep-scrub:控制是否可整理或深層整理儲存池以解決臨時高I/O負載的問題;

  scrub_min_interval:叢集負載較低時整理儲存池的最小時間間隔;預設值為0,表示其取值來自於組態檔中的osd_scrub_min_interval引數;

  scrub_max_interval:整理儲存池的最大時間間隔;預設值為0,表示其取值來自於組態檔中的osd_scrub_max_interval引數;

  deep_scrub_interval:深層整理儲存池的間隔;預設值為0,表示其取值來自於組態檔中的osd_deep_scrub引數;

  7、儲存池快照

  關於儲存池快照

  • 儲存池快照是指整個儲存池的狀態快照;

  • 通過儲存池快照,可以保留儲存池狀態的歷史;

  • 建立儲存池快照可能需要大量儲存空間,具體取決於儲存池的大小;

  建立儲存池快照命令格式: ceph osd pool mksnap <pool-name> <snap-name>或者rados -p <pool-name> mksnap <snap-name>

  列出儲存池的快照命令格式:rados -p <pool-name> lssnap

[cephadm@ceph-admin ~]$ ceph osd pool mksnap cephfs-metadatpool metadatasnap1
created pool cephfs-metadatpool snap metadatasnap1
[cephadm@ceph-admin ~]$ rados -p cephfs-metadatpool lssnap
1       metadatasnap1   2022.09.30 00:20:55
1 snaps
[cephadm@ceph-admin ~]$ 

  回滾儲存池至指定的快照命令格式: rados -p <pool-name> rollback <pool-name> <snap-name>

[cephadm@ceph-admin ~]$ rados -p cephfs-metadatpool lssnap
1       metadatasnap1   2022.09.30 00:20:55
2       metadatasnap2   2022.09.30 00:22:35
2 snaps
[cephadm@ceph-admin ~]$ rados -p cephfs-metadatpool rollback  cephfs-metadatpool metadatasnap2
rolled back pool cephfs-metadatpool to snapshot metadatasnap2
[cephadm@ceph-admin ~]$ 

  刪除儲存池快照命令格式: ceph osd pool rmsnap <pool-name> <snap-name>或 rados -p <pool-name> rmsnap <snap-name>

[cephadm@ceph-admin ~]$ rados -p cephfs-metadatpool lssnap
1       metadatasnap1   2022.09.30 00:20:55
2       metadatasnap2   2022.09.30 00:22:35
2 snaps
[cephadm@ceph-admin ~]$ ceph osd pool rmsnap cephfs-metadatpool metadatasnap1
removed pool cephfs-metadatpool snap metadatasnap1
[cephadm@ceph-admin ~]$ rados -p cephfs-metadatpool lssnap                   
2       metadatasnap2   2022.09.30 00:22:35
1 snaps
[cephadm@ceph-admin ~]$ rados -p cephfs-metadatpool rmsnap metadatasnap2
removed pool cephfs-metadatpool snap metadatasnap2
[cephadm@ceph-admin ~]$ rados -p cephfs-metadatpool lssnap
0 snaps
[cephadm@ceph-admin ~]$ 

  提示:不用的快照建議及時清除;

  8、儲存池資料壓縮

  BlueStore儲存引擎提供即時資料壓縮,以節省磁碟空間,啟用壓縮命令格式:ceph osd pool set <pool-name> compression_algorithm snappy;壓縮演演算法有none、zlib、lz4、zstd和snappy等幾種,預設為snappy;zstd有較好的壓縮比,但比較消耗CPU;lz4和snappy對CPU佔用比例較低;不建議使用zlib;

  設定壓縮模式命令格式:ceph osd pool set <pool-name> compression_mode aggressive ;壓縮模式:none、aggressive、passive和force,預設值為none; none表示不壓縮; passive表示若提示COMPRESSIBLE,則壓縮;aggressive表示除非提示INCOMPRESSIBLE,否則就壓縮; force表示始終壓縮;

  其它可用的壓縮引數

  compression_required_ratio:指定壓縮比,取值格式為雙精度浮點型,其值為SIZE_COMPRESSED/SIZE_ORIGINAL,即壓縮後的大小與原始內容大小的比值,預設為.875;

  compression_max_blob_size:壓縮物件的最大體積,無符號整數型數值,預設為0,表示沒有限制;

  compression_min_blob_size:壓縮物件的最小體積,無符號整數型數值,預設為0,表示沒有限制;

  提示:壓縮最小體積和最大體積都是以位元組為單位;

  全域性壓縮選項

  可在ceph組態檔中設定壓縮屬性,它將對所有的儲存池生效;可設定的相關引數如下

  • bluestore_compression_algorithm
  • bluestore_compression_mode
  • bluestore_compression_required_ratio
  • bluestore_compression_min_blob_size
  • bluestore_compression_max_blob_size
  • bluestore_compression_min_blob_size_ssd
  • bluestore_compression_max_blob_size_ssd
  • bluestore_compression_min_blob_size_hdd
  • bluestore_compression_max_blob_size_hdd

  9、糾刪碼池組態檔

  列出糾刪碼組態檔命令格式: ceph osd erasure-code-profile ls

  獲取指定的組態檔的相關內容:ceph osd erasure-code-profile get default

[cephadm@ceph-admin ~]$ ceph osd erasure-code-profile ls
default
[cephadm@ceph-admin ~]$ ceph osd erasure-code-profile get default
k=2
m=1
plugin=jerasure
technique=reed_sol_van
[cephadm@ceph-admin ~]$ 

  自定義糾刪碼組態檔

  命令格式:ceph osd erasure-code-profile set <name> [<directory=directory>]  [<plugin=plugin>] [<crush-device-class>] [<crush-failure-domain>] [<key=value> ...] [--force]

  • - directory:載入糾刪碼外掛的目錄路徑,預設為/usr/lib/ceph/erasure-code;
  • - plugin:用於生成及恢復糾刪碼塊的外掛名稱,預設為jerasure;
  • - crush-device-class:裝置類別,例如hdd或ssd,預設為none,即無視類別;
  • - crush-failure-domain:故障域,預設為host,支援使用的包括osd、host、rack、row和room等;

  • - --force:強制覆蓋現有的同名組態檔;

  例如,如果所需的體系結構必須承受兩個OSD的丟失,並且儲存開銷為30%;

[cephadm@ceph-admin ~]$ ceph osd erasure-code-profile ls
default
[cephadm@ceph-admin ~]$ ceph osd erasure-code-profile set myprofile k=4 m=2 crush-failure-domain=osd
[cephadm@ceph-admin ~]$ ceph osd erasure-code-profile ls
default
myprofile
[cephadm@ceph-admin ~]$ 

  糾刪碼外掛

  Ceph支援以外掛方式載入使用的糾刪編碼外掛,儲存管理員可根據儲存場景的需要優化選擇合用的外掛。目前,Ceph支援的外掛包括如下三個:

  1、jerasure:最為通用的和靈活的糾刪編碼外掛,它也是糾刪碼池預設使用的外掛;不過,任何一個OSD成員的丟失,都需要餘下的所有成員OSD參與恢復過程;另外,使用此類外掛時,管理員還可以通過technique選項指定要使用的編碼技術;

    • reed_sol_van:最靈活的編碼技術,管理員僅需提供k和m引數即可;

    • cauchy_good:更快的編碼技術,但需要小心設定PACKETSIZE引數;
    • reed_sol_r6_op、liberation、blaum_roth或liber8tion:僅支援使用m=2的編碼技術,功能特性類同於RAID 6;

  2、 lrc:全稱為Locally Repairable Erasure Code,即本地修復糾刪碼,除了預設的m個編碼塊之外,它會額外在本地建立指定數量(l)的奇偶校驗塊,從而在一個OSD丟失時,可以僅通過l個奇偶校驗塊完成恢復;

  3、isa:僅支援執行在intel CPU之上的糾刪編碼外掛,它支援reed_sol_van和cauchy兩種技術;

  例如,下面的命令建立了一個使用lrc外掛的組態檔LRCprofile,其本地奇偶校驗塊為3,故障域為osd

[cephadm@ceph-admin ~]$ ceph osd erasure-code-profile set LRCprofile plugin=lrc k=4 m=2 l=3 crush-failure-domain=osd
[cephadm@ceph-admin ~]$ ceph osd erasure-code-profile ls
LRCprofile
default
myprofile
[cephadm@ceph-admin ~]$