Ceph 分布式存储部署指南

编号系统角色IPCeph版本硬件配置主机名
1Rocky9.4bootstrap,mon,mgr,osd192.168.8.3Squid4C/4G/500G*4ceph001.xiaohui.cn
2Rocky9.4mon,mgr,osd192.168.8.4Squid4C/4G/500G*4ceph002.xiaohui.cn
3Rocky9.4mon,mgr,osd192.168.8.5Squid4C/4G/500G*4ceph003.xiaohui.cn
1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

Ceph基本介绍

随着数据量的迅猛增长和数据存储需求的日益复杂化,传统的存储解决方案越来越难以满足现代企业的需求。在这种背景下,分布式存储系统应运而生,为企业提供了更高效、更灵活的存储解决方案。

Ceph作为一种开源的分布式存储系统,以其高可扩展性、高可靠性和高性能的特点,受到了广泛的关注和应用。Ceph支持对象存储、块存储和文件系统等多种存储接口,能够满足各种业务场景下的存储需求。

本文将基于Rocky 9.4操作系统,详细介绍如何用容器化的方式从零开始部署一个Ceph分布式存储集群。通过本指南,你将能够掌握Ceph的安装、配置和管理方法,为企业的存储需求提供强有力的支持。

本次部署将以容器化的方式部署Ceph,部署工具为cephadmCephadm 是 Ceph 集群管理的现代化工具,它简化了容器化 Ceph 部署的复杂性。Cephadm 的设计目标是简化 Ceph 集群的部署和管理,使其更加易用和灵活。通过容器化的方式,Cephadm 提供了一种标准化的方法来操作 Ceph 集群,有效减少了运维复杂度。

先决条件准备

除非另有说明,不然先决条件需在每个节点准备

主机名和解析

设置主机名

根据解析,在每个节点设置合适的主机名,以下以第一台为例

1
hostnamectl hostname ceph001.xiaohui.cn

准备好集群之间的解析

1
2
3
4
5
6
7
cat > /etc/hosts <<-'EOF'
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.3 ceph001.xiaohui.cn ceph001
192.168.8.4 ceph002.xiaohui.cn ceph002
192.168.8.5 ceph003.xiaohui.cn ceph003
EOF

准备软件仓库

这里向系统中添加了squid版本的Ceph仓库,并使用南京大学进行仓库加速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cat > /etc/yum.repos.d/ceph.repo <<-'EOF'
[ceph]
name=Ceph packages for x86_64
baseurl=https://mirrors.nju.edu.cn/ceph/rpm-squid/el9/x86_64
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.nju.edu.cn/ceph/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.nju.edu.cn/ceph/rpm-squid/el9/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.nju.edu.cn/ceph/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.nju.edu.cn/ceph/rpm-squid/el9/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://mirrors.nju.edu.cn/ceph/keys/release.asc
EOF

生产软件包缓存,方便稍后使用

1
dnf makecache

安装必备软件包

以下软件安装,可能会更新systemd这种关键组件,所以安装后,请重启一下服务器

  1. Python 3
  2. Systemd
  3. Podman
  4. Chrony
  5. LVM2
1
dnf install podman chrony lvm2 systemd python3 bash-completion wget curl epel-release -y

重启服务器

1
reboot

开启ntp同步

默认从公网同步,需要可以自己指定时间源,我这里使用ntp.aliyun.com

编辑这个配置文件,在最开头的地方添加这一行即可

1
2
3
4
vim /etc/chrony.conf
...
pool ntp.aliyun.com iburst
...
1
2
systemctl enable chronyd --now
systemctl restart chronyd

安装cephadm

Cephadm 是一种用于管理 Ceph 集群的工具,

安装cephadm工具就够了,我这里安装ceph-common软件包是为了在主机上执行ceph、rados等各种ceph命令,因为cephadm是容器化部署Ceph,所以宿主机上并没有安装这些命令,我们安装了ceph-common之后,就不必每次都登录容器执行了,更高效

1
dnf install cephadm ceph-common -y

至此,所有先决条件部署完成

部署新集群

Cephadm bootstrap 是初始化 Ceph 集群的第一步。它通过引导命令创建一个小型的初始 Ceph 集群,使其包含一个监视器(MON)和一个管理器(MGR)。这是整个 Ceph 集群部署和管理过程的基础步骤。

Cephadm bootstrap命令将会执行以下操作:

  • 在本地主机上为新集群创建一个监视器(Monitor)和一个管理器(Manager)守护进程

  • 为 Ceph 集群生成一个新的 SSH 密钥,并将其添加到 root 用户的 /root/.ssh/authorized_keys 文件中。

  • 公钥的副本写入 /etc/ceph/ceph.pub 文件中。

  • 写入一个最小配置文件/etc/ceph/ceph.conf 文件中。该文件用于与 Ceph 守护进程通信。

  • client.admin 管理员(特权)密钥的副本写入 /etc/ceph/ceph.client.admin.keyring 文件中。

  • 为引导主机添加 _admin 标签。默认情况下,带有此标签的任何主机将(也)会获得 /etc/ceph/ceph.conf 和 /etc/ceph/ceph.client.admin.keyring 文件的副本。

本次部署采用多节点方式,如果你是单机部署或者FQDN部署,需要注意加参数

  1. 单节点需要加:--single-host-defaults

  2. 主机名是FQDN时需要加--allow-fqdn-hostname

只有一个节点的时候,请加上–single-host-defaults参数

1
cephadm bootstrap --mon-ip 192.168.8.3 --single-host-defaults --initial-dashboard-user admin --initial-dashboard-password LiXiaohui --dashboard-password-noupdate --allow-fqdn-hostname

多节点的时候,用下面的方式,不用加上面的参数,这是本次采用的方法。

1
cephadm bootstrap --mon-ip 192.168.8.3 --initial-dashboard-user admin --initial-dashboard-password LiXiaohui --dashboard-password-noupdate --allow-fqdn-hostname

输出

这里要记住密码

1
2
3
4
5
6
7
Ceph Dashboard is now available at:

URL: https://ceph001.xiaohui.cn:8443/
User: admin
Password: LiXiaohui
...
Bootstrap complete.

然后就可以用浏览器打开 https://192.168.8.3:8443 ceph的网页界面了,当然,你可以本地hosts解析为这个地址,用域名访问,打开时,需要同意自签名证书的警告

打开界面并使用密码登录后,界面长这样

rocky-ceph-deploy

从页面上可以看到,已经提示我们需要先扩展集群,而且左上角的dashboard后也是黄色的警告,那我们来加点硬盘到集群中,毕竟是分布式存储,一个硬盘都没有就过分了

部署OSD

在 Ceph 中,OSD(Object Storage Daemon)是存储集群的核心组件之一。它们的主要职责是存储数据、处理数据复制、恢复、回填和重均衡操作。

Ceph OSD 的关键概念

  1. 数据存储

    • OSD 负责实际存储数据对象。每个 OSD 通常对应一个物理存储设备(如硬盘或 SSD)。
  2. 数据复制

    • 为了确保数据的高可用性和持久性,OSD 之间会相互复制数据。Ceph 使用 CRUSH 算法决定数据的存放位置。
  3. 数据恢复

    • 当一个 OSD 出现故障或下线时,集群会自动从其他 OSD 中恢复数据,并将其复制到新的 OSD 上。
  4. 回填和重均衡

    • 回填(backfilling)是指在 OSD 恢复或新的 OSD 加入后,重新分配数据以确保数据均衡分布。

    • 重均衡(rebalancing)则是确保数据在 OSD 之间的负载均衡,防止某些 OSD 过载。

  5. 监控和管理

    • OSD 通过心跳机制向 Ceph 集群报告其状态,确保集群的健康和一致性。

了解了Ceph OSD之后,我们来添加一些OSD到集群中,完成Ceph集群扩容

查看现有硬盘,我还有nvme0n2、3、4空闲

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ceph001 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 1024M 0 rom
nvme0n1 259:0 0 500G 0 disk
├─nvme0n1p1 259:1 0 600M 0 part /boot/efi
├─nvme0n1p2 259:2 0 1G 0 part /boot
└─nvme0n1p3 259:3 0 498.4G 0 part
├─rl-root 253:0 0 494.5G 0 lvm /var/lib/containers/storage/overlay
│ /
└─rl-swap 253:1 0 3.9G 0 lvm [SWAP]
nvme0n2 259:4 0 500G 0 disk
nvme0n3 259:5 0 500G 0 disk
nvme0n4 259:6 0 500G 0 disk

添加osd进程到集群中

1
2
3
4
5
6
[root@ceph001 ~]# ceph orch daemon add osd ceph001.xiaohui.cn:/dev/nvme0n2
Created osd(s) 0 on host 'ceph001.xiaohui.cn'
[root@ceph001 ~]# ceph orch daemon add osd ceph001.xiaohui.cn:/dev/nvme0n3
Created osd(s) 1 on host 'ceph001.xiaohui.cn'
[root@ceph001 ~]# ceph orch daemon add osd ceph001.xiaohui.cn:/dev/nvme0n4
Created osd(s) 2 on host 'ceph001.xiaohui.cn'

看看集群里现有的OSD列表

1
2
3
4
5
6
7
[root@ceph001 ~]# ceph osd crush tree
ID CLASS WEIGHT TYPE NAME
-1 1.46489 root default
-3 1.46489 host ceph001
0 ssd 0.48830 osd.0
1 ssd 0.48830 osd.1
2 ssd 0.48830 osd.2

除了手工添加OSD之外,也可以开启自动添加osd功能

在 Ceph 中使用 --all-available-devices 选项时,将会自动检测并使用系统中所有可用的存储设备作为 OSD。这样可以简化OSD的添加过程,无需手动指定每个设备。

1
2
[root@ceph001 ~]# ceph orch apply osd --all-available-devices
Scheduled osd.all-available-devices update...

添加主机到集群

需要注意,新主机必须满足此文章的先决条件准备章节

先看看现有集群主机列表

1
2
3
4
[root@ceph001 ~]# ceph orch host ls --detail
HOST ADDR LABELS STATUS VENDOR/MODEL CPU RAM HDD SSD NIC
ceph001.xiaohui.cn 192.168.8.3 _admin VMware, Inc. (VMware20,1) 4C/4T 4 GiB - 4/2.1TB 1
1 hosts in cluster

将集群的SSH密钥分发到所有主机的root用户的authorized_keys文件中,以便能够免密操作

1
2
3
4
5
6
7
8
[root@ceph001 ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph001.xiaohui.cn
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

[root@ceph001 ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph002.xiaohui.cn
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

[root@ceph001 ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph003.xiaohui.cn
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

添加主机到集群列表

这里需要同时指定主机名和其对应的IP地址,添加主机后,新主机将会自动触发容器镜像下载以及容器的启动,可能需要一会儿才能就绪,而且由于我们在前面做了自动添加osd的动作,新主机上的硬盘将自动添加到集群中

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ceph001 ~]# ceph orch host add ceph002.xiaohui.cn 192.168.8.4
Added host 'ceph002.xiaohui.cn' with addr '192.168.8.4'

[root@ceph001 ~]# ceph orch host add ceph003.xiaohui.cn 192.168.8.5
Added host 'ceph003.xiaohui.cn' with addr '192.168.8.5'


[root@ceph001 ~]# ceph orch host ls --detail
HOST ADDR LABELS STATUS VENDOR/MODEL CPU RAM HDD SSD NIC
ceph001.xiaohui.cn 192.168.8.3 _admin VMware, Inc. (VMware20,1) 4C/4T 4 GiB - 4/2.1TB 1
ceph002.xiaohui.cn 192.168.8.4 VMware, Inc. (VMware20,1) 4C/4T 4 GiB - 4/2.1TB 1
ceph003.xiaohui.cn 192.168.8.5 VMware, Inc. (VMware20,1) 4C/4T 4 GiB - 4/2.1TB 1
3 hosts in cluster

将机器添加到集群中需要一段时间才会生效,具体可以使用以下命令查看服务是否都正常

如果正常,全部都会处于running

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@ceph001 ~]# ceph orch ps
NAME HOST PORTS STATUS REFRESHED AGE MEM USE MEM LIM VERSION IMAGE ID CONTAINER ID
alertmanager.ceph001 ceph001.xiaohui.cn *:9093,9094 running (27s) 8s ago 32m 18.8M - 0.25.0 c8568f914cd2 2f0b6ad11766
ceph-exporter.ceph001 ceph001.xiaohui.cn running (34m) 8s ago 34m 9214k - 19.2.0 37996728e013 479b5a8f8b33
ceph-exporter.ceph002 ceph002.xiaohui.cn running (5m) 9s ago 5m 5234k - 19.2.0 37996728e013 09e884621b9a
ceph-exporter.ceph003 ceph003.xiaohui.cn running (88s) 9s ago 88s 5288k - 19.2.0 37996728e013 0012fbf12b44
crash.ceph001 ceph001.xiaohui.cn running (34m) 8s ago 34m 6899k - 19.2.0 37996728e013 b70200d6456c
crash.ceph002 ceph002.xiaohui.cn running (5m) 9s ago 5m 6899k - 19.2.0 37996728e013 96cb9630e62e
crash.ceph003 ceph003.xiaohui.cn running (87s) 9s ago 87s 6899k - 19.2.0 37996728e013 71d8f8eff1d4
grafana.ceph001 ceph001.xiaohui.cn *:3000 running (22m) 8s ago 24m 81.2M - 9.4.12 2bacad6d85d8 cfd07c39c19d
mgr.ceph001.bbzwee ceph001.xiaohui.cn *:9283,8765,8443 running (35m) 8s ago 35m 516M - 19.2.0 37996728e013 3d6940571f92
mgr.ceph002.lekmef ceph002.xiaohui.cn *:8443,9283,8765 running (4m) 9s ago 4m 438M - 19.2.0 37996728e013 f165588a0ce8
mon.ceph001 ceph001.xiaohui.cn running (35m) 8s ago 35m 62.3M 2048M 19.2.0 37996728e013 e880599904c0
mon.ceph002 ceph002.xiaohui.cn running (4m) 9s ago 4m 35.0M 2048M 19.2.0 37996728e013 9701777a219f
mon.ceph003 ceph003.xiaohui.cn running (46s) 9s ago 46s 25.2M 2048M 19.2.0 37996728e013 a9855ed37e90
node-exporter.ceph001 ceph001.xiaohui.cn *:9100 running (34m) 8s ago 34m 16.7M - 1.5.0 0da6a335fe13 941dc192a4ab
node-exporter.ceph002 ceph002.xiaohui.cn *:9100 running (4m) 9s ago 4m 17.6M - 1.5.0 0da6a335fe13 cd66538982b9
node-exporter.ceph003 ceph003.xiaohui.cn *:9100 running (70s) 9s ago 70s 15.4M - 1.5.0 0da6a335fe13 25a86d870585
osd.0 ceph001.xiaohui.cn running (21m) 8s ago 21m 48.1M 4096M 19.2.0 37996728e013 922842fa1476
osd.1 ceph001.xiaohui.cn running (20m) 8s ago 20m 48.9M 4096M 19.2.0 37996728e013 8443e06e5959
osd.2 ceph001.xiaohui.cn running (20m) 8s ago 20m 49.5M 4096M 19.2.0 37996728e013 925ad2d10234
osd.3 ceph002.xiaohui.cn running (4m) 9s ago 4m 39.7M 4096M 19.2.0 37996728e013 5e210c3a282b
osd.4 ceph002.xiaohui.cn running (4m) 9s ago 4m 41.5M 4096M 19.2.0 37996728e013 129c9aa7857f
osd.5 ceph002.xiaohui.cn running (4m) 9s ago 4m 37.2M 4096M 19.2.0 37996728e013 47929e2f7933
osd.6 ceph003.xiaohui.cn running (54s) 9s ago 54s 36.2M 4096M 19.2.0 37996728e013 93871c278bdf
osd.7 ceph003.xiaohui.cn running (52s) 9s ago 52s 36.1M 4096M 19.2.0 37996728e013 6bc5b2af98c5
osd.8 ceph003.xiaohui.cn running (49s) 9s ago 49s 36.7M 4096M 19.2.0 37996728e013 4bced2338a51
prometheus.ceph001 ceph001.xiaohui.cn *:9095 running (25s) 8s ago 22m 43.2M - 2.43.0 a07b618ecd1d c765d30f432d

分配新的管理权限

为了方便管理,我们将ceph002.xiaohui.cn这台机器也添加为管理机器

在分配管理权限之前,我们先来看一下此时ceph002.xiaohui.cn 这个主机的配置文件和密钥情况,从下面的情况来看,没有密钥和配置文件

1
2
[root@ceph002 ~]# ls /etc/ceph
rbdmap

确认没权限获取集群信息

1
2
[root@ceph003 ~]# ceph -s
Error initializing cluster client: ObjectNotFound('RADOS object not found (error calling conf_read_file)')

分配_admin标签给它

1
2
[root@ceph001 ~]# ceph orch host label add ceph002.xiaohui.cn _admin
Added label _admin to host ceph002.xiaohui.cn

确认标签

1
2
3
4
5
6
[root@ceph001 ~]# ceph orch host ls --detail
HOST ADDR LABELS STATUS VENDOR/MODEL CPU RAM HDD SSD NIC
ceph001.xiaohui.cn 192.168.8.3 _admin VMware, Inc. (VMware20,1) 4C/4T 4 GiB - 4/2.1TB 1
ceph002.xiaohui.cn 192.168.8.4 _admin VMware, Inc. (VMware20,1) 4C/4T 4 GiB - 4/2.1TB 1
ceph003.xiaohui.cn 192.168.8.5 VMware, Inc. (VMware20,1) 4C/4T 4 GiB - 4/2.1TB 1
3 hosts in cluster

确认配置文件、密钥的状态

1
2
[root@ceph002 ~]# ls /etc/ceph
ceph.client.admin.keyring ceph.conf rbdmap

确认ceph002.xiaohui.cn拥有管理权限,下面的命令执行成功,即可代表它成功获取到了集群信息,权限正常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@ceph002 ~]# ceph -s
cluster:
id: 2abd00ee-d3d7-11ef-ac68-000c29ac059a
health: HEALTH_OK

services:
mon: 3 daemons, quorum ceph001,ceph002,ceph003 (age 9m)
mgr: ceph001.bbzwee(active, since 31m), standbys: ceph002.lekmef
osd: 9 osds: 9 up (since 9m), 9 in (since 9m)

data:
pools: 1 pools, 1 pgs
objects: 2 objects, 449 KiB
usage: 243 MiB used, 4.4 TiB / 4.4 TiB avail
pgs: 1 active+clean

确认集群状态

我们既然已经添加了新的主机和新的OSD到集群,此时在dashboard上的黄色应该是绿色了,我们用命令来查一下集群状态

集群为HEALTH_OK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@ceph001 ~]# ceph -s
cluster:
id: 2abd00ee-d3d7-11ef-ac68-000c29ac059a
health: HEALTH_OK

services:
mon: 3 daemons, quorum ceph001,ceph002,ceph003 (age 7s)
mgr: ceph001.bbzwee(active, since 22m), standbys: ceph002.lekmef
osd: 9 osds: 9 up (since 4s), 9 in (since 26s)

data:
pools: 1 pools, 1 pgs
objects: 2 objects, 449 KiB
usage: 243 MiB used, 4.4 TiB / 4.4 TiB avail
pgs: 1 active+clean

io:
recovery: 87 KiB/s, 0 objects/s

progress:
Global Recovery Event (0s)
[............................]

到此,我们的集群部署就已经结束