Ceph集群的使用和操作記錄


這里我們還是基於之前ceph-deploy部署的環境進行測試。直接的部署參考鏈接:https://www.cnblogs.com/qingbaizhinian/p/14011475.html#_label1_3

之前機器環境參考下面的截圖

 

1.存儲池的介紹

之前在介紹ceph資源划分和存儲過程描述的時候,沒有介紹存儲池的概念,這邊我們來介紹一下:

關於存儲池的詳細知識點,可以多多參考中文社區文檔:http://docs.ceph.org.cn/rados/operations/pools/#set-pool-values

1.關於存儲池的概念

Ceph 存儲系統支持“池”概念,存儲池是Ceph中一些對象的邏輯分組。它不是一個連續的分區,而是一個邏輯概念,類似LVM中的卷組(Volume Group)。

Ceph 客戶端從監視器獲取一張集群運行圖(集群內的所有監視器、 OSD 、和元數據服務器節點分布情況),並把對象寫入存儲池poll。存儲池的 size 或副本數、 CRUSH 規則集和歸置組數量決定着 Ceph 如何放置數據。

 

 

存儲池至少可設置以下參數:

  • 對象的所有權/訪問權限;
  • 歸置組數量;以及,
  • 使用的 CRUSH 規則集。

如果你開始部署集群時沒有創建存儲池, Ceph 會用默認存儲池存數據。存儲池提供的功能:

  • 自恢復力: 你可以設置在不丟數據的前提下允許多少 OSD 失效,對多副本存儲池來說,此值是一對象應達到的副本數。典型配置存儲一個對象和它的一個副本(即 size = 2 ),但你可以更改副本數;對糾刪編碼的存儲池來說,此值是編碼塊數(即糾刪碼配置里的 m=2 )。
  • 歸置組: 你可以設置一個存儲池的歸置組數量。典型配置給每個 OSD 分配大約 100 個歸置組,這樣,不用過多計算資源就能得到較優的均衡。配置了多個存儲池時,要考慮到這些存儲池和整個集群的歸置組數量要合理。
  • CRUSH 規則: 當你在存儲池里存數據的時候,與此存儲池相關聯的 CRUSH 規則集可控制 CRUSH 算法,並以此操縱集群內對象及其副本的復制(或糾刪碼編碼的存儲池里的數據塊)。你可以自定義存儲池的 CRUSH 規則。
  • 快照:ceph osd pool mksnap 創建快照的時候,實際上創建了某一特定存儲池的快照。
  • 設置所有者: 你可以設置一個用戶 ID 為一個存儲池的所有者。

要把數據組織到存儲池里,你可以列出、創建、刪除存儲池,也可以查看每個存儲池的利用率。

2.存儲池存儲數據過程和建議

PG 映射到 OSD

每個存儲池都有很多歸置組, CRUSH 動態的把它們映射到 OSD 。 Ceph 客戶端要存對象時, CRUSH 將把各對象映射到某個歸置組。

把對象映射到歸置組在 OSD 和客戶端間創建了一個間接層。由於 Ceph 集群必須能增大或縮小、並動態地重均衡。如果讓客戶端“知道”哪個 OSD 有哪個對象,就會導致客戶端和 OSD 緊耦合;相反, CRUSH 算法把對象映射到歸置組、然后再把各歸置組映射到一或多個 OSD ,這一間接層可以讓 Ceph 在 OSD 守護進程和底層設備上線時動態地重均衡。下列圖表描述了 CRUSH 如何將對象映射到歸置組、再把歸置組映射到 OSD 。

 

 有了集群運行圖副本和 CRUSH 算法,客戶端就能精確地計算出到哪個 OSD 讀、寫某特定對象。

在生產中,一個Pool里設置的PG數量是預先設置的,PG的數量不是隨意設置,需要根據OSD的個數及副本策略來確定,線上盡量不要更改PG的數量,PG的數量的變更將導致整個集群動起來(各個OSD之間copy數據),大量數據均衡期間讀寫性能下降嚴重;

