Ceph 介绍
Ceph 是一款开源的分布式存储平台,它通过 RADOS(Reliable Autonomic Distributed Object Store)作为底层存储架构,提供以下三种存储模式:
- 块存储(RBD):面向虚拟机、数据库等应用场景,提供高性能和可扩展性。
- 对象存储(RGW):提供与 Amazon S3、OpenStack Swift 兼容的对象存储接口,适合非结构化数据存储。
- 文件存储(CephFS):分布式文件系统,支持大规模并发访问的文件共享应用场景。
Ceph 的架构组件
- Monitor(Mon):维护集群状态,包括集群成员关系和映射信息。
- Object Storage Daemon(OSD):存储数据、处理数据复制、恢复、重平衡任务,是数据存储的核心。
- Manager(Mgr):管理集群的监控、日志、元数据等扩展功能。
- Metadata Server(MDS):用于Ceph文件系统(CephFS),管理文件系统元数据。
Cephadmin 介绍
Cephadm 是 Ceph 社区提供的集群管理工具,专为简化 Ceph 的部署、升级和日常运维而设计。Cephadm 使用容器(如 Docker、Podman)运行 Ceph 服务,使得集群节点可以快速安装、升级和回滚。
依赖
- Python 3
- Systemd
- Podman or Docker for running containers
- Time synchronization (such as Chrony or the legacy ntpd)
- LVM2 for provisioning storage devices
部署环境
节点信息:
主机名 | 系统 | Public 地址 | Cluster 地址 | 配置 | 角色 |
---|---|---|---|---|---|
ceph-mon01 | Rocky Linux 9.5 | 172.31.100.181 | 172.31.100.221 | 2C 4G | mon,mgr,mds |
ceph-mon02 | Rocky Linux 9.5 | 172.31.100.182 | 172.31.100.222 | 2C 4G | mon,mgr,mds |
ceph-mon03 | Rocky Linux 9.5 | 172.31.100.183 | 172.31.100.223 | 2C 4G | mon,mgr,mds |
ceph-osd01 | Rocky Linux 9.5 | 172.31.100.184 | 172.31.100.224 | 2C 4G | osd |
ceph-osd02 | Rocky Linux 9.5 | 172.31.100.185 | 172.31.100.225 | 2C 4G | osd |
ceph-osd03 | Rocky Linux 9.5 | 172.31.100.186 | 172.31.100.226 | 2C 4G | osd |
网络划分:
- Public 网络:172.31.100.128/26
- Cluster 网络:172.31.100.192/26
系统初始化配置
配置主机名以及 hosts 解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cat >> /etc/hosts <<EOF
172.31.100.181 ceph-mon01
172.31.100.182 ceph-mon02
172.31.100.183 ceph-mon03
172.31.100.184 ceph-osd01
172.31.100.185 ceph-osd02
172.31.100.186 ceph-osd03
172.31.100.221 ceph-mon01
172.31.100.222 ceph-mon02
172.31.100.223 ceph-mon03
172.31.100.224 ceph-osd01
172.31.100.225 ceph-osd02
172.31.100.226 ceph-osd03
EOF安装常用的软件
1
dnf install -y net-tools vim wget lrzsz tree bash-completion epel-release chrony
关闭防火墙以及 Selinux
1
2
3
4
5# 关闭防火墙
systemctl disable --now firewalld.service
# 关闭 SeLinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config修改醒目 PS1
1
2
3
4
5
6
7
8
9
10
11
12cat >> /etc/profile<<EOF
# 修改 PS1 样式
export PS1='\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\[\e[33;40m\]\h \[\e[35;40m\]\W\[\e[0m\]]\\$ '
# 修改历史命令格式
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S \$(whoami) "
export PROMPT_COMMAND='{ msg=\$(history 1 | { read x y; echo \$y; }); logger "[euid=\$(whoami)]":\$(who am i):[\$(pwd)]"\$msg";}'
# 设置回话超时时间
export TMOUT=3600
EOF配置时间同步
1
2
3
4
5
6
7
8
9
10
11# 安装时间同步服务
dnf install -y chrony
# 添加时间服务器地址
sed -i '/^pool 2\.rocky\.pool\.ntp\.org iburst/a pool 10.0.88.118 iburst' /etc/chrony.conf
# 启动服务
systemctl enable --now chronyd
# 检查时间同步状态
chronyc sources关闭 SSH 配置中 UseDNS
1
sed -i 's/#UseDNS no/UseDNS no/g' /etc/ssh/sshd_config
配置服务器 limits 限制
1
2
3
4
5
6
7
8
9
10# 临时设置
ulimit -SHn 655350
# 永久设置
sed -i '/^# End/i\* soft nofile 655350' /etc/security/limits.conf
sed -i '/^# End/i\* hard nofile 131072' /etc/security/limits.conf
sed -i '/^# End/i\* soft nproc 655350' /etc/security/limits.conf
sed -i '/^# End/i\* hard nproc 655350' /etc/security/limits.conf
sed -i '/^# End/i\* soft memlock unlimited' /etc/security/limits.conf
sed -i '/^# End/i\* hard memlock unlimited' /etc/security/limits.conf配置 nf_conntrack
1
2
3
4
5
6
7
8
9
10cat > /etc/modules-load.d/ipvs.conf <<EOF
nf_conntrack
nf_conntrack_ipv4
EOF
systemctl enable --now systemd-modules-load.service
echo options nf_conntrack hashsize=131072 > /etc/modprobe.d/nf_conntrack.conf
# 检查模块是否加载
lsmod | grep -e ip_vs -e nf_conntrack配置内核调优参数
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
29
30
31
32
33
34
35
36
37# 备份原有配置
mv /etc/sysctl.conf{,_bak}
# 创建新配置
cat > /etc/sysctl.conf << EOF
fs.file-max=1000000
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_syncookies = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65000
net.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
EOF
sysctl -p
安装 Docker
卸载系统上旧的 Docker
1
2
3
4
5
6
7
8dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine添加 Docker 仓库地址
1
2dnf -y install dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装 Docker-CE
1
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
配置 Docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"data-root": "/data/docker",
"storage-driver": "overlay2",
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"log-driver": "json-file",
"live-restore": true
}
EOF启动 Docker
1
2systemctl daemon-reload
systemctl enable --now docker.service
安装 Cephadm(ceph-mon01 节点)
使用 dnf 软件管理工具安装 cephadm
1
2
3
4
5
6
7
8# 查找系统中支持的 Ceph 版本
dnf search release-ceph
# 安装指定版本的 Ceph 仓库
dnf install -y centos-release-ceph-reef.noarch
# 安装 Cephadm
dnf install -y cephadm ceph-common安装
ceph-common
软件包,其中包含所有 ceph 命令,包括 ceph、rbd 和 mount.ceph(用于挂载 CephFS 文件系统)查看 cephadm 版本
1
2
3cephadm version
# cephadm version 18.2.4 (e7ad5345525c7aa95470c26863873b581076945d) reef (stable)
部署 Ceph 集群
在 ceph-mon01 节点执行以下命令初始化集群,该命令会拉取 cephadm 对应版本的 ceph 组件容器镜像,然后根据网络等初始化参数进行部署相关组件。
1
cephadm bootstrap --mon-ip 172.31.100.181 --cluster-network 172.31.100.192/26 --allow-fqdn-hostname
以上命令会执行以下步骤:
- 在本地主机上拉取容器镜像,为新集群创建 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
的副本。
部署后,会提示 dashboard 的登录地址和权限,记得保存。
1
2
3
4
5
6Ceph Dashboard is now available at:
URL: https://ceph-mon01:8443/
User: admin
Password: sakz4x8oo9如果忘记了初始化密码, 也可以使用命令修改 dashboard 密码:
1
2
3
4echo admin@12345 | ceph dashboard set-login-credentials admin -i -
# 新版本推荐使用以下命令
echo "admin@12345" | ceph dashboard ac-user-set-password admin -i -
添加节点
查看集群现有的节点
1
2
3
4# ceph orch host ls
HOST ADDR LABELS STATUS
ceph-mon01 172.31.100.181 _admin
1 hosts in cluster配置
ceph-mon01
免密登录其他节点。在初始化后,cephadm 会生成一对ssh密钥,存放在/etc/ceph/
目录,执行以下命令,把秘钥放到其他节点上1
2
3
4
5ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon02
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon03
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd01
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd02
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd03添加其他的节点到集群
1
2
3
4
5
6
7
8
9
10[root@ceph-mon01 ~]# ceph orch host add ceph-mon02 172.31.100.182
Added host 'ceph-mon02' with addr '172.31.100.182'
[root@ceph-mon01 ~]# ceph orch host add ceph-mon03 172.31.100.183
Added host 'ceph-mon03' with addr '172.31.100.183'
[root@ceph-mon01 ~]# ceph orch host add ceph-osd01 172.31.100.184
Added host 'ceph-osd01' with addr '172.31.100.184'
[root@ceph-mon01 ~]# ceph orch host add ceph-osd02 172.31.100.185
Added host 'ceph-osd02' with addr '172.31.100.185'
[root@ceph-mon01 ~]# ceph orch host add ceph-osd03 172.31.100.186
Added host 'ceph-osd03' with addr '172.31.100.186'再次查看当前集群的节点
1
2
3
4
5
6
7
8
9# ceph orch host ls
HOST ADDR LABELS STATUS
ceph-mon01 172.31.100.181 _admin
ceph-mon02 172.31.100.182
ceph-mon03 172.31.100.183
ceph-osd01 172.31.100.184
ceph-osd02 172.31.100.185
ceph-osd03 172.31.100.186
6 hosts in cluster指定 mon 服务部署到指定节点
1
ceph orch apply mon "ceph-mon01,ceph-mon02,ceph-mon03"
查看集群状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# ceph -s
cluster:
id: 977c0076-abd8-11ef-bcf0-005056814a7e
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 31s)
mgr: ceph-mon01.skblhv(active, since 17h), standbys: ceph-mon02.lpvnqk
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:为其他 mon 节点添加
_admin
标签。默认情况下,ceph.conf
文件和client.admin
密钥的副本都保留在所有具有_admin
标签主机上的/etc/ceph
中。此标签最初仅应用于引导主机。建议为一个或多个其他主机提供_admin
标签,以便可以在多个主机上轻松访问 Ceph CLI。1
2ceph orch host label add ceph-mon02 _admin
ceph orch host label add ceph-mon03 _admin
部署 OSD 服务
查看集群当前可用的物理设备
1
2
3
4
5
6
7
8
9
10
11
12ceph orch device ls
HOST PATH TYPE DEVICE ID SIZE AVAILABLE REFRESHED REJECT REASONS
ceph-mon01 /dev/sr0 hdd VMware_Virtual_IDE_CDROM_Drive_00000000000000000001 1023M No 20m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)
ceph-mon02 /dev/sr0 hdd VMware_Virtual_IDE_CDROM_Drive_00000000000000000001 1023M No 16m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)
ceph-mon03 /dev/sr0 hdd VMware_Virtual_IDE_CDROM_Drive_00000000000000000001 1023M No 14m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)
ceph-osd01 /dev/sdb hdd 100G Yes 13m ago
ceph-osd01 /dev/sr0 hdd VMware_Virtual_IDE_CDROM_Drive_00000000000000000001 1023M No 13m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)
ceph-osd02 /dev/sdb hdd 100G Yes 14m ago
ceph-osd02 /dev/sr0 hdd VMware_Virtual_IDE_CDROM_Drive_00000000000000000001 1023M No 14m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)
ceph-osd03 /dev/sdb hdd 100G Yes 14m ago
ceph-osd03 /dev/sr0 hdd VMware_Virtual_IDE_CDROM_Drive_00000000000000000001 1023M No 14m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)命令输出结果是当前添加ceph集群的节点的空闲设备清单。
提示: 如果一个存储设备想要加入ceph集群,要求满足2个条件:
- 设备未被使用。
- 设备的存储大小必须大于5GB。
如果担心不准确,可以登录到各节点,执行命令确认空闲设备信息:
1
lsblk
查看当前的 osd 列表,默认是没有osd的, 即没有安装osd服务。等添加完osd设备后,才会统一安装osd服务,并且物理设备和 osd 服务的关系是一对一。
1
2
3# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0 root default添加 OSD 设备到集群
1
2
3ceph orch daemon add osd ceph-osd01:/dev/sdb
ceph orch daemon add osd ceph-osd02:/dev/sdb
ceph orch daemon add osd ceph-osd03:/dev/sdb该命令允许您一次添加多个设备成osd,命令格式为
1
2ceph orch daemon add osd host:device1,device2,...
ceph orch daemon add osd host:data_devices=device1,device2,db_devices=device3,osds_per_device=2,...查看 OSD 的状态和信息
1
2
3
4
5
6
7
8
9# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.29306 root default
-3 0.09769 host ceph-osd01
0 hdd 0.09769 osd.0 up 1.00000 1.00000
-5 0.09769 host ceph-osd02
1 hdd 0.09769 osd.1 up 1.00000 1.00000
-7 0.09769 host ceph-osd03
2 hdd 0.09769 osd.2 up 1.00000 1.00000字段说明:
字段 说明 ID 表示设备或节点的唯一标识符,负值表示聚合节点(如 root 或 host),正值代表具体的 OSD。 CLASS 存储设备的类型,比如 hdd(机械硬盘)、ssd(固态硬盘)。如果没有显示,通常表示设备的类型没有分类。 WEIGHT OSD 在数据分布和权重计算中的权重值,通常基于设备的存储容量。WEIGHT 值越高,表示该 OSD 可以存储更多的数据。 TYPE 节点类型,root 表示根节点,host 表示主机,osd 表示具体的对象存储守护进程(OSD)。 NAME 节点名称或 OSD 守护进程名称,如 ceph-osd01 表示主机名,osd.0 表示 OSD 守护进程编号。 STATUS 显示 OSD 的状态,up 表示 OSD 正在运行,down 表示 OSD 已关闭或无法访问。 REWEIGHT OSD 的动态权重,用于手动调整数据分布。如果需要减小或增加某个 OSD 的数据分布,可以通过调节此值。通常为 1.00000,表示正常权重。 PRI-AFF 表示 OSD 的主优先级关联,通常用于调节数据在 OSD 之间的读取优先级。值为 1.00000 表示正常优先级。 查看集群状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# ceph -s
cluster:
id: 977c0076-abd8-11ef-bcf0-005056814a7e
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 6h)
mgr: ceph-mon01.skblhv(active, since 23h), standbys: ceph-mon02.lpvnqk
osd: 3 osds: 3 up (since 2h), 3 in (since 2h)
data:
pools: 1 pools, 1 pgs
objects: 2 objects, 449 KiB
usage: 81 MiB used, 300 GiB / 300 GiB avail
pgs: 1 active+clean