CEPH-5:ceph叢集基本概念與管理

vfanCloud發表於2022-05-05

ceph叢集基本概念與管理

ceph叢集基本概念

  1. ceph叢集整體結構圖
名稱 作用
osd 全稱Object Storage Device,主要功能是儲存資料、複製資料、平衡資料、恢復資料等。每個OSD間會進行心跳檢查,並將一些變化情況上報給Ceph Monitor。
mon 全稱Monitor,負責監視Ceph叢集,維護Ceph叢集的健康狀態,同時維護著Ceph叢集中的各種Map圖,比如OSD Map、Monitor Map、PG Map和CRUSH Map,這些Map統稱為Cluster Map,根據Map圖和object id等計算出資料最終儲存的位置。
mgr 全稱Manager,負責跟蹤執行時指標和Ceph叢集的當前狀態,包括儲存利用率,當前效能指標和系統負載。
mds 全稱是MetaData Server,主要儲存的檔案系統服務的後設資料,如果使用cephfs功能才會啟用它,物件儲存和塊儲存裝置是不需要使用該服務。
rgw 全稱radosgw,是一套基於當前流行的RESTFUL協議的閘道器,ceph物件儲存的入口,內嵌civetweb服務,不啟用物件儲存,則不需要安裝。
  1. ceph配置檔案

    標準位置:/etc/ceph/ceph.conf

    組成部分:

    ## 全域性配置,全域性生效
    [global]
    fsid = 537175bb-51de-4cc4-9ee3-b5ba8842bff2
    public_network = 10.0.0.0/8
    cluster_network = 10.0.0.0/8
    mon_initial_members = ceph-node1
    mon_host = 10.153.204.xx:6789,10.130.22.xx:6789,10.153.204.xx:6789
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
    
    ## osd專用配置,可以使用osd.num 來表示具體的哪一個osd
    [osd]
    [osd.1]
    
    ## monitor專用配置,可以使用mon.A 來表示具體的哪一個monitor,其中A表示該節點的名稱,使用ceph mon dump可以檢視。
    [mon]
    [mon.a]
    
    ## 客戶端專用配置
    [client] 
    

    ceph配置檔案的載入順序:

    • $CEPH_CONF 環境變數
    • -c 指定的位置
    • /etc/ceph/ceph.conf
    • ~/.ceph/ceph.conf
    • ./ceph.conf
  2. 儲存池型別

    • 副本池:replicated
      • 定義每個物件在叢集中儲存為多少個副本,預設為三個副本,一主兩備
      • 實現高可用,副本池是 ceph 預設的儲存池型別。
    • 糾刪碼池:erasure code
      • 把各物件儲存為 N=K+M 個塊,其中 K 為資料塊數量,M 為編碼塊數量,因此儲存池的尺寸為 K+M。
      • 即資料儲存在 K 個資料塊,並提供 M 個冗餘塊提供資料高可用,那麼最多能故障的塊就是 M 個,實際的磁碟佔用就是 K+M 塊,因此相比副本池機制比較節省儲存資源,一般採用 8+4 機制,即 8 個資料塊+4 個冗餘塊,那麼也就是 12 個資料塊有 8 個資料塊儲存資料,有 4 個 實現資料冗餘,即 1/3 的磁碟空間用於資料冗餘,比預設副本池的三倍冗餘節省空間,但是不能出現大於一定資料塊故障。
      • 不是所有的應用都支援糾刪碼池,RBD 只支援副本池而 radosgw 則可以支援糾刪碼池。
      • 對於檔案系統及塊儲存,由於讀寫效能的問題 Ceph 不建議使用糾刪碼池。

    如何檢視某個儲存池為什麼型別:

    $ ceph osd pool get test crush_rule
    crush_rule: erasure-code
    
  3. 副本池IO

    • 將一個資料物件儲存為多個副本。
    • 在客戶端寫入操作時,ceph 使用 CRUSH 演算法計算出與物件相對應的 PG ID 和 primary OSD ,主 OSD 根據設定的副本數、物件名稱、儲存池名稱和叢集執行圖(cluster map)計算出 PG 的 各輔助 OSD,然後由 OSD 將資料再同步給輔助 OSD。

    讀寫資料:

    ## 讀資料
    1.客戶端傳送讀請求,RADOS 將請求傳送到主 OSD。
    2.主 OSD 從本地磁碟讀取資料並返回資料,最終完成讀請求。
    
    ## 寫資料
    1.客戶端APP請求寫入資料,RADOS傳送資料到主OSD。
    2.主OSD寫入完畢後將完成訊號給客戶端APP,併傳送資料到各副本OSD。
    3.副本OSD寫入資料,併傳送寫入完成訊號給主OSD。
    
  4. 糾刪碼池 IO

    • Ceph 從 Firefly 版本開始支援糾刪碼,但是不推薦在生產環境使用糾刪碼池。
    • 糾刪碼池降低了資料儲存所需要的磁碟總空間數量,但是讀寫資料的計算成本要比副本池高 ,RGW 可以支援糾刪碼池,RBD 不支援。

    讀寫資料:

    ## 讀資料
    1.從相應的 OSDs 中獲取資料後進行解碼
    2.如果此時有資料丟失,Ceph 會自動從存放校驗碼的 OSD 中讀取資料進行解碼
    3.完成資料解碼後返回資料
    
    ## 寫資料
    1.資料將在主 OSD 進行編碼然後分發到相應的 OSDs 上去
    2.計算合適的資料塊並進行編碼
    3.對每個資料塊進行編碼並寫入OSD
    
  5. PG與PGP

    • PG = Placement Group # 歸置組
    • PGP = Placement Group for Placement purpose # 歸置組的組合,pgp 相當於是 pg 對應 osd 的 一種排列組合關係。

    歸置組(placement group)是用於跨越多osd將資料儲存在每個儲存池中的內部資料結構。 pg 在 osd 守護程式和 ceph 客戶端之間的一箇中間層,hash 演算法負責將每個物件動態對映到一個pg中,此pg即為主pg,按照儲存池的副本數量(例如3個)會再將每個主pg再複製出兩個副本pg,CRUSH 演算法負責將 三個 pg 動態對映到三個不同的 OSD 守護程式中,此三個pg組成一個pgp,從而在 osd 中達到多副本高可用。

    檔案定址流程大致如下圖所示:

File->Objects->PGs->OSDs。

需要注意的幾個點:

  • PG和PGP可以自定義數量,且是針對於儲存池的,但PG總數會根據OSD叢集的大小決定
  • 相對於儲存池來說,PG是一個虛擬元件,它是物件對映到儲存池時使用的虛擬層
  • 出於規模伸縮及效能方面的考慮,ceph將儲存池細分為多個PGP,每個PGP中有一個主PG,主PG所在的OSD節點便是主OSD。
  • 當有新OSD節點加入叢集時,ceph會通過CRUSH重新組合PGP,致使每個OSD都有資料,達到整個叢集的資料平衡。

PG的分配計算:

  • 官方建議:每個osd中的pg數量最好不要超過100個,公式:Total PGS = (Total_number_of _osd * 100) / max_replication_count

  • 具體演算法:舉例現在有12臺osd機器,我需要建立20個儲存池。

    此時pg總數為:12 * 100 / 3 = 400

    平均每個儲存池分配pg數量為:400 / 20 = 20

    這裡計算出,平均每個儲存池可以分配20個pg,但每個儲存池pg的個數推薦為2的N次冪,故2、4、8、16、32、64、128等,這時要結合具體的pool是來儲存什麼,大概能儲存多少資料來進行一個簡單的轉換,如果此pool只儲存一些後設資料,則分配4即可,反之資料量比較大的,可以分配16、32等。

    另外pool中pg個數是推薦用2的整數次冪,也可以不用,但會有警告提示。

PG與PGP組合:

  1. 檢視replicapool池的pg、pgp數量

    $ ceph osd pool get replicapool pg_num 
    pg_num: 32
    $ ceph osd pool get replicapool pgp_num 
    pgp_num: 32
    

    檢視replicapool池的pg、pgp分佈

    $ ceph pg ls-by-pool replicapool | awk '{print $1,$2,$15}'
    PG OBJECTS ACTING
    2.0 596 [3,1,0]p3
    2.1 623 [3,4,0]p3
    2.2 570 [3,4,0]p3
    2.3 560 [3,4,0]p3
    2.4 630 [0,3,4]p0
    2.5 574 [4,0,3]p4
    2.6 572 [4,3,0]p4
    2.7 572 [3,4,0]p3
    2.8 622 [3,4,0]p3
    2.9 555 [0,3,4]p0
    2.a 523 [1,3,0]p1
    2.b 574 [4,3,0]p4
    2.c 620 [4,3,0]p4
    2.d 637 [1,3,0]p1
    2.e 522 [0,3,4]p0
    2.f 599 [4,3,0]p4
    2.10 645 [4,3,0]p4
    2.11 534 [3,4,0]p3
    2.12 622 [4,3,0]p4
    2.13 577 [1,3,0]p1
    2.14 661 [3,4,0]p3
    2.15 626 [1,3,0]p1
    2.16 585 [2,4,0]p2
    2.17 610 [3,4,0]p3
    2.18 610 [4,2,0]p4
    2.19 560 [4,3,0]p4
    2.1a 599 [3,4,0]p3
    2.1b 614 [1,2,0]p1
    2.1c 581 [4,3,0]p4
    2.1d 614 [4,3,0]p4
    2.1e 595 [0,3,1]p0
    2.1f 572 [3,4,0]p3
      
    * NOTE: afterwards
    

PG的狀態解釋:

在osd擴縮容或者一些特殊情況的時候,ceph會以pg為整體進行rebalancing資料重平衡,此時pg會出現很多不同的狀態,例如:

$ ceph -s 
  cluster:
    id:     537175bb-51de-4cc4-9ee3-b5ba8842bff2
    health: HEALTH_WARN
            Degraded data redundancy: 152/813 objects degraded (18.696%), 43 pgs degraded, 141 pgs undersized
 
  services:
    mon: 2 daemons, quorum yq01-aip-aikefu10,bjkjy-feed-superpage-gpu-04 (age 111s)
    mgr: yq01-aip-aikefu10(active, since 11d), standbys: bjkjy-feed-superpage-gpu-04
    mds: mycephfs:1 {0=ceph-node2=up:active} 1 up:standby
    osd: 8 osds: 8 up (since 3d), 8 in (since 3d); 124 remapped pgs
    rgw: 2 daemons active (ceph-node1, ceph-node2)
 
  task status:
 
  data:
    pools:   8 pools, 265 pgs
    objects: 271 objects, 14 MiB
    usage:   8.1 GiB used, 792 GiB / 800 GiB avail
    pgs:     152/813 objects degraded (18.696%)
             114/813 objects misplaced (14.022%)
             111 active+clean+remapped
             98  active+undersized
             43  active+undersized+degraded
             13  active+clean
  • clean:乾淨態,PG當前不存在待修復的物件,並且大小等於儲存池的副本數,即PG的活動集(Acting Set)和上行集(Up Set)為同一組 OSD 且內容一致。
  • active:就緒狀態或活躍狀態,Active 表示主 OSD 和備 OSD 處於正常工作狀態,此時的 PG 可以正常 處理來自客戶端的讀寫請求,正常的 PG 預設就是 Active+Clean 狀態。
  • peering:正在同步狀態,同一個 PG 中的OSD需要將準備資料同步一致,而Peering(對等)就是OSD同步過程中的狀態。
  • activating:Peering 已經完成,PG 正在等待所有 PG 例項同步 Peering 的結果(Info、Log 等)
  • degraded:降級狀態,出現於 OSD 被標記為 down 以後,那麼其他對映到此 OSD 的 PG 都會轉換到降級狀態,如果此OSD被標記為down的時間超過 5 分鐘還沒有修復,ceph 會對被降級的 PG 啟動恢復操作,直到所有由於此 OSD 而被降級的 PG 重新恢復為 clean 狀態。
  • undersized:PG 當前副本數小於其儲存池定義的值的時候,PG 會轉換為 undersized 狀態,直到新增備 份 OSD 新增完成,或者修復完成。
  • remapped:當 pg 改變, 資料從舊的 OSD 遷移到新的 OSD, 新的主 OSD 應該請求將會花費一段時間, 在這段時間內, 將會繼續向舊主 OSD 請求服務, 直到 PG 遷移完成。
  • scrubbing:scrub 是 ceph 對資料的清洗狀態,用來保證資料完整性的機制,Ceph 的 OSD 定期啟動 scrub 執行緒來掃描部分物件,通過與其他副本比對來發現是否一致,主要檢查後設資料(metadata )資訊,比如檔名、object屬性、大小等,如果不一樣,就會從主pg複製一份過去。
  • stale:過期狀態,正常狀態下,每個OSD都要週期性的向 RADOS 叢集中的監視器(mon)報告其作為OSD所持有的所有主PG的最新統計資料,因任何原因導致某個OSD無法正常向監視器傳送彙報資訊的、或者由其他OSD報告某個OSD已經down的時候,則所有以此OSD為主PG則會立即被標記為stale狀態,即它們的主 OSD 已經不是最新的資料了。
  • recovering:正在恢復態,叢集正在執行遷移或同步物件和他們的副本。這可能是由於新增了一個新的OSD到叢集中或者某個OSD 宕掉後,PG被CRUSH演算法重新分配到不同的OSD,其中PG發生內部資料同步的過程。
  • backfilling:後臺填充態,backfill 是recovery的一種特殊場景,指peering完成後,如果基於當前權威日誌無法對Up Set(上行集)當中的某些PG例項實施增量同步(例如承載這些 PG 例項的 OSD 離線太久,或者是新的 OSD 加入叢集導致的 PG 例項整體遷移),則通過完全拷貝當前 Primary 所有物件的方式進行全量同步,此過程中的 PG 會處於 backfilling。
  • backfill-toofull:某個需要被 Backfill 的 PG 例項,其所在的 OSD 可用空間不足,Backfill 流程當前被掛起時 PG給的狀態。
  • creating:建立PG中的狀態,一般出現建立新pool時。
  • incomplete:Peering過程中由於無法選出權威日誌或者通過choos_acting選出的acting不足以完成資料恢復,(例如針對糾刪碼,存活的副本數小於k值)等,導致Peering無法正常完成。即pg後設資料丟失,無法恢復pg狀態。(ceph-objectstore-tool工具可以調整此狀態pg為complete)
  1. noscrub 和 nodeep-scrub

    • noscrub:資料輕量掃描,主要檢查後設資料資訊是否一致,若不一致則會進行同步,一般為一天進行一次比對,預設開啟。
    • nodeep-scrub:資料深度掃描,對所有資料的全量掃描,包括後設資料、object等,一般一週進行一次,預設開啟。

    資料校驗時會導致讀壓力增大,如果掃描出資料不一致還要進行同步寫,增大寫的壓力,因此在做擴容等操作的時候,我們會人為去設定noscrub與nodeep-scrub,暫停資料校驗。檢視pool是否開啟清洗:

    $ ceph osd pool get replicapool noscrub
    noscrub: false
    $ ceph osd pool get replicapool nodeep-scrub
    nodeep-scrub: false
    
  2. 資料壓縮

    如果使用 BlueStore 儲存引擎,ceph 支援稱為 "實時資料壓縮" 即邊壓縮邊儲存資料的功能, 該功能有助於節省磁碟空間,可以在BlueStore OSD上建立的每個儲存池池上啟用或禁用壓縮, 以節約磁碟空間,預設沒有開啟壓縮,需要後期配置並開啟:

    ## 開啟壓縮功能
    $ ceph osd pool set <pool name> compression_algorithm <壓縮演算法> 
    演算法介紹:
      sanppy:預設演算法,消耗cpu較少
      zstd:壓縮比好,但消耗 CPU
      lz4:消耗cpu較少
      zlib:不推薦
      
    $ ceph osd pool set replicapool compression_algorithm snappy
    set pool 2 compression_algorithm to snappy
    
    ## 指定壓縮模式
    $ ceph osd pool set <pool name> compression_mode <指定模式>
    模式介紹:
      none:從不壓縮資料,預設值。
      passive:除非寫操作具有可壓縮的提示集,否則不要壓縮資料。
      aggressive:壓縮資料,除非寫操作具有不可壓縮的提示集。
      force:無論如何都嘗試壓縮資料,即使客戶端暗示資料不可壓縮也會壓縮,也就是在所有情況下都使用壓縮
    
    $ ceph osd pool set replicapool compression_mode passive
    set pool 2 compression_mode to passive
    

    全域性壓縮選項,這些可以配置到 ceph.conf 中,作用於所有儲存池:

    bluestore_compression_algorithm #壓縮演算法
    bluestore_compression_mode      #壓縮模式
    bluestore_compression_required_ratio #壓縮後與壓縮前的壓縮比,預設為.875
    bluestore_compression_min_blob_size  #小於它的塊不會被壓縮,預設0
    bluestore_compression_max_blob_size  #大於它的塊在壓縮前會被拆成更小的塊,預設 0
    bluestore_compression_min_blob_size_ssd #預設 8k
    bluestore_compression_max_blob_size_ssd #預設 64k
    bluestore_compression_min_blob_size_hdd #預設 128k
    bluestore_compression_max_blob_size_hdd #預設 512k
    

    此功能開啟會影響cpu的使用率,如果環境為生產環境,不建議開啟此功能

ceph叢集管理命令

  1. 儲存池基本管理

    建立儲存池,格式示例

    $ ceph osd pool create <poolname> pg_num pgp_num {replicated|erasure}
    
    $ ceph osd pool create study 8 8 
    pool 'study' created
    

    列出儲存池

    $ ceph osd lspools
    1 .rgw.root
    2 study
    

    重新命名儲存池,格式示例

    $ ceph osd pool rename old-name new-name 
    
    $ ceph osd pool rename study re-study
    pool 'study' renamed to 're-study'
    

    顯示儲存池用量資訊

    $ rados df 
    或者
    $ ceph osd df 
    

    刪除儲存池

    ## 1、ceph為了防止儲存池被誤刪,故設定了兩個機制來保護,首先要將儲存池的nodelete標誌為false
    $ ceph osd pool set re-study nodelete false
    set pool 13 nodelete to true
    $ ceph osd pool get re-study nodelete
    nodelete: false
    
    ## 2、第二個機制,要將mon設定為允許刪除--mon-allow-pool-delete=true
    $ ceph tell mon.* injectargs --mon-allow-pool-delete=true 
    injectargs:mon_allow_pool_delete = 'true' 
    
    ## 3、開始刪除,要寫兩邊儲存池的名字,並加引數--yes-i-really-really-mean-it
    $ ceph osd pool rm re-study re-study --yes-i-really-really-mean-it
    pool 're-study' removed
    
  2. 儲存池配額

    儲存池可以設定兩個配對儲存的物件進行限制,一個配額是最大空間(max_bytes),另外一個 配額是物件最大數量(max_objects),預設不會限制,例如:

    ## 檢視replicapool儲存池的配額情況,N/A表示不限制
    $ ceph osd pool get-quota replicapool 
    quotas for pool 'replicapool':
      max objects: N/A
      max bytes  : N/A
      
    ## 限制最大物件數為1000,最大byte為1000000000
    $ ceph osd pool set-quota replicapool max_objects 1000
    set-quota max_objects = 1000 for pool replicapool
    
    $ ceph osd pool set-quota replicapool max_bytes 1000000000
    set-quota max_bytes = 1000000000 for pool replicapool
    
    $ ceph osd pool get-quota replicapool 
    quotas for pool 'replicapool':
      max objects: 1k objects
      max bytes  : 954 MiB
      
    ## 可以再設定為不限額
    $ ceph osd pool set-quota replicapool max_bytes 0
    
  3. 儲存池常用引數

    檢視儲存池物件副本數 和 最小副本數

    $ ceph osd pool get replicapool size
    size: 1
    
    $ ceph osd pool get replicapool min_size 
    min_size: 1
    

    min_size:提供服務所需要的最小副本數,預設為2,表示如果一個3副本的儲存池,其中一個副本所在的osd壞掉了,那麼還剩兩副本,可以正常工作,但如果再壞掉一個,只剩下一個副本,則此儲存池不能正常提供服務。

    檢視儲存池pg、pgp數量

    $ ceph osd pool get replicapool pg_num 
    pg_num: 32
    
    $ ceph osd pool get replicapool pgp_num 
    pgp_num: 32
    

    控制是否可以更改儲存池的pg、pgp、儲存大小

    $ ceph osd pool get replicapool nopgchange
    nopgchange: false
    
    $ ceph osd pool get replicapool nosizechange
    nosizechange: false
    

    輕量掃描和深層掃描管理

    ## 關閉輕量掃描和深層掃描
    $ ceph osd pool set replicapool noscrub true
    $ ceph osd pool set replicapool nodeep-scrub true
    
    ## 掃描的最小與最大間隔時間,預設沒設定,如果需要,則要在配置檔案中指定
    osd_scrub_min_interval xxx
    osd_scrub_max_interval xxx
    osd_deep_scrub_interval xxx
    

    ceph osd預設配置檢視

    $ ceph daemon osd.1 config show | grep scrub
    

相關文章