分散式存儲系統之Ceph集群存儲池操作
- 2022 年 10 月 6 日
- 筆記
- ceph, 創建存儲池, 刪除存儲池, 存儲池快照, 存儲池數據壓縮, 存儲池重命名, 糾刪碼池配置文件, 獲取存儲池的相關資訊, 設置存儲池配額, 配置存儲池參數
前文我們了解了ceph的存儲池、PG、CRUSH、客戶端IO的簡要工作過程、Ceph客戶端計算PG_ID的步驟的相關話題,回顧請參考//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 ~]$