Ceph 架構以及部署

FuShudi發表於2024-05-22

目錄
  • Ceph架構
    • 儲存型別
    • 為什麼用到Ceph?
      • 1. NFS
      • 2. MooseFS
        • MooseFS瓶頸
      • 3. GlusterFS
      • 4. Ceph
    • Ceph的元件
  • Ceph部署
    • 前期準備
      • 1.1 修改主機名
      • 1.2 關閉防火牆以及selinux
      • 1.3 配置hosts
    • 1.4 配置時間同步
    • 2. 安裝cephadm
      • 2.1 安裝git
      • 2.2 安裝podman3.3
      • 2.3 配置ceph源
      • 2.4 將repo檔案傳到各個節點
    • 3. 安裝ceph
      • 3.1 登入dashboard
      • 3.2 安裝ceph-common
        • 3.2.1 群健康的3種狀態
        • 3.2.2 services
        • 3.2.3 健康詳細情況
    • 4. 新增節點
      • 4.1 開始新增節點
        • 4.1.1 發放公鑰
        • 4.1.2 被新增節點安裝容器引擎
        • 4.1.3 新增節點
        • 4.1.4 標籤修改
          • 新增標籤
          • 刪除標籤
        • 4.2 關閉mon自動擴充套件
        • 4.3 將mon服務固定在某幾個節點
    • 5. 新增OSD
      • ceph df
      • ceph osd df
      • ceph osd tree

Ceph架構

Ceph是什麼?為什麼用到Ceph?

儲存型別

  • 集中式儲存

    • NAS (網路附加儲存 / 網路區域儲存)
    • SAN (儲存區域網路)
    • DAS (直連附加儲存)

    集中式儲存的優點:

    1. 管理簡單,因為所有資料都存放在同一個節點上,所以資料的管理與維護相對簡單

    2. 安全性高,集中式儲存中只有一個資料中心,因此更容易實現安全控制

    3. 資料統一管理

    常見的的集中式儲存有:

  • 分散式儲存

    分散式儲存是一種資料儲存技術。在分散式儲存架構中,資訊被儲存於多個獨立且互不干擾的裝置中。不同於傳統的集中式儲存,分散式儲存採用可擴充套件的儲存結構,這在一定程度上提高了儲存系統的可靠性,可用性和訪問效率。

為什麼用到Ceph?

1. NFS

現在常用的儲存服務有NFS,那麼為什麼不採用NFS呢?

我們不妨這樣設想一下,NFS如果節點掛掉了,那麼我們把這個節點上的硬碟拔出來,換到其他節點上,在其他節點上起一個NFS,那麼資料依舊是存在的,但是,如果壞的不是節點而是硬碟呢?可能你想到了給硬碟做RAID,好,保留這個問題,繼續往後看。

2. MooseFS

Moosefs就是一個分散式儲存,他的技術架構就是提供一個Mater節點,來管理整個叢集,client只需要透過掛載Master節點就可以往叢集記憶體儲檔案

大家都知道,一個檔案是由檔案後設資料以及檔案資料組成的,檔案後設資料儲存的就是一些簡單的概要,比如這個檔案多大,檔案的擁有人,所屬組以及訪問許可權這些東西,後設資料一般都不大,所以會直接儲存在Master節點上,而檔案本身的資料則會儲存在儲存節點上,並且是有多副本機制的。完全不怕某個節點掛掉而導致資料丟失。

MooseFS瓶頸

雖然檔案的後設資料佔用的空間並不大,但是在現在這個時代,也奈何不了他多啊,當後設資料過多時,Master就成了Moosefs的瓶頸,因為所有的請求都是需要經過Master的,並且Moosefs(到寫這篇文章的時間)是沒辦法做Master高可用的,想給他做高可用的方式就是2個Master,使用Keepalive提供一個VIP(虛擬IP),訪問這個VIP就可以訪問到2個Master節點,但是,在同一時間內,只有一個Master在工作,所以瓶頸依舊存在

3. GlusterFS

看到了MooseFS的瓶頸之後,GlusterFS採取了去Master,即不需要Master節點,每個儲存節點上都內嵌一個可以代替Master工作的元件,這樣操作下來,所有的後設資料並不是都放在同一個節點上,每個節點都只需要儲存部分後設資料,好像這個架構沒什麼問題了哈,但是我們回想一下MooseFS是如何使用的?是不是客戶端掛載Master就可以使用叢集了?但是現在沒有Master了,或者說每個節點都是Master,那怎麼辦呢?

GlusterFS就要求使用GlusterFS的客戶端安裝一個軟體,Gluster-client,並且給這個軟體寫一個配置檔案,把所有的儲存節點IP地址寫進去,這樣操作。但是如果後期節點需要更換,改動起來就比較麻煩。我們再來看看Ceph是怎麼做的

4. Ceph

Ceph的做法就跟前兩者不同了,Moose FS不是說Master上的後設資料會成為瓶頸嗎?GlusterFS不是說客戶端操作不易嗎?那我來折中一下呢?Ceph他保留了Master節點,但是,這個Master儲存的不是檔案的後設資料,是叢集的後設資料,也就是儲存的叢集的資訊,那麼既然Master儲存的是叢集後設資料,那麼檔案後設資料儲存到哪了呢?他有專門的檔案後設資料節點,所有的檔案後設資料都儲存在這個節點上,記住,這個節點只儲存後設資料,其他一概不管。這樣說來,既解決了客戶端配置維護困難,也解決了Master節點的瓶頸。

這就是Ceph的架構,他兼顧了 易維護、效能,這就是他流行的原因

現在再回頭去想NFS的問題,為什麼不做RAID呢?因為做RAID成本就比用Ceph的成本高了

Ceph的版本命名跟OpenStack一樣,採取英文字母命令A-Z,目前最新版是R版

Ceph的元件

  1. mon:叢集監視器(就是master)
  2. osd:叢集儲存節點
  3. mgr:叢集管理器
    以上三個節點必裝,缺一不可
  4. mds:檔案後設資料節點
  5. rgw:物件儲存閘道器
  6. nfs-genasha:為ceph對外提供NFS協議的檔案儲存服務
  7. rbd-mirror:塊裝置映象服務

Ceph部署

ceph的部署方式有:

  1. Cephadm(官方推薦)
  2. ceph-ansible
  3. ceph-deploy(N版本之前使用)
  4. DeepSea
  5. 手工部署(極其複雜,不推薦)
主機名 IP 系統
ceph01 192.168.101.10 尤拉 22.03
ceph02 192.168.101.20 尤拉 22.03
ceph03 192.168.101.30 尤拉 22.03

前期準備

每個節點都要做

1.1 修改主機名

[root@localhost ~]# hostnamectl set-hostname ceph01

1.2 關閉防火牆以及selinux

[root@ceph01 ~]# systemctl disable --now firewalld
[root@ceph01 ~]# setenforce 0
[root@ceph01 ~]# cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled

1.3 配置hosts

[root@ceph01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ceph01
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.101.10 ceph01
192.168.101.20 ceph02
192.168.101.30 ceph03

1.4 配置時間同步

[root@ceph01 ~]# yum install chrony -y
[root@ceph01 ~]# systemctl enable --now chronyd

2. 安裝cephadm

2.1 安裝git

安裝git是因為需要拉取cephadm,因為尤拉作業系統暫時用不了官方的cephadm,需要下載另一個版本

[root@ceph01 ~]# yum install git -y
[root@ceph01 ~]# git clone https://gitee.com/yftyxa/openeuler-cephadm.git
[root@ceph01 ~]# cd openeuler-cephadm/
[root@ceph01 openeuler-cephadm]# ls
cephadm
[root@ceph01 openeuler-cephadm]# mv cephadm /usr/sbin/

2.2 安裝podman3.3

[root@ceph01 ~]#  wget-O /etc/yum.repos.d/huawei.repo https://repo.huaweicloud.com/repository/conf/CentOS-8-reg.repo
# 一定要指定版本安裝
[root@ceph01 ~]# yum install podman-3.3.1*

2.3 配置ceph源

不要使用cephadm add-repo 因為在尤拉上是不支援的

[root@ceph01 ~]# cephadm version
ceph version 16.2.13 (5378749ba6be3a0868b51803968ee9cde4833a3e) pacific (stable)
[root@ceph01 ~]# vim /etc/yum.repos.d/ceph.repo
[ceph]
name=ceph
baseurl=https://mirrors.huaweicloud.com/ceph/rpm-pacific/el8/x86_64/
gpgcheck=0
enabled=1

2.4 將repo檔案傳到各個節點

[root@ceph01 ~]# scp /etc/yum.repos.d/ceph.repo ceph02:/etc/yum.repos.d/

Authorized users only. All activities may be monitored and reported.
ceph.repo                                              100%  107   209.4KB/s   00:00    
[root@ceph01 ~]# scp /etc/yum.repos.d/ceph.repo ceph03:/etc/yum.repos.d/

Authorized users only. All activities may be monitored and reported.
ceph.repo                                              100%  107   203.1KB/s   00:00

3. 安裝ceph

[root@ceph01 ~]# cephadm bootstrap --mon-ip 192.168.101.10 --initial-dashboard-user admin --initial-dashboard-password 123 --dashboard-password-noupdate

--mon-ip指定monitor,指定一個就行,後期可以新增

--initial-dashboard-user admin 指定dashboard的使用者名稱是admin,不指定也行

--initial-dashboard-password 123 指定dashboard的使用者名稱是123,不指定也行

--dashboard-password-noupdate 第一次登入dashboard無需修改密碼

安裝完之後會有一個回顯

Ceph Dashboard is now available at:

	     URL: https://localhost.localdomain:8443/
	    User: admin
	Password: 123

Enabling client.admin keyring and conf on hosts with "admin" label
You can access the Ceph CLI with:

	sudo /usr/sbin/cephadm shell --fsid dc6d1544-17ef-11ef-9393-000c297dea16 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring

Please consider enabling telemetry to help improve Ceph:

	ceph telemetry on

For more information see:

	https://docs.ceph.com/docs/pacific/mgr/telemetry/

Bootstrap complete.

3.1 登入dashboard

3.2 安裝ceph-common

[root@ceph01 ~]# yum install ceph-common  --nobest
如果不加上nobest的話,他會報錯,因為我們的版本是16.2.13,而倉庫裡的是common是16.2.15,不是最佳匹配
加上nobest的話他就不會報錯了

裝完之後我們可以使用ceph -s 來檢視叢集狀態

[root@ceph01 ~]# ceph -s
  cluster:
    id:     dc6d1544-17ef-11ef-9393-000c297dea16
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3
 
  services:
    mon: 1 daemons, quorum ceph01 (age 30m)
    mgr: ceph01.luyssm(active, since 27m)
    osd: 0 osds: 0 up, 0 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs: 

3.2.1 群健康的3種狀態

1. health: HEALTH_OK       這個代表叢集是OK的
2. health: HEALTH_WARN  這個代表的是有警告
3. health: HEALTH_ERR     這個代表叢集出現錯誤,無法提供服務

3.2.2 services

mon: 1 daemons, quorum ceph01 (age 30m)
mgr: ceph01.luyssm(active, since 27m)
osd: 0 osds: 0 up, 0 in

這裡可以看到有一個mon,沒有osd,沒有osd是up

osd的狀態:

  1. up且in: 代表osd執行正常且至少承載了一個PG

  2. up且out:代表osd執行正常,但是沒有承載PG,新加入叢集的osd為這個狀態

  3. down且in:表示osd執行異常,但承載了一個PG

  4. down且out:表示osd執行異常,且沒有承載PG

3.2.3 健康詳細情況

[root@ceph01 ~]# ceph health detail
HEALTH_WARN OSD count 0 < osd_pool_default_size 3
[WRN] TOO_FEW_OSDS: OSD count 0 < osd_pool_default_size 3

這裡會詳細的說明為什麼不健康

4. 新增節點

有一個命令 ceph orch 他是用來管理節點以及 orch 資訊的c

[root@ceph01 ~]# ceph orch ls
NAME           PORTS        RUNNING  REFRESHED  AGE  PLACEMENT  
alertmanager   ?:9093,9094      1/1  2m ago     45m  count:1    
crash                           1/1  2m ago     45m  *          
grafana        ?:3000           1/1  2m ago     45m  count:1    
mgr                             1/2  2m ago     45m  count:2    
mon                             1/5  2m ago     45m  count:5    
node-exporter  ?:9100           1/1  2m ago     45m  *          
prometheus     ?:9095           1/1  2m ago     45m  count:1 
[root@ceph01 ~]# ceph orch ps
NAME                  HOST    PORTS        STATUS         REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID  
alertmanager.ceph01   ceph01  *:9093,9094  running (52m)    48s ago  53m    23.8M        -  0.23.0   ba2b418f427c  922cc9da5d93  
crash.ceph01          ceph01               running (53m)    48s ago  53m    6665k        -  16.2.13  e08a45948779  beb27dd23017  
grafana.ceph01        ceph01  *:3000       running (51m)    48s ago  52m    52.8M        -  8.3.5    dad864ee21e9  8040b45413ea  
mgr.ceph01.luyssm     ceph01  *:9283       running (54m)    48s ago  54m     430M        -  16.2.13  e08a45948779  46795e2d6fd4  
mon.ceph01            ceph01               running (54m)    48s ago  55m     127M    2048M  16.2.13  e08a45948779  40063aa2ec52  
node-exporter.ceph01  ceph01  *:9100       running (52m)    48s ago  52m    20.3M        -  1.3.1    1dbe0e931976  526975c5960b  
prometheus.ceph01     ceph01  *:9095       running (52m)    48s ago  52m    68.7M        -  2.33.4   514e6a882f6e  7c8ef8a42751

透過ps可以看到ceph具體的程序,執行在哪個機器上,記憶體佔用是多少,允許最大佔用記憶體是多少,這裡的image id就是容器使用的映象ID,cephadm部署出來的叢集就是基於容器的

4.1 開始新增節點

需要將/etc/ceph/ceph.pub這個公鑰傳到被新增的節點上

4.1.1 發放公鑰

[root@ceph01 ceph]# ssh-copy-id -f -i /etc/ceph/ceph.pub ceph02
[root@ceph01 ceph]# ssh-copy-id -f -i /etc/ceph/ceph.pub ceph03

4.1.2 被新增節點安裝容器引擎

# 先移除本來就存在的podman1版本
[root@ceph02 ~]# yum remove podman* -y
# 安裝podman3
[root@ceph02 ~]# yum install podman-3* -y
[root@ceph03 ~]# yum install podman-3* -y

4.1.3 新增節點

[root@ceph01 ceph]# ceph orch  host add ceph02 192.168.101.20
Added host 'ceph02' with addr '192.168.101.20'
[root@ceph01 ceph]# ceph orch  host add ceph03 192.168.101.30
Added host 'ceph03' with addr '192.168.101.30'
[root@ceph01 ceph]# ceph orch host ls
HOST    ADDR            LABELS  STATUS  
ceph01  192.168.101.10  _admin          
ceph02  192.168.101.20                  
ceph03  192.168.101.30                  
3 hosts in cluster

Lables 就是標籤,當某個節點擁有_admin標籤時,叢集就會把連線客戶端連線ceph叢集的認證檔案發放到該節點上

4.1.4 標籤修改

新增標籤

目前是隻有ceph01擁有admin標籤,在/etc/ceph 下有一些其他節點沒有的檔案

[root@ceph01 ceph]# ls /etc/ceph/
ceph.client.admin.keyring  ceph.conf  ceph.pub  rbdmap
# ceph03檢視
[root@ceph03 ~]# ls /etc/ceph/
rbdmap

# 給ceph03打標籤
[root@ceph01 ceph]# ceph orch host label add ceph03 _admin
Added label _admin to host ceph0
# 重新檢視ceph03
[root@ceph03 ~]# ls /etc/ceph/
ceph.client.admin.keyring  ceph.conf  rbdmap
[root@ceph01 ceph]# ceph orch host ls
HOST    ADDR            LABELS  STATUS  
ceph01  192.168.101.10  _admin          
ceph02  192.168.101.20                  
ceph03  192.168.101.30  _admin

這個時候,ceph03就可以使用ceph客戶端來操作ceph叢集了

刪除標籤
[root@ceph01 ceph]# ceph orch host label rm ceph03 _admin
Removed label _admin from host ceph03
[root@ceph01 ceph]# ceph orch host ls
HOST    ADDR            LABELS  STATUS  
ceph01  192.168.101.10  _admin          
ceph02  192.168.101.20                  
ceph03  192.168.101.30

4.2 關閉mon自動擴充套件

[root@ceph01 ~]# ceph orch apply mon --unmanaged
Scheduled mon update...
[root@ceph01 ~]# ceph orch apply mon 3
Scheduled mon update...
[root@ceph01 ~]# ceph orch ls
NAME           PORTS        RUNNING  REFRESHED  AGE   PLACEMENT  
alertmanager   ?:9093,9094      1/1  97s ago    100m  count:1    
crash                           3/3  99s ago    100m  *          
grafana        ?:3000           1/1  97s ago    100m  count:1    
mgr                             2/2  99s ago    100m  count:2    
mon                             3/3  99s ago    52s   count:3    
node-exporter  ?:9100           3/3  99s ago    100m  *          
prometheus     ?:9095           1/1  97s ago    100m  count:1 

4.3 將mon服務固定在某幾個節點

如果有一個mon節點掛掉了,而此時又新增了一臺新的節點,那麼按照ceph叢集的控制,可能會在新的節點上啟動一個mon,但我們並不想他更換mon節點,此時可以這麼做

# 1. 先給節點打標籤
[root@ceph01 ~]# ceph orch host label add ceph01 mon
Added label mon to host ceph01
[root@ceph01 ~]# ceph orch host label add ceph02 mon
Added label mon to host ceph02
[root@ceph01 ~]# ceph orch host label add ceph03 mon
Added label mon to host ceph03
# 2. 開啟標籤匹配
[root@ceph01 ~]# ceph orch apply mon label:mon
Scheduled mon update...

這樣操作之後,mon就只會在有mon標籤的節點上去啟動

5. 新增OSD

首先需要ceph節點上有空閒的盤,然後將空閒的盤新增進來,必須是一塊裸盤,在一千的版本是允許是一個目錄的

[root@ceph01 ~]# ceph orch daemon add osd ceph01:/dev/sdb
Created osd(s) 0 on host 'ceph01'
[root@ceph01 ~]# ceph orch daemon add osd ceph01:/dev/sdc
Created osd(s) 1 on host 'ceph01'
[root@ceph01 ~]# ceph orch daemon add osd ceph01:/dev/sdd
Created osd(s) 2 on host 'ceph01'

在新增節點之後ceph會將這塊盤做成一個lvm,可以使用lvs去檢視

[root@ceph01 ~]# lvs
  LV                                             VG                                        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  osd-block-92842562-ddd9-4703-a406-0c5608943e67 ceph-4b36ac72-7807-4e01-97d6-a47974ff5819 -wi-ao---- <50.00g                                                    
  osd-block-ca2d6b54-650f-41bc-9519-08eeb5d405fb ceph-615825c2-3c13-4367-98e3-7b9197eda340 -wi-ao---- <50.00g                                                    
  osd-block-2e02f3ac-9768-48d7-8d7b-591d1f5badd5 ceph-bc484b43-f83f-43b2-b49e-a838c8d07e75 -wi-ao---- <50.00g                                                    
  home                                           openeuler                                 -wi-ao---- <29.90g                                                    
  root                                           openeuler                                 -wi-ao---- <61.24g                                                    
  swap                                           openeuler                                 -wi-ao----  <7.86g                                         

新增完之後我們使用命令來檢視

[root@ceph01 ~]# ceph -s
  cluster:
    id:     dc6d1544-17ef-11ef-9393-000c297dea16
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph01,ceph02,ceph03 (age 18m)
    mgr: ceph02.oxmsfu(active, since 19m), standbys: ceph01.luyssm
    osd: 9 osds: 9 up (since 4m), 9 in (since 4m)
 
  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   53 MiB used, 450 GiB / 450 GiB avail
    pgs:     1 active+clean

這裡顯示有9個osd,並且狀態是up且in,說明沒問題

ceph df

# ceph df命令
[root@ceph01 ~]# ceph df
--- RAW STORAGE ---
CLASS     SIZE    AVAIL    USED  RAW USED  %RAW USED
hdd    450 GiB  450 GiB  53 MiB    53 MiB       0.01
TOTAL  450 GiB  450 GiB  53 MiB    53 MiB       0.01
 
--- POOLS ---
POOL                   ID  PGS  STORED  OBJECTS  USED  %USED  MAX AVAIL
device_health_metrics   1    1     0 B        0   0 B      0    142 GiB

ceph osd df

# ceph osd df
[root@ceph01 ~]# ceph osd df
ID  CLASS  WEIGHT   REWEIGHT  SIZE     RAW USE  DATA     OMAP  META     AVAIL    %USE  VAR   PGS  STATUS
 0    hdd  0.04880   1.00000   50 GiB  6.0 MiB  552 KiB   0 B  5.5 MiB   50 GiB  0.01  1.02    0      up
 1    hdd  0.04880   1.00000   50 GiB  6.0 MiB  552 KiB   0 B  5.5 MiB   50 GiB  0.01  1.02    0      up
 2    hdd  0.04880   1.00000   50 GiB  6.0 MiB  552 KiB   0 B  5.4 MiB   50 GiB  0.01  1.01    1      up
 3    hdd  0.04880   1.00000   50 GiB  6.0 MiB  552 KiB   0 B  5.4 MiB   50 GiB  0.01  1.01    1      up
 4    hdd  0.04880   1.00000   50 GiB  5.9 MiB  552 KiB   0 B  5.3 MiB   50 GiB  0.01  0.99    0      up
 5    hdd  0.04880   1.00000   50 GiB  6.1 MiB  552 KiB   0 B  5.6 MiB   50 GiB  0.01  1.03    0      up
 6    hdd  0.04880   1.00000   50 GiB  5.9 MiB  552 KiB   0 B  5.3 MiB   50 GiB  0.01  0.99    0      up
 7    hdd  0.04880   1.00000   50 GiB  5.7 MiB  552 KiB   0 B  5.2 MiB   50 GiB  0.01  0.97    1      up
 8    hdd  0.04880   1.00000   50 GiB  5.7 MiB  552 KiB   0 B  5.2 MiB   50 GiB  0.01  0.97    0      up
                       TOTAL  450 GiB   53 MiB  4.9 MiB   0 B   48 MiB  450 GiB  0.01                   
MIN/MAX VAR: 0.97/1.03  STDDEV: 0

ceph osd tree

[root@ceph01 ~]# ceph osd tree
ID  CLASS  WEIGHT   TYPE NAME        STATUS  REWEIGHT  PRI-AFF
-1         0.43918  root default                              
-3         0.14639      host ceph01                           
 0    hdd  0.04880          osd.0        up   1.00000  1.00000
 1    hdd  0.04880          osd.1        up   1.00000  1.00000
 2    hdd  0.04880          osd.2        up   1.00000  1.00000
-5         0.14639      host ceph02                           
 3    hdd  0.04880          osd.3        up   1.00000  1.00000
 4    hdd  0.04880          osd.4        up   1.00000  1.00000
 5    hdd  0.04880          osd.5        up   1.00000  1.00000
-7         0.14639      host ceph03                           
 6    hdd  0.04880          osd.6        up   1.00000  1.00000
 7    hdd  0.04880          osd.7        up   1.00000  1.00000
 8    hdd  0.04880          osd.8        up   1.00000  1.00000

到這裡ceph的部署就結束了

相關文章