Ceph 集群搭建到应用:从入门到熟练¶
ceph-deploy 比较适合生产环境,不是用 cephadm 搭建。相对麻烦一些,但是并不难,细节把握好就行,只是命令多一些而已。
集群实验环境¶
| 主机名 | 公网 IP | 集群 IP | 角色 |
|---|---|---|---|
| deploy | 192.168.2.120 | 用于部署集群、管理集群 | |
| ceph-node1 | 192.168.2.121 | 192.168.6.135 | ceph-mon、ceph-mgr、ceph-osd |
| ceph-node2 | 192.168.2.122 | 192.168.6.136 | ceph-mon、ceph-mgr、ceph-osd |
| ceph-node3 | 192.168.2.123 | 192.168.6.137 | ceph-mon、ceph-osd |
资源建议:
ceph-osd 节点:一般建议裸金属部署。10c/12c, 32G、64G 更好。
ceph-mgr 两个节点就可以做高可用了。
ceph-mon 必须 3 个节点以上。性能可以低一点,4c8g 也够用,4C16G 更好。
生产环境建议将 ceph-mgr、ceph-mon 节点都单独分开。
集群搭建¶
准备工作¶
关闭防火墙、关闭 SELinux:
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
sed -i '7s/enforcing/disabled/' /etc/selinux/config
设置 hostname:
hostnamectl set-hostname ceph-node1
hostnamectl set-hostname ceph-node2
hostnamectl set-hostname ceph-node3
hostnamectl set-hostname ceph-deploy
设置 host 相互解析:
192.168.2.120 ceph-deploy
192.168.2.121 ceph-node1
192.168.2.122 ceph-node2
192.168.2.123 ceph-node3
每台服务器添加 epel 源:
[epel]
name=Extra Packages for Enterprise Linux 7 -
baseurl=http://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
每台服务器添加 Ceph 源:
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc
每台服务器添加 ceph 用户:
groupadd ceph -g 3333
useradd -u 3333 -g 3333 ceph
echo "cephadmin888" | passwd --stdin ceph
配置 sudoers:
echo "ceph ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
ceph-deploy 节点生成 SSH 密钥并分发:
su - ceph
ssh-keygen
sudo ssh-copy-id [email protected]
sudo ssh-copy-id [email protected]
sudo ssh-copy-id [email protected]
开始部署集群¶
安装 ceph-deploy:
su - ceph
mkdir ceph-cluster-deploy && cd ceph-cluster-deploy
sudo yum install ceph-deploy python-setuptools python2-subprocess3
安装 OSD 节点:
# --no-adjust-repos 不修改已有源
# --nogpgcheck 跳过 gpg 校验
ceph-deploy install --no-adjust-repos --nogpgcheck ceph-node{1..3}
初始化集群:
ceph-deploy new --cluster-network 192.168.6.0/24 --public-network 192.168.2.0/24 ceph-node1 ceph-node2 ceph-node3
配置 MON 节点:
# 初始化 mon
ceph-deploy mon create-initial
# 推送管理密钥到节点
ceph-deploy admin ceph-node{1..3}
ceph-deploy admin ceph-deploy
# 在各节点设置 facl 权限
setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
配置 MGR 节点:
只有 ceph luminous 及以上版本才有 mgr 节点。
ceph-deploy mgr create ceph-node1 ceph-node2
检查集群状态:
ceph -s
# cluster:
# id: f1da3a2e-b8df-46ba-9c6b-0030da25c73e
# health: HEALTH_WARN
# OSD count 0 < osd_pool_default_size 3
# services:
# mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
# mgr: ceph-node1(active), standbys: ceph-node2
# osd: 0 osds: 0 up, 0 in
添加 OSD 节点¶
# 擦除磁盘
ceph-deploy disk zap ceph-node1 /dev/sd{b,c,d}
ceph-deploy disk zap ceph-node2 /dev/sd{b,c,d}
ceph-deploy disk zap ceph-node3 /dev/sd{b,c,d}
# 添加 OSD
ceph-deploy osd create ceph-node1 --data /dev/sdb
ceph-deploy osd create ceph-node1 --data /dev/sdc
ceph-deploy osd create ceph-node1 --data /dev/sdd
# ... 其他节点类似
# 设置开机启动
systemctl enable ceph-osd@{0,1,2} # ceph-node1
systemctl enable ceph-osd@{3,4,5} # ceph-node2
systemctl enable ceph-osd@{6,7,8} # ceph-node3
检查 OSD 状态:
ceph osd stat # 9 osds: 9 up, 9 in
ceph osd status # 详细状态表格
ceph osd tree # 树形结构
ceph osd df # 磁盘使用情况
管理相关¶
从集群中移除 OSD¶
移除时最好一个个移除,避免性能问题。
ceph osd out <osd-id>
systemctl stop ceph-osd@<osd-id>
ceph osd purge <osd-id> --yes-i-really-mean-it
手动测试数据上传下载¶
# 创建 pool
ceph osd pool create <pool名> <pg值> <pgp值>
# 上传/下载
rados put myfile /etc/fstab -p <pool名>
rados ls -p <pool名>
rados get myfile -p <pool名> /tmp/my.txt
# 查看文件映射关系
ceph osd map <pool名> myfile
扩展 MON/MGR 节点¶
# 扩展 MON
ceph-deploy mon add ceph-mon4
# 扩展 MGR
ceph-deploy mgr create ceph-node3
Ceph 集群的应用¶
块存储(RBD)¶
用于 K8S、OpenStack、Linux 中直接挂载,类似使用 iSCSI 块存储。
# 1. 创建存储池
ceph osd pool create django-web 16
# 2. 开启 RBD 功能
ceph osd pool application enable django-web rbd
rbd pool init -p django-web
# 3. 创建镜像(CentOS 7 内核低,需要用 --image-feature layering)
rbd create --pool django-web --image img001 --size 1G
rbd create --pool django-web --image img002 --size 1G --image-feature layering
# 4. 客户端安装 ceph-common 并复制 keyring
yum install -y ceph-common
scp ceph.client.admin.keyring root@<client>:/etc/ceph
# 5. 映射 RBD
rbd map -p django-web --image img002
# /dev/rbd0
# 6. 格式化并挂载
mkfs.ext4 /dev/rbd0
mkdir /mnt/ceph-rbd-dir
mount /dev/rbd0 /mnt/ceph-rbd-dir/
# 7. 配置开机挂载(/etc/rc.local)
rbd map -p django-web --image img002
mount /dev/rbd0 /mnt/ceph-rbd-dir/
对象存储 Ceph RadosGW(RGW)¶
RGW 提供 RESTful 接口,客户端通过 API 进行交互。通过 7480 端口访问。
# 1. 在 RGW 节点安装包
yum install -y ceph-radosgw
# 2. 添加 RGW 节点
ceph-deploy rgw create ceph-node2
# 3. 查看状态
ceph -s # rgw: 1 daemon active
ceph osd lspools # 会生成 .rgw.root、default.rgw.control 等 pool
# 4. RGW 高可用:添加多个 RGW 节点,通过 Nginx 反代
ceph-deploy rgw create ceph-node1
修改 RGW 端口:
# /etc/ceph/ceph.conf
[client.rgw.<节点名>]
rgw_host=<节点名>
rgw_frontends="civetweb port=8880"
# HTTPS: rgw_frontends="civetweb port=8880+8443s ssl_certificate='pem证书'"
systemctl restart ceph-radosgw@rgw.<节点名>
文件系统存储 CephFS¶
CephFS 需要 MDS 服务(ceph-mds)。创建好后各 MON 节点监听 6789 端口。
# 1. 安装 ceph-mds
yum install -y ceph-mds
# 2. 添加 MDS 节点
ceph-deploy mds create ceph-node3
# 3. 创建 metadata 和 data 存储池
ceph osd pool create cephfs-metadata-pool 16
ceph osd pool create cephfs-data-pool 16
# 4. 创建 CephFS
ceph fs new cephfs-test cephfs-metadata-pool cephfs-data-pool
# 5. 查看 CephFS 状态
ceph fs status
ceph fs ls
ceph mds stat
客户端挂载 CephFS:
# 安装 ceph-common 并复制 keyring
yum install -y ceph-common
# 挂载
mount.ceph 192.168.2.121:6789:/ /mnt/ceph-fs-dir -o name=admin,secret=<key>
# 或者指定多个 MON 节点
mount.ceph 192.168.2.121,192.168.2.122,192.168.2.123:/ /mnt/ceph-fs-dir/ -o name=admin,secret=<key>
fstab 开机挂载:
# _netdev: 网络类型的 fs 都要加,避免开机卡住
# noatime: 不更新 atime,优化性能
192.168.2.121,192.168.2.122,192.168.2.123:/ /mnt/ceph-fs-dir ceph defaults,_netdev,noatime,name=admin,secret=<key> 0 0
MDS 高可用¶
一主多备:添加多个 MDS 节点即可。
ceph-deploy mds create ceph-node2
MDS 高性能¶
设置多组一主一备同时提供服务:
# 添加更多 MDS 节点
ceph-deploy mds create ceph-node1
ceph-deploy mds create ceph-deploy
# 设置最大活跃数
ceph fs set cephfs-test max_mds 2
手动指定 MDS 主备关系¶
通过修改 ceph.conf 指定:
[mds.ceph-node2]
mds_standby_replay=true
mds_standby_for_name=ceph-node3
[mds.ceph-node1]
mds_standby_replay=true
mds_standby_for_name=ceph-deploy
# 分发配置并重启
ceph-deploy --overwrite-conf config push ceph-node{1,2,3} ceph-deploy
systemctl restart ceph-mds@<节点名>
主备参数说明:
| 参数 | 说明 |
|---|---|
mds_standby_replay |
持续读取主 rank 的元数据日志,加速故障切换 |
mds_standby_for_name |
指定当前 MDS 是哪个节点的备用 |
mds_standby_for_rank |
仅备用于指定的 rank |
mds_standby_for_fscid |
联合 rank 参数,指定为哪个 CephFS 的 rank 冗余 |
Ceph 集群维护¶
关闭集群¶
- 设置 noout:
ceph osd set noout - 关闭客户端读写
- 关闭 RGW
- 关闭 MDS
- 关闭 OSD:
systemctl stop ceph-osd@xxx - 关闭 MGR
- 关闭 MON
启动集群¶
与关闭步骤相反。
Ceph 存储池 Pool¶
存储池类型¶
- replicated:副本池(默认)
- erasure:纠删码池(节省空间,但只有 RGW 支持,RBD 和 CephFS 不支持)
PG 归置组¶
正常状态应为 active+clean。
| 状态 | 说明 |
|---|---|
| active | 主 OSD 和备 OSD 均就绪,可正常处理请求 |
| clean | 副本数符合要求,上行集和活动集是同一组 OSD |
| peering | OSD 间就数据对象状态达成一致的过程 |
| degraded | 某个 OSD 挂了出现降级状态 |
| stale | 主 OSD 无法正常向监视器发送报告 |
| undersized | PG 中副本数少于存储池定义的个数 |
存储池操作¶
创建:
ceph osd pool create <pool名> <pg-num> [<pgp-num>]
查询:
ceph osd pool ls [detail] # 列出所有存储池
ceph osd lspools # 列出存储池及 ID
ceph osd pool stats [pool名] # 查看状态
rados df # 查看存储池容量
重命名:
ceph osd pool rename <旧名> <新名>
删除(需先允许删除):
ceph tell mon.* injectargs --mon-allow-pool-delete=true
ceph osd pool rm <pool名> <pool名> --yes-i-really-really-mean-it
ceph tell mon.* injectargs --mon-allow-pool-delete=false
存储池属性¶
# 获取所有属性
ceph osd pool get <pool名> all
# 修改属性
ceph osd pool set <pool名> <key> <value>
常用属性:
| 属性 | 说明 |
|---|---|
| size | 副本数 |
| min_size | 最小副本数 |
| pg_num / pgp_num | PG 数量 |
| nodelete | 不可删除(默认 false) |
| noscrub | 不进行浅度整理(默认 false) |
| nodeep-scrub | 不进行深度整理(默认 false) |
存储池配额¶
# 查看配额
ceph osd pool get-quota <pool名>
# 设置配额(对象数量或空间大小)
ceph osd pool set-quota <pool名> max_bytes 2G
ceph osd pool set-quota <pool名> max_objects 1000
存储池快照¶
# 创建快照
rados -p <pool名> mksnap <snap名>
# 查看快照
rados -p <pool名> lssnap
# 回滚
rados -p <pool名> rollback <obj名> <snap名>
# 删除快照
rados -p <pool名> rmsnap <snap名>
RBD 块存储进阶操作¶
启用/关闭镜像特性¶
rbd feature disable django-web/img001 object-map fast-diff deep-flatten
扩容镜像¶
# 扩容到 2G
rbd resize -p django-web --image img002 --size 2G
# 客户端重新映射后扩容文件系统
# ext4:
resize2fs /dev/rbd0
# xfs:
xfs_growfs /mnt/ceph-rbd-dir
镜像快照¶
rbd snap create <pool名>/<镜像名> --snap <snap名>
rbd snap ls <pool名>/<镜像名>
rbd snap rollback <pool名>/<镜像名> --snap <snap名>
rbd snap rm <pool名>/<镜像名> --snap <snap名>
rbd snap protect <pool名>/<镜像名> --snap <snap名> # 禁止删除
rbd snap unprotect <pool名>/<镜像名> --snap <snap名> # 允许删除
Ceph 集群认证 CephX¶
授权文件¶
# /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQCAGoVlpj0zERAA5dhEHlg/a5TyQhPPlTigUg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
权限定义¶
| 权限 | 说明 |
|---|---|
| r | 只读 |
| w | 可写 |
| x | 读写,在 MON 上可执行 auth |
| * | 所有权限 |
| profile osd | 以 OSD 身份连接 |
| profile mds | 以 MDS 身份连接 |
pool=<pool名> |
限制在指定 pool 生效 |
用户管理¶
# 添加用户
ceph auth add client.zhangsan mon 'allow r' osd 'allow rw pool=django-web'
# 修改权限
ceph auth caps client.zhangsan osd 'allow rwx pool=django-web' mon 'allow r'
# 列出所有用户
ceph auth ls
# 查看用户
ceph auth get client.zhangsan
# 删除用户
ceph auth del client.zhangsan
# 导出 keyring 文件
ceph auth get client.zhangsan > /etc/ceph/ceph.client.zhangsan.keyring
# 导出 key 文件
ceph auth get-key client.zhangsan -o /tmp/zhangsan.key
指定用户运行¶
# --id 或 --user:只写 ID,如 zhangsan
ceph --id zhangsan <命令>
# -n 或 --name:写 TYPE.ID,如 client.zhangsan
ceph -n client.zhangsan <命令>
CephX 使用实例¶
CephFS 使用普通用户¶
# 创建用户(data-pool 读写,metadata-pool 由 MDS 操作)
ceph auth add client.lisi mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs-data-pool'
# 导出 key
ceph auth get-key client.lisi > /etc/ceph/lisi.key
# fstab 中使用
192.168.2.121,192.168.2.122,192.168.2.123:/ /mnt/ceph-fs-dir ceph defaults,_netdev,noatime,name=lisi,secretfile=/etc/ceph/lisi.key 0 0
RBD 使用普通用户¶
# 创建用户
ceph auth caps client.zhangsan osd 'allow rwx pool=django-web' mon 'allow r'
# 导出 keyring
ceph auth get client.zhangsan > /etc/ceph/ceph.client.zhangsan.keyring
# 映射时指定用户
rbd map -p django-web --image img002 --id zhangsan
Ceph 监控¶
Ceph Dashboard¶
# 启用 Dashboard 插件
ceph mgr module enable dashboard
# 关闭 SSL(或使用自签名证书)
ceph config set mgr mgr/dashboard/ssl false
# 或:ceph dashboard create-self-signed-cert
# 创建用户
ceph dashboard set-login-credentials admin 123456
# 查看地址
ceph mgr services
# {"dashboard": "http://ceph-node1:8080/"}
# 修改端口和地址
ceph config set mgr mgr/dashboard/ceph-node1/server_addr 192.168.2.121
ceph config set mgr mgr/dashboard/ceph-node1/server_port 9977
对接 Prometheus¶
# 启用 Prometheus 模块(监听 9283 端口)
ceph mgr module enable prometheus
ceph mgr services
# {"prometheus": "http://ceph-node1:9283/"}
Ceph 集群配置优化¶
# /etc/ceph/ceph.conf
# 设置监视器允许的时钟偏移值(默认 0.05 秒)
mon clock drift allowed=<秒>
# 连续发生多少次偏移后发出警告
mon clock drift warn backoff=<NUM>
修改完配置后推送到各节点:
ceph-deploy --overwrite-conf config push <节点名>
最后更新: 2026年4月19日