預先規划Pool的規模,設置PG數量;一旦設置之后就不再變更;后續需要擴容就以 Pool 為維度為擴容,通過新增Pool來實現(Pool通過 crushmap實現故障域隔離);

 

3.存儲池相關命令介紹

#列出集群中的存儲池,在新安裝好的集群上,只有一個 rbd 存儲池。但是ceph-deploy安裝的沒有創建創建存儲池
[root@ceph-deploy ~]# ceph osd lspools
#在ceph集群中創建一個pool,下面的test-pool是你自己定義的存儲池名稱,第一個128是指PG,第二個128是指PGP,
具體兩者的區別可以參考下面的我后面的解釋
[root@ceph-deploy ~]# ceph osd pool create test-pool 128 128
pool 'test-pool' created
#設置存儲池配額,存儲池配額可設置最大字節數、和/或每存儲池最大對象數。要取消配額,設置為 0
[root@ceph-deploy ~]# ceph osd pool set-quota test-pool max_objects 10000      #這里是設置最大對象數為10000
[root@ceph-deploy ~]# ceph osd pool set-quota test-pool max_bytes 10000000000000 #這里設置最大存儲空間為10T

#刪除存儲池,(集群名字需要重復兩次),注意如果你給自建的存儲池創建了定制的規則集,你不需要存儲池時最好刪除它。
如果你曾嚴格地創建了用戶及其權限給一個存儲池,但存儲池已不存在,最好也刪除那些用戶。

[root@ceph-deploy ~]# ceph osd pool delete test-pool test-pool --yes-i-really-really-mean-it
#注意在執行上面命令刪除存儲池過程中出現下面的錯誤,需要到mon節點的配置文件/etc/ceph/ceph.conf里添加或修改如下一行mon allow pool delete = true
然后執行
systemctl restart ceph-mon.target重啟ceph-mon服務
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
#顯示集群中pool的詳細信息

[root@ceph-deploy ~]# rados df
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD WR_OPS WR
test-pool 0 B 0 0 0 0 0 0 0 0 B 0 0 B

total_objects 0
total_used 3.7 GiB
total_avail 86 GiB
total_space 90 GiB

#給一個pool創建一個快照,前面test-pool是存儲池名,后面test-pool-snap是你自己指定的快照名

 

[root@ceph-deploy ~]# ceph osd pool mksnap test-pool test-pool-snap
created pool test-pool snap test-pool-snap

#刪除pool的快照

[root@ceph-deploy ~]# ceph osd pool rmsnap test-pool test-pool-snap

#查看存儲池中PG的數量

[root@ceph-deploy ~]# ceph osd pool get test-pool pg_num
pg_num: 128

#設置存儲池的副本數為3

[root@ceph-deploy ~]# ceph osd pool set test-pool size 3

 #設置data池能接受寫操作的最小副本為2

[root@ceph-deploy ~]# ceph osd pool set test-pool min_size 2

#要獲取對象副本數,執行命令:

[root@ceph-deploy ~]# ceph osd dump | grep 'replicated size'

 存儲池中PG和PGP概念的區別和理解:

  • PG是指定存儲池存儲對象的目錄有多少個,PGP是存儲池PG的OSD分布組合個數
  • PG的增加會引起PG內的數據進行分裂,分裂到相同的OSD上新生成的PG當中
  • PGP的增加會引起部分PG的分布進行變化,但是不會引起PG內對象的變動

簡單理解就是我們把PG的值理解成一個口袋,然后口袋里面裝的是對象數據,然后OSD就相當於一個箱子。對象數據裝入口袋,口袋裝入箱子。現在對象數據的量是固定的,如果PG設為1個,也就是對象數據都會放在一個口袋里,然后放在箱子里,如果PG數量增加了,那么其實加的是口袋的數量,也就是之前可能一個箱子內放的是一個口袋,現在放了兩個口袋,但是對象數據的量是固定的啊,所以就會根據算法,把對象數據放到新的口袋,但是這種變化是在一個箱子內部的,並不是跨箱子的。然后PGP的值可以理解成口袋的分布的一個指定。這樣可能不好理解,你可以這樣理解,本身一共有12個口袋,然后PGP的值是6,那么這12個口袋就會均勻的分布在6個箱子里面,每個箱子兩個,這個時候如果把PGP設為12個,那么就會自動的從每個箱子里拿出一共口袋,放到新的箱子里來。這種變化是跨箱子的。

