Linux Ceph 存储集群搭建与管理

1次阅读

根本原因是网络或容器运行时问题;常见于docker 24.0+与cephadm socket路径不匹配、ntp时间不同步、mds未启动、hostname解析异常及udev设备状态丢失。

Linux Ceph 存储集群搭建与管理

cephadm 部署失败卡在 cephadm bootstrap 无响应

根本原因通常是网络或容器运行时问题,不是配置写错。Cephadm 默认用 podman,但很多生产环境只装了 Docker,它会静默 fallback 到 Docker,而某些 Docker 版本(如 24.0+)与 cephadm 的 socket 路径假设不一致,导致初始化挂起。

  • 先确认容器引擎:运行 podman versiondocker version,若两者都存在,显式指定——加 --container-engine podman--container-engine docker
  • 检查 /run/podman/podman.sock/var/run/docker.sock 是否可读,普通用户需加入 podmandocker 用户组
  • 禁用防火墙临时验证:sudo systemctl stop firewalldcentos/RHEL)或 sudo ufw disableubuntu),cephadm 依赖大量临时端口通信
  • 别用 root 以外的用户跑 cephadm bootstrap,即使加了 sudo,环境变量(如 $HOME)残留也可能让 cephadm 找不到密钥目录

mon 节点选举失败,ceph -s 显示 HEALTH_WARN 且 mon_map 不完整

mon 是 Ceph 的大脑,但它的 quorum 机制对时间同步极其敏感。哪怕 0.5 秒偏差,mon 就拒绝加入集群,表现为反复重启、日志里刷 failed to join quorum

  • 强制所有节点走同一 NTP 源:sudo chronyd -q 'pool pool.ntp.org iburst',再 sudo systemctl restart chronyd
  • 检查 mon 节点 hostname 解析:每个 mon 主机名必须能被其他所有节点 ping 通,且 hostname -f 输出的 FQDN 必须和 cephadm bootstrap 时传入的 --mon-ip 所属网卡地址匹配
  • 别手动改 /etc/ceph/ceph.conf——cephadm 管理的集群禁止直接编辑该文件,所有配置必须用 ceph config set,否则下次 cephadm upgrade 会覆盖

osd 添加后始终处于 down + outceph-volume lvm create 日志报 No data for device

这不是磁盘坏了,而是 ceph-volume 没识别到裸设备上下文。常见于用 LVM 卷、NVMe 多路径或云盘挂载后又 umount 的场景——设备节点还在,但 udev 数据已丢失。

  • 运行 sudo udevadm trigger 刷新内核设备树,再 sudo udevadm settle 等待完成
  • 确认磁盘没被其他服务占用:lsblk -f 看是否挂载或有文件系统;sudo lsof /dev/sdX 查进程占用
  • 避免用 /dev/mapper/xxx 这类名字——ceph-volume 对 device-mapper 支持不稳定,优先用 /dev/disk/by-path/ 下的稳定路径
  • 如果用了加密盘(如 LUKS),ceph-volume 不支持,必须提前解密并映射为裸块设备

客户端 mount cephfs 报错 Connection timed outPermission denied

cephfs mount 失败极少是秘钥问题,绝大多数是 MDS(Metadata Server)没起来,或者 kernel client 和 ceph 版本不兼容。

  • 先查 MDS 状态:ceph mds stat,输出应为 :1 {0=cephfs-a=up:active},若显示 0stopping,说明 MDS 进程崩溃,看 journalctl -u ceph-mds@*.service
  • kernel client 在较新内核(5.15+)默认禁用旧协议,加挂载参数 ,-o ms_mode=secure 强制走 v2 协议;若服务端是 Octopus 以前版本,则需 -o ms_mode=legacy
  • 不要用 ceph-fuse 替代 kernel mount 做长期服务——它单线程、无缓存、CPU 占用高,仅适合调试
  • 挂载命令里 name= 后面的用户名必须已在 Ceph 中创建,且有 mds allow rwx 权限,用 ceph auth get-or-create client.xxx mon 'allow r' mds 'allow rwx' osd 'allow rw pool=xxx' 创建

最常被忽略的是 mon 节点间的时间差和 MDS 的启动状态,这两个点不排查清楚,其他操作都是白忙。

text=ZqhQzanResources