- 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服務固定在某幾個節點
- 4.1 開始新增節點
- 5. 新增OSD
- ceph df
- ceph osd df
- ceph osd tree
- 前期準備
Ceph架構
Ceph是什麼?為什麼用到Ceph?
儲存型別
-
集中式儲存
- NAS (網路附加儲存 / 網路區域儲存)
- SAN (儲存區域網路)
- DAS (直連附加儲存)
集中式儲存的優點:
-
管理簡單,因為所有資料都存放在同一個節點上,所以資料的管理與維護相對簡單
-
安全性高,集中式儲存中只有一個資料中心,因此更容易實現安全控制
-
資料統一管理
常見的的集中式儲存有:
-
分散式儲存
分散式儲存是一種資料儲存技術。在分散式儲存架構中,資訊被儲存於多個獨立且互不干擾的裝置中。不同於傳統的集中式儲存,分散式儲存採用可擴充套件的儲存結構,這在一定程度上提高了儲存系統的可靠性,可用性和訪問效率。
為什麼用到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的元件
- mon:叢集監視器(就是master)
- osd:叢集儲存節點
- mgr:叢集管理器
以上三個節點必裝,缺一不可 - mds:檔案後設資料節點
- rgw:物件儲存閘道器
- nfs-genasha:為ceph對外提供NFS協議的檔案儲存服務
- rbd-mirror:塊裝置映象服務
Ceph部署
ceph的部署方式有:
- Cephadm(官方推薦)
- ceph-ansible
- ceph-deploy(N版本之前使用)
- DeepSea
- 手工部署(極其複雜,不推薦)
主機名 | 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的狀態:
up且in: 代表osd執行正常且至少承載了一個PG
up且out:代表osd執行正常,但是沒有承載PG,新加入叢集的osd為這個狀態
down且in:表示osd執行異常,但承載了一個PG
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的部署就結束了