確定pg_num取值是強制性的,因為不能自動計算。下面是幾個常用的值:

•少於5 個OSD 時可把pg_num設置為128•OSD

數量在5 到10 個時,可把pg_num設置為512•OSD

數量在10 到50 個時,可把pg_num設置為4096•OSD

數量大於50 時,你得理解權衡方法、以及如何自己計算pg_num取值

 

 

 

2.塊設備的快速入門

1.安裝ceph客戶端

Ceph塊設備,以前稱為RADOS塊設備,為客戶機提供可靠的、分布式的和高性能的塊存儲磁盤。RADOS塊設備利用librbd庫並以順序的形式在Ceph集群中的多個osd上存儲數據塊。RBD是由Ceph的RADOS層支持的,因此每個塊設備都分布在多個Ceph節點上,提供了高性能和優異的可靠性。RBD有Linux內核的本地支持,這意味着RBD驅動程序從過去幾年就與Linux內核集成得很好。除了可靠性和性能之外,RBD還提供了企業特性,例如完整和增量快照、瘦配置、寫時復制克隆、動態調整大小等等。RBD還支持內存緩存,這大大提高了其性能:

任何普通的Linux主機(RHEL或基於debian的)都可以充當Ceph客戶機。客戶端通過網絡與Ceph存儲集群交互以存儲或檢索用戶數據。CephRBD支持已經添加到Linux主線內核中,從2.6.34和以后的版本開始

 

#我們之間在之前的ceph-deploy節點上演示客戶端掛載塊設備,如果是其他節點,執行的命令都一樣,我們先安裝ceph
[root@ceph-deploy ~]# ceph-deploy install ceph-deploy
#接下來用 ceph-deploy 把 Ceph 配置文件和 ceph.client.admin.keyring 拷貝到 ceph-deploy節點上。
[root@ceph-deploy ~]# ceph-deploy admin ceph-deploy
#上面命令,ceph-deploy 工具會把密鑰環復制到 /etc/ceph 目錄,要確保此密鑰環文件有讀權限。我們可以執行下面命令
[root@ceph-deploy ~]#chmod +r /etc/ceph/ceph.client.admin.keyring

2.環境檢查

#檢查內核版本是否符合要求
  需要注意:
        1、linux內核從2.6.32版本開始支持ceph 2、建議使用2.6.34以及以上的內核版本
[root@ceph-deploy ceph]# uname -r
4.4.248-1.el7.elrepo.x86_64
#檢查環境是否支持RBD
[root@ceph-deploy ceph]# modprobe rbd
[root@ceph-deploy ceph]# echo $?
0

3.客戶端創建塊設備及映射和取消映射刪除塊設備

 
         

#默認創建塊設備,會直接創建在rbd池中,但使用deploy 安裝后,該rbd池並沒有創建。所以我們這里創建rbd存儲池,並初始化

[root@ceph-deploy ~]# ceph osd pool create rbd 128

[root@ceph-deploy ~]# rbd pool init rbd


#下面命令會創建一個名為test-rbd1,大小為10G的塊設備鏡像。這里--image-feature的作用是在創建塊設備的時候指明需要的特性。

不然后面可能出一下報錯。上面講了默認塊存儲建子啊rbd池中,這里可以通過-p參數改變池 [root@ceph
-deploy ~]# rbd create --size 10240 test-rbd1 --image-feature layering #列出現在集群中有哪些rbd設備鏡像
[root@ceph
-deploy ~]# rbd ls test-rbd1 #查看創建后的塊設備的信息
[root@ceph
-deploy ~]# rbd --image test-rbd1 info rbd image 'test-rbd1': size 10 GiB in 2560 objects order 22 (4 MiB objects) id: 5e7b6b8b4567 block_name_prefix: rbd_data.5e7b6b8b4567 format: 2 features: layering op_features: flags: create_timestamp: Tue Jan 12 15:35:57 2021 #通過下面命令把創建好的塊設備鏡像映射到本地。
[root@ceph
-deploy ~]# rbd map --image test-rbd1
#映射過程中我們發現以下報錯。
rbd: sysfs write failed In some cases useful info
is found in syslog - try "dmesg | tail". rbd: map failed: (110) Connection timed out
#按報錯提示,我們執行下面命令,發現出錯的原因

[root@ceph-deploy ~]# dmesg |tail
[535525.898069] libceph: mon0 172.31.46.63:6789 feature set mismatch, my 106b84a842a42 < server's 40106b84a842a42, missing 400000000000000
[535525.898128] libceph: mon0 172.31.46.63:6789 missing required protocol features

#解決過程如下

  1.修改Ceph配置文件/etc/ceph/ceph.conf(集群中每個節點都要改),在global section下,增加

rbd_default_features = 1

2.然后重啟ceph守護進程(每個節點都做) systemctl stop ceph.target systemctl start ceph.target 3.關閉不需要的特性
[root@ceph
-deploy ~]# ceph osd crush tunables hammer adjusted tunables profile to hammer #然后重新執行映射
[root@ceph
-deploy ~]# rbd map --image
test-rbd1 /dev/rbd0 #查看塊設備的映射信息
[root@ceph
-deploy ~]# rbd showmapped id pool image snap device 0 rbd test-rbd1 - /dev/rbd0 #接下來我們就可以按正常硬盤來進行格式化使用了
[root@ceph
-deploy ~]# fdisk -l [root@ceph-deploy ~]# mkfs.ext4 /dev/rbd0 [root@ceph-deploy ~]# mkdir /test-rbd [root@ceph-deploy ~]# mount /dev/rbd0 /test-rbd/
#如果想把塊設備進行擴容,可以執行下面的命令,下面的命令表示把test-rbd1這個塊設備擴容到20G
[root@ceph-deploy ~]# rbd resize --size 20480 test-rbd1
#擴容完塊設備后,還需要執行下面命令,對塊設備磁盤進行文件系統在線擴容
[root@ceph-deploy ~]# resize2fs /dev/rbd0
#通過下面的幾條命令取消映射塊設備,和刪除塊設備

[root@ceph
-deploy ~]# umount /test-rbd/ #取消映射
[root@ceph-deploy ~]# rbd unmap /dev/rbd/rbd/test-rbd1
#查看是否取消成功,如沒有任何輸出則表示取消映射成功
[root@ceph-deploy ~]# rbd showmapped
#刪除塊設備並檢查 [root@ceph
-deploy ~]# rbd rm test-rbd1 Removing image: 100% complete...done. [root@ceph-deploy ~]# rbd ls

 

 

3.文件系統的快速入門

這里我們還是ceph的部署管理節點演示如何使用的ceph的文件存儲。

#CephFs需要用到MDS服務,所以我們這里需要在集群中部署mds服務,我們這里選擇部署在node1節點上
[manager@ceph-deploy my-cluster]$ ceph-deploy mds create node1 #一個 Ceph 文件系統需要至少兩個 RADOS 存儲池,一個用於數據、一個用於元數據。配置這些存儲池時需考慮:
  • 為元數據存儲池設置較高的副本水平,因為此存儲池丟失任何數據都會導致整個文件系統失效。
  • 為元數據存儲池分配低延時存儲器(像 SSD ),因為它會直接影響到客戶端的操作延時。
#創建數據pool,名字叫cephfs_data
[manager@ceph
-deploy my-cluster]$ ceph osd pool create cephfs_data 64
#創建元數據池,名字叫cephfs_metadata [manager@ceph-deploy my-cluster]$ ceph osd pool create cephfs_metadata 64 #創建好存儲池后,你就可以用 fs new 命令創建文件系統了(如下)
ceph fs
new cephfs cephfs_metadata cephfs_data #通過下面幾條命令,查看mds,存儲池pool,CephFS
[manager@ceph
-deploy my-cluster]$ ceph mds stat cephfs-1/1/1 up {0=node1=up:active} [manager@ceph-deploy my-cluster]$ ceph osd pool ls cephfs_data cephfs_metadata [manager@ceph-deploy my-cluster]$ ceph fs ls name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ] [manager@ceph-deploy my-cluster]$ ceph -s cluster: id: a3da0081-4306-4b89-b1aa-45db06909d43 health: HEALTH_OK services: mon: 1 daemons, quorum node1 mgr: node1(active), standbys: node3, node2 mds: cephfs-1/1/1 up {0=node1=up:active} osd: 3 osds: 3 up, 3 in data: pools: 2 pools, 128 pgs objects: 22 objects, 2.2 KiB usage: 3.0 GiB used, 87 GiB / 90 GiB avail pgs: 128 active+clean #創建用戶名為cephfs的用戶,並為mon,mds,osd分配權限,並指定pool(可選,因為部署時已經生成了一個admin的key,這里我們新建一個)
[manager@ceph
-deploy my-cluster]$ ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=cephfs_data' -o ceph.client.cephfs.keyring #查看生成的密鑰
[manager@ceph
-deploy my-cluster]$ cat ceph.client.cephfs.keyring [client.cephfs] key = AQCSZv5fynH1AhAAMF7BYivQwGTOdUZDihuNYg== #因為我們這里就是在部署管理節點上進行文件存儲掛載的演示,如果是其他節點進行掛載的,還需要執行下面的命令把密鑰文件拷貝到對應節點(可以不拷貝到客戶機上,客戶機掛載時只需使用上面key里面的內容即可),
記住客戶機上一定需要部署ceph(
部署過程就不演示了,可以參考上面塊存儲一開始安裝ceph的步驟)
scp ceph.client.cephfs.keyring root@234.234.234.234:/etc/ceph #一般Ceph我們都啟用了Ceph 認證所有掛載的時候需要name 和secret ceph.client.cephfs.keyring文件信息,可通過下面的命令檢查是否開啟的驗證,cephx表示開啟
了驗證
[manager@ceph-deploy my-cluster]$ cat /etc/ceph/ceph.conf | grep auth | grep required auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx #通過下面命令把key保存在文件里,用於下面的內核驅動形式掛載。
[root@ceph
-deploy ceph]# echo AQCSZv5fynH1AhAAMF7BYivQwGTOdUZDihuNYg== > /etc/ceph/cephfskey
#ceph文件存儲掛載分為通過內核驅動掛載和FUSE客戶端兩種方式掛載。

#下面我們命令我們演示的是有認證情況下,通過內核驅動是如何掛載的,如果沒有認證,就不用指定-o以及后面的參數,這里node1為mds的主節點。
[root@ceph
-deploy ceph]# mount -t ceph node1:6789:/ /cephfs/ -o name=cephfs,secretfile=/etc/ceph/cephfskey
#
如果想要開機掛載,執行下面命令就行了。
[root@node2 ~]# echo "node1:6789:/ /cephfs ceph name=cephfs,secretfile=/etc/ceph/cephfskey,_netdev,noatime 0 0" >> /etc/fstab
#fuse客戶端掛載,這種適用於內核低於2.6.34的,或者您有任何應用程序依賴項,
#首先我們配置好ceph的yum源,這里不演示了,然后執行下面命令安裝fuse客戶端
[root@ceph-deploy ~]# yum install ceph-fuse -y
#把ceph 服務器上生成的cephfskey復制到客戶端因為我就是在部署管理節點進行演示的,所以不用復制,然后通過下面的命令指定key進行fuse客戶端掛載。
 不指定key文件掛載(默認回去/etc/ceph/目錄下找 對應的用戶名key文件)
[root@ceph-deploy ~]# ceph-fuse --keyring /home/manager/my-cluster/ceph.client.cephfs.keyring --name client.cephfs -m 172.31.46.63:6789 /cephfs2
#fuse客戶端開機掛載,可以執行下面命令,因為 keyring文件包含了用戶名,所以fstab不需要指定用了
[root@ceph-deploy ~]# echo "id=cephfs,keyring=/home/manager/my-cluster/ceph.client.cephfs.keyring /cephfs2 fuse.ceph defaults 0 0 _netdev" >> /etc/fstab

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM