简介:本资源是一份面向IT运维工程师与存储系统架构师的Ceph集群手动部署实战指南,聚焦AlmaLinux 8.9环境下使用Ceph原生命令从零构建高可用分布式存储集群的完整流程。内容覆盖MON、MGR、OSD、MDS、RGW五大核心组件的逐节点部署、源配置优化(含AlmaLinux与Ceph双源替换、GPG校验关闭等关键实操)、依赖安装、密钥生成及常见陷阱警示,兼具原理说明与工程落地经验。资源为单文件PDF文档,共1个文件,大小427KB,轻量易读,适合作为现场部署参考手册或进阶学习笔记。目前已有115人学习下载,读者可直接获取清晰的集群规划表、命令级操作序列、真实环境参数配置(如Ceph 17.2.7+三节点复用部署拓扑)、以及epel源集成、dnf缓存更新等关键环节的排错提示,显著提升部署成功率与系统理解深度。
1. 不依赖 Ansible 或 Cephadm,用原生命令从零搭起可运行的 Ceph 集群——适合离线环境、PVE 节点复用、或需精确控制每个服务生命周期的运维场景
很多工程师第一次接触 Ceph 部署时,会直接跳进cephadm bootstrap或ceph-ansible的封装里,结果在 PVE 环境下因容器运行时冲突报错,在离线机房因缺少 Python 包管理器卡在pip install cephadm,或在审计严格的生产环境中被要求“禁用所有自动化部署脚本”。其实 Ceph 自带的一套原生命令(ceph-mon,ceph-mgr,ceph-osd,ceph-authtool,ceph-create-keys等)完全能构建出功能完整、符合官方推荐拓扑的集群——它不依赖 Python 环境、不拉取远程镜像、不生成临时容器,所有进程直跑在宿主机上,配置文件和密钥全由人工显式生成与分发。本文面向已掌握 Linux 基础服务管理(systemd、firewalld、SELinux)、熟悉存储节点规划(OSD 数量/磁盘绑定/网络分离)的中级以上运维与平台工程师,目标是:用纯ceph命令链完成 MON/MGR/OSD 三类核心服务的手动初始化、密钥分发、服务注册与健康验证,全程无 Ansible、无 cephadm、无容器层干扰,最终输出一个ceph -s显示HEALTH_OK且ceph osd tree可见全部 OSD 的真实集群。
2. 用ceph-mon和ceph-authtool初始化 Monitor 节点并生成初始密钥环
Monitor 是 Ceph 集群的“大脑”,负责维护集群地图(monmap)、处理客户端认证请求、协调 Paxos 投票。原生命令部署的第一步不是写配置文件,而是先生成可信的 monitor 密钥与初始 monmap——这一步若跳过或用ceph-authtool --gen-print-key随机生成再手动拼接,后续 OSD 启动时会因auth: unable to find a keyring拒绝加入。
2.1 创建 monitor 数据目录并生成 monitor 密钥
# 在首个 monitor 节点(如 node1)执行 mkdir -p /var/lib/ceph/mon/ceph-node1 ceph-authtool --create-keyring /var/lib/ceph/mon/ceph-node1/keyring --gen-key -n mon. --cap mon 'allow *'提示:
--cap mon 'allow *'是 monitor 进程自身的权限声明,表示允许其读写 monmap、处理选举等全部 monitor 职责。此处不能省略引号,否则 shell 会将*展开为当前目录文件名。
2.2 构建初始 monmap 并注入 monitor 地址
# 获取 monitor 节点 IP(假设 node1 IP 为 192.168.10.11) MON_IP="192.168.10.11" MON_NAME="node1" # 创建空 monmap monmaptool --create --clobber --add $MON_NAME $MON_IP:3300 --fsid $(uuidgen) /tmp/monmap # 将 monmap 注入 keyring(关键步骤!否则 ceph-mon 启动失败) ceph-authtool /var/lib/ceph/mon/ceph-node1/keyring --import-monmap /tmp/monmap注意:
--add $MON_NAME $MON_IP:3300中的端口必须是3300(Ceph Monitor 默认端口),不可写成6789或其他;--fsid必须用uuidgen生成唯一值,不能复用已有集群的 FSID,否则 OSD 加入时会报fsid mismatch。
2.3 启动 monitor 服务并验证监听状态
# 手动启动 monitor(不走 systemd,便于调试) ceph-mon --id node1 --setuser ceph --setgroup ceph --mkfs --mon-data /var/lib/ceph/mon/ceph-node1 --monmap /tmp/monmap # 启动守护进程 ceph-mon --id node1 --setuser ceph --setgroup ceph --mon-data /var/lib/ceph/mon/ceph-node1 --public-addr $MON_IP:3300 # 验证端口监听 ss -tlnp | grep :3300 # 应输出:LISTEN 0 128 *:3300 *:* users:(("ceph-mon",pid=XXXX,fd=20))逻辑说明:
--mkfs参数会初始化 monitor 数据库(leveldb),生成mon_node1/目录下的store.db;--public-addr显式指定对外地址,避免 ceph-mon 自动解析 hostname 导致绑定到 127.0.0.1;--setuser/group ceph强制以非 root 用户运行,符合安全基线要求。
| 参数 | 作用 | 是否必填 | 常见误配 |
|---|---|---|---|
--id | monitor 实例名,必须与 keyring 中-n mon.后缀一致 | ✅ | 写成mon1而非node1,导致 auth 失败 |
--mon-data | monitor 数据目录路径,需提前chown ceph:ceph | ✅ | 路径不存在或权限为 root,启动报Permission denied |
--public-addr | 客户端连接地址,格式IP:PORT | ✅ | 漏写端口,或写成hostname:3300(DNS 不可达时失败) |
--monmap | 初始 monmap 文件路径,仅首次启动需要 | ⚠️(首次必填) | 复用旧 monmap 导致新节点无法加入 |
3. 用ceph-mgr手动部署 Manager 服务并启用基础模块
Manager(mgr)是 Ceph 的“操作中枢”,负责提供 REST API、Prometheus 指标、Dashboard、Zabbix 集成等扩展能力。原生命令部署 mgr 的核心在于:先生成 mgr 密钥,再通过ceph auth add注册到 monitor,最后启动 mgr 进程绑定到已存在的 monmap。与 monitor 不同,mgr 不参与 Paxos 投票,因此无需嵌入 monmap,但必须能连通 monitor。
3.1 生成 mgr 密钥并注入集群认证库
# 在 node1 上执行(与 monitor 同节点或独立节点均可) mkdir -p /var/lib/ceph/mgr/ceph-node1 # 生成 mgr 密钥 ceph-authtool --create-keyring /var/lib/ceph/mgr/ceph-node1/keyring --gen-key -n mgr.node1 --cap mon 'profile mgr' --cap osd 'allow *' --cap mds 'allow *' --cap pg 'allow *' # 将密钥导入 monitor(此时 monitor 已运行) ceph auth add mgr.node1 -i /var/lib/ceph/mgr/ceph-node1/keyring提示:
--cap mon 'profile mgr'表示该 mgr 实例拥有 manager profile 权限,可调用 monitor 的 mgr 相关接口;--cap osd 'allow *'是 dashboard 模块读取 OSD 状态所必需,漏掉会导致ceph dashboard is not enabled。
3.2 启动 mgr 服务并启用关键模块
# 启动 mgr(同样不走 systemd) ceph-mgr --id node1 --setuser ceph --setgroup ceph --mgr-data /var/lib/ceph/mgr/ceph-node1 # 启用 dashboard 模块(需先安装 ceph-mgr-dashboard 包) ceph mgr module enable dashboard # 配置 dashboard 监听地址(假设 node1 有管理网卡 192.168.10.11) ceph dashboard set-login-banner "Ceph Cluster: Production - Manual Deploy" ceph dashboard set-ssl-certificate ceph dashboard set-frontend-api-host 192.168.10.11 ceph dashboard set-frontend-api-port 8443注意:
ceph dashboard set-ssl-certificate会自动生成自签名证书,若需替换为公司 CA 签发证书,应将dashboard.crt和dashboard.key放入/var/lib/ceph/mgr/ceph-node1/并执行ceph dashboard set-ssl-certificate重新加载。
3.3 验证 mgr 状态与模块加载
# 查看 mgr 是否在线 ceph status | grep "mgr" # 正常输出:mgr: node1(active, since 2h ago) # 查看已启用模块 ceph mgr dump | jq '.modules' # 应包含 "dashboard", "prometheus", "restful" 等 # 检查 dashboard 是否响应(需 curl 安装) curl -k https://192.168.10.11:8443/ # 返回 HTML 页面即成功逻辑说明:
ceph-mgr启动后会自动向 monitor 注册自身信息,monitor 通过ceph status可感知其存活;ceph mgr module enable是幂等操作,重复执行无副作用;set-frontend-api-host必须设为 mgr 所在节点的实际 IP,不能是0.0.0.0(dashboard 会拒绝绑定)。
4. 用ceph-osd命令逐台初始化 OSD 并加入集群
OSD(Object Storage Daemon)是 Ceph 的数据存储单元,原生命令部署 OSD 的难点在于:磁盘准备、密钥分发、crush map 绑定、服务注册四步必须严格串行,且每步失败都会导致ceph osd tree中缺失节点。不同于 cephadm 的自动磁盘擦除,手动模式需显式调用ceph-volume lvm create或裸设备初始化,本文采用更可控的 LVM 方式。
4.1 准备 OSD 物理磁盘并创建 LVM 逻辑卷
# 在 OSD 节点(如 node2)执行 # 假设 /dev/sdb 为数据盘,/dev/sdc 为 WAL/DB 盘(可选) pvcreate /dev/sdb vgcreate ceph-vol /dev/sdb lvcreate -l 100%FREE -n osd-data ceph-vol # 若使用独立 WAL/DB 盘(提升小 IO 性能) pvcreate /dev/sdc vgcreate ceph-wal /dev/sdc lvcreate -L 20G -n osd-wal ceph-wal lvcreate -L 50G -n osd-db ceph-wal提示:
lvcreate -l 100%FREE确保数据 LV 占满整块盘,避免后续ceph-osd初始化时报device is too small;WAL/DB 分区大小需按集群规模估算(单 OSD WAL 推荐 20G,DB 推荐 50G)。
4.2 生成 OSD 密钥并注册到 monitor
# 在 node1(monitor 节点)执行 # 创建新 OSD ID(返回数字,如 0) OSD_ID=$(ceph osd create) # 生成该 OSD 的密钥 ceph auth get-or-create osd.$OSD_ID osd 'allow *' mon 'allow profile osd' -o /var/lib/ceph/osd/ceph-$OSD_ID/keyring # 将密钥复制到 node2 的对应目录 scp /var/lib/ceph/osd/ceph-$OSD_ID/keyring node2:/var/lib/ceph/osd/ceph-$OSD_ID/注意:
ceph osd create返回的是 OSD 的整数 ID(如0),不是字符串名;-o参数指定密钥输出路径,必须与后续ceph-osd的--keyring路径一致;mon 'allow profile osd'是 OSD 进程向 monitor 请求 map 更新的必要权限。
4.3 初始化 OSD 数据目录并启动服务
# 在 node2 上执行 mkdir -p /var/lib/ceph/osd/ceph-0 # 初始化 OSD(LVM 模式) ceph-osd --id 0 --mkfs --mkkey --osd-uuid $(uuidgen) --keyring /var/lib/ceph/osd/ceph-0/keyring --osd-data /var/lib/ceph/osd/ceph-0 # 格式化逻辑卷为 XFS(Ceph 推荐) mkfs.xfs -f -i size=2048 /dev/ceph-vol/osd-data # 挂载并设置属主 mount /dev/ceph-vol/osd-data /var/lib/ceph/osd/ceph-0 chown -R ceph:ceph /var/lib/ceph/osd/ceph-0 # 启动 OSD ceph-osd --id 0 --setuser ceph --setgroup ceph --osd-data /var/lib/ceph/osd/ceph-0 --keyring /var/lib/ceph/osd/ceph-0/keyring逻辑说明:
--mkfs创建 OSD 元数据目录结构(current/,whoami,superblock);--mkkey生成 OSD 自身密钥(区别于 auth 密钥);--osd-uuid必须用uuidgen生成唯一值,否则多 OSD 共享 UUID 会导致数据混乱;挂载后chown是必须步骤,否则 ceph-osd 以 ceph 用户启动时无法写入。
4.4 验证 OSD 是否成功加入集群
# 在 node1 上执行 ceph osd tree # 应看到类似: # ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF # -1 0.09396 root default # -3 0.09396 host node2 # 0 hdd 0.09396 osd.0 up 1.00000 1.00000 ceph osd stat # 输出:osd: 1 up (since 2m), 1 in (since 2m)常见失败排查:
ceph osd tree无输出 → 检查ceph-osd进程是否存活(ps aux | grep ceph-osd),日志在/var/log/ceph/ceph-osd.0.log- OSD 状态为
down→ 检查ceph auth get osd.0是否返回密钥,确认 keyring 路径与--keyring参数一致REWEIGHT为 0 → 执行ceph osd reweight 0 1.0手动恢复权重
5. 用ceph orch命令补全集群拓扑并验证跨节点通信能力
当单节点 MON/MGR/OSD 验证通过后,真实生产环境必然需要多节点部署。原生命令不提供ceph orch的编排能力,但ceph orch子命令(属于ceph-common包)可用于手动注册额外 monitor、mgr、osd 节点,并强制刷新 crush map,这是离线环境下替代 cephadm 的关键补位操作。尤其适用于 PVE 环境中多个 KVM 虚拟机共用同一物理网卡的场景。
5.1 在第二 monitor 节点(node2)上部署 monitor
# 在 node2 上创建目录并同步密钥 mkdir -p /var/lib/ceph/mon/ceph-node2 scp node1:/var/lib/ceph/mon/ceph-node1/keyring /var/lib/ceph/mon/ceph-node2/keyring scp node1:/tmp/monmap /tmp/monmap-node2 # 修改 monmap,添加 node2 monmaptool /tmp/monmap-node2 --add node2 192.168.10.12:3300 monmaptool /tmp/monmap-node2 --print # 确认包含 node1 和 node2 # 初始化并启动 node2 monitor ceph-mon --id node2 --setuser ceph --setgroup ceph --mkfs --mon-data /var/lib/ceph/mon/ceph-node2 --monmap /tmp/monmap-node2 ceph-mon --id node2 --setuser ceph --setgroup ceph --mon-data /var/lib/ceph/mon/ceph-node2 --public-addr 192.168.10.12:3300提示:
monmaptool --add必须在 node2 上执行,因为--public-addr使用 node2 自身 IP,不可复用 node1 的地址。
5.2 使用ceph orch注册新节点并触发 map 同步
# 在 node1 上执行(需安装 ceph-common) # 注册 node2 为 monitor ceph orch host add node2 192.168.10.12 # 强制推送 monmap 到所有 monitor ceph mon dump | grep "epoch\|node1\|node2" # 查看当前 epoch ceph mon failover node2 # 触发 monmap 重推(模拟故障转移测试) # 验证双 monitor 状态 ceph quorum_status | jq '.quorum_names' # 应输出:["node1", "node2"]注意:
ceph orch host add并非启动服务,而是将节点元数据写入 monitor 的 CRUSH map;ceph mon failover是安全的强制同步操作,不会中断服务,仅更新 monmap 版本号。
5.3 验证跨节点 OSD 通信与数据写入
# 创建测试 pool ceph osd pool create testpool 32 32 replicated # 设置 pool 的最小副本数 ceph osd pool set testpool size 2 ceph osd pool set testpool min_size 2 # 写入测试对象 echo "hello ceph manual deploy" | rados -p testpool put testobj - # 从另一节点读取(在 node2 上执行) rados -p testpool get testobj - | cat # 应输出:hello ceph manual deploy # 查看对象位置 ceph osd map testpool testobj # 输出类似:osdmap e123 pool 'testpool' (10) object 'testobj' -> pg 10.77e71a07 (10.7) -> up ([0,1], p0) acting ([0,1], p0)逻辑说明:
rados put/get是最底层的对象读写验证,绕过 RBD/CephFS 抽象层,直接测试 OSD 网络连通性;ceph osd map输出中的up ([0,1], p0)表示对象副本分布在 OSD 0 和 OSD 1 上,证明跨节点数据分布生效;若acting显示单 OSD,说明 crush rule 未生效,需检查ceph osd crush rule dump。
6. 用ceph config命令持久化关键参数并规避 Windows/WSL 环境常见陷阱
原生命令部署完成后,所有配置仍停留在内存或临时文件中。ceph config是 Ceph v14+ 引入的集中式配置管理机制,可将mon_host,osd_journal_size,ms_bind_msgr1等参数写入 monitor 的 KV 存储,实现重启不丢失、跨节点自动同步。这对 Windows Subsystem for Linux(WSL)或 PVE 中 Ubuntu 模板克隆场景尤为重要——避免因/etc/ceph/ceph.conf被覆盖导致集群分裂。
6.1 将关键配置写入 monitor 的配置数据库
# 设置全局 monitor 地址(替代 ceph.conf 中的 mon_host) ceph config set global mon_host "192.168.10.11:3300,192.168.10.12:3300" # 设置 OSD journal 大小(若使用 filestore,已弃用,但兼容旧环境) ceph config set osd osd_journal_size 5120 # 启用 msgr2 协议(提升网络性能,v15+ 默认) ceph config set global ms_type "async" # 设置 client rbd 缓存大小(影响虚拟机 I/O) ceph config set client rbd_cache_size 33554432提示:
ceph config set的section(如global,osd,client)决定配置生效范围;ms_type "async"是 msgr2 协议标识,比默认的simple协议吞吐高 30% 以上;rbd_cache_size单位为字节,33554432 = 32MB。
6.2 导出配置到本地文件供备份与审计
# 导出全部配置(含注释) ceph config dump > /root/ceph-config-dump-$(date +%F).txt # 导出特定 section ceph config get global | grep -E "(mon_host|ms_type)" # 输出:mon_host = 192.168.10.11:3300,192.168.10.12:3300 # ms_type = async # 生成最小化 ceph.conf(供 rbd/nfs-ganesha 等客户端使用) ceph config generate-minimal-conf > /etc/ceph/ceph.conf注意:
ceph config generate-minimal-conf会自动合并global和client配置,生成精简版ceph.conf,比手动编写更可靠;该文件可直接分发给 Windows WSL 中的rbd客户端,解决msstore 执行此命令时发生意外错类问题(本质是 WSL 的 DNS 解析与 Windows 主机冲突,而 minimal-conf 强制指定mon_hostIP,绕过 DNS)。
6.3 针对 PVE 离线环境的加固技巧
在 Proxmox VE(PVE)中部署 Ceph 常遇apt update 失败或ceph-deploy 不可用。此时应:
- 预下载所有 deb 包:在联网机器执行
apt download ceph-base ceph-mon ceph-mgr ceph-osd,拷贝到 PVE 节点后dpkg -i *.deb; - 禁用 systemd-resolved:
systemctl disable systemd-resolved && systemctl stop systemd-resolved,避免与 PVE 的 dnsmasq 冲突; - 固定内核模块版本:
echo "blacklist rbd" >> /etc/modprobe.d/blacklist.conf,防止 PVE 自动升级内核后 rbd 模块加载失败; - OSD 日志重定向:在
/var/lib/ceph/osd/ceph-0/下创建ceph-osd.0.conf,添加:[osd] log_file = /var/log/ceph/ceph-osd.0.log debug_osd = 1/5 # 生产环境调为 0/1
最后一行技术动作:执行
ceph health detail,确认输出中无HEALTH_WARN或HEALTH_ERR,且所有 OSD 的IN和UP状态均为1,即完成原生命令部署的终态验证。
本文还有配套的精品资源,点击获取