news 2026/10/26 21:59:35

Ceph 14.2.11 Nautilus 集群部署实战:从裸机到可用存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ceph 14.2.11 Nautilus 集群部署实战:从裸机到可用存储

1. 为什么 14.2.11 这个版本至今仍有人在装

先把结论摆在前面:Ceph 14.2.11 Nautilus 是一个已经进入生命周期末期的版本,但它在很多内网环境、教学实验环境、老旧硬件集群里依然活跃。原因不复杂——Nautilus 是 Ceph 历史上第一个把 Dashboard 做得"能看"、把cephadm之外的传统部署方式打磨得足够稳的版本,而 14.2.11 又是 Nautilus 系列里补丁相对齐全的一个点版本。很多人手头有一批跑着 CentOS 7 或者 Ubuntu 18.04 的机器,内核版本不高,硬件也不新,直接上 Pacific 或 Quincy 反而会遇到一堆依赖和内核特性问题,于是回头装 14.2.11 成了最省事的选择。

这篇内容面向的是需要在一批已有机器上从零搭起一个可用 Ceph 集群的人。不管你是想搭个三节点的小集群做分布式存储实验,还是要在内网里给一批虚拟机提供块存储,下面的流程都能直接照着走。我会用传统的手动部署方式来讲,也就是基于ceph-deploy的那套流程,而不是cephadm。原因很直接:14.2.11 时代cephadm还不够成熟,而ceph-deploy在 Nautilus 上的文档和社区案例最多,出问题最容易搜到答案。

需要提前说清楚一件事:Nautilus 已经停止维护,官方不再推送安全补丁。如果你的集群要暴露在不可信网络里,或者承载核心生产业务,请认真评估升级到受支持版本的必要性。本文的场景定位是内网、实验、教学、以及那些短期内不打算动的存量环境。

关键词方面,围绕这个标题最常被搜到的无非是:ceph 安装、nautilus 部署、ceph-deploy、mon/mgr/osd 配置、PG 数量计算、集群健康检查。这些我都会在对应章节里展开,不会只给命令不给解释。

2. 装之前必须想清楚的几件事:版本、拓扑与硬件底线

2.1 为什么锁定 14.2.11 而不是随便一个 Nautilus 小版本

Nautilus 系列从 14.2.0 一路走到 14.2.22 左右,中间修掉了大量 OSD 崩溃、PG 卡在 inactive、Dashboard 登录异常之类的问题。14.2.11 处在一个比较微妙的位置:它比早期版本稳定得多,又不像最后几个版本那样在某些老发行版上出现依赖包找不到的情况。我实测过在 CentOS 7.9 上装 14.2.11,yum源里对应的el7包齐全,ceph-deploy也能正常拉起来。如果你手上的系统更新一些,比如 Ubuntu 20.04,那 14.2.11 的focal包同样存在。

选版本这件事有个通用原则:在一个已经 EOL 的系列里,尽量选靠后的点版本,但要确认你的操作系统能拿到对应的软件包。不要盲目追最新的 14.2.x,因为越往后,老系统的包可能越难找。

2.2 集群拓扑:三个 MON 是底线,不是建议

很多人搭实验集群时图省事,只放一个 MON。单 MON 在实验环境里能跑,但它意味着没有仲裁能力,一旦这个节点挂了,整个集群直接不可用,而且恢复起来很麻烦。Ceph 的 MON 使用 Paxos 做一致性,奇数个 MON 才能形成有效多数派,所以最小可用拓扑是三个 MON。

一个典型的三节点起步拓扑是这样的:

节点角色主机名示例运行组件
节点一node1MON + MGR + OSD
节点二node2MON + MGR + OSD
节点三node3MON + OSD

MGR 建议至少起两个,因为 Dashboard 和很多监控模块跑在 MGR 上,单 MGR 挂了虽然不影响数据读写,但管理面会瞎掉。OSD 的数量取决于你的磁盘,每个数据盘对应一个 OSD。

2.3 硬件与系统的最低要求

CPU 和内存这块,MON 和 MGR 对资源要求不高,2 核 4G 就能跑。真正吃资源的是 OSD,尤其是做恢复(recovery)的时候。经验值是每 TB 原始容量配 1GB 内存,这是底线,不是舒适值。如果你有 4 块 4TB 盘,那这台机器至少 16GB 内存起步,32GB 会更从容。

磁盘方面,强烈建议数据盘用独立磁盘,不要和系统盘混在一起。系统盘做 RAID1 保证可用性,数据盘用 JBOD(直连,不做 RAID),让 Ceph 自己管副本。这一点和传统存储思路相反,很多人第一反应是给数据盘做 RAID,结果反而破坏了 Ceph 的副本机制,得不偿失。

网络是另一个容易被忽视的点。Ceph 区分公共网络(public network)和集群网络(cluster network)。公共网络承载客户端流量和 MON 通信,集群网络专门跑 OSD 之间的数据复制和恢复。如果条件允许,给集群网络单独走一块万兆网卡,能显著降低恢复时对客户端的影响。实验环境里两块网卡合一也能跑,但要知道这是妥协。

系统时间必须同步。Ceph 对时间漂移很敏感,MON 之间时间差太大会导致仲裁异常。装之前确认chronyd或ntpd在跑,并且所有节点指向同一个时间源。

3. 从裸机到集群:分阶段的实操链路

3.1 前置准备:主机名、hosts 与免密登录

这一步看着琐碎,但后面所有命令都依赖它,做错了会浪费大量排查时间。

先给每台机器设置固定的、可解析的主机名。不要用localhost,也不要用 DHCP 分配的随机名。假设三台机器分别叫node1、node2、node3,在每台的/etc/hosts里都写上完整的映射:

# 三台机器都要有这份内容 192.168.1.11 node1 192.168.1.12 node2 192.168.1.13 node3

然后配置 SSH 免密。ceph-deploy是从一台管理节点(通常就是 node1)通过 SSH 去操作其他节点的,所以需要 node1 能免密登录到所有节点,包括它自己。

# 在 node1 上生成密钥(如果还没有) ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa # 分发到所有节点 for host in node1 node2 node3; do ssh-copy-id root@$host done

注意:ceph-deploy默认用 root 操作,或者用有 sudo 权限的用户。用普通用户的话,要确保该用户能免密 sudo,否则中途会卡在权限上。实验环境直接用 root 最省事。

关闭防火墙和 SELinux 是实验环境的常规操作,但生产环境要按需放行端口而不是一关了之。Ceph 需要的端口不少,MON 默认 6789 和 3300,OSD 用 6800-7300 一段,MGR 用 6800-7300 里的若干。实验环境图快,可以先关掉:

systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

3.2 配置软件源并安装 ceph-deploy

ceph-deploy本身是个 Python 工具,装在管理节点上就行,不需要装到所有节点。但所有节点都需要配置好 Ceph 的软件源,因为ceph-deploy会远程在各节点上装包。

以 CentOS 7 为例,先加 EPEL 源,再加 Ceph 的 Nautilus 源:

yum install -y epel-release cat > /etc/yum.repos.d/ceph.repo <<'EOF' [ceph] name=Ceph packages for $basearch baseurl=https://download.ceph.com/rpm-nautilus/el7/$basearch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc [ceph-noarch] name=Ceph noarch packages baseurl=https://download.ceph.com/rpm-nautilus/el7/noarch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc EOF

这里有个细节:rpm-nautilus这个目录下会持续更新到该系列的最新点版本。如果你要精确锁定 14.2.11,需要在安装时指定版本号,比如yum install ceph-14.2.11。不指定的话,装到的可能是 14.2.x 里更新的版本。在 EOL 系列里,我倾向于不锁死小版本,让包管理器拿到该系列最后一个可用版本,因为那些版本通常修了更多 bug。但如果你有严格的版本一致性要求,那就锁。

在管理节点上装ceph-deploy:

yum install -y ceph-deploy ceph-deploy --version

3.3 创建集群并部署 MON

找一个干净的工作目录,ceph-deploy会在里面生成一堆配置文件,别在/root下乱跑,建个专门的目录:

mkdir -p /opt/ceph-cluster && cd /opt/ceph-cluster

第一步是new,它会生成初始的ceph.conf和密钥环:

ceph-deploy new node1 node2 node3

这一步之后,目录里会出现ceph.conf、ceph.mon.keyring、ceph-deploy-ceph.log。打开ceph.conf,根据你的网络情况补充几行关键配置:

[global] fsid = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx mon_initial_members = node1, node2, node3 mon_host = 192.168.1.11,192.168.1.12,192.168.1.13 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx public_network = 192.168.1.0/24 cluster_network = 192.168.2.0/24 osd_pool_default_size = 3 osd_pool_default_min_size = 2

public_network和cluster_network一定要写对网段。如果只有一块网卡,cluster_network可以不写,或者和public_network写成一样。osd_pool_default_size = 3表示默认三副本,实验环境如果磁盘紧张可以改成 2,但要知道这降低了容错能力。

然后安装 Ceph 软件包到所有节点:

ceph-deploy install --release nautilus node1 node2 node3

这一步会通过 SSH 在各节点上跑yum install,耗时取决于网络。如果卡住,多半是源的问题或者 SSH 不通,先手动在某个节点上yum install ceph试试能不能通。

接着部署 MON:

ceph-deploy mon create-initial

成功的话,当前目录会多出一堆ceph.client.admin.keyring、ceph.bootstrap-*.keyring之类的文件。这些密钥环后面要用,别删。

3.4 部署 MGR 与 OSD

MGR 部署很简单:

ceph-deploy mgr create node1 node2

起两个 MGR,一个 active 一个 standby。Dashboard 默认在 active MGR 上,端口 8443(Nautilus 里是 https)。

OSD 是重头戏。先确认每台机器上哪些盘是空的、没被使用的:

lsblk

假设 node1 上有/dev/sdb、/dev/sdc两块数据盘,node2、node3 类似。用zap清掉磁盘残留的分区表和文件系统签名:

ceph-deploy disk zap node1 /dev/sdb ceph-deploy disk zap node1 /dev/sdc # 其他节点同理

然后创建 OSD:

ceph-deploy osd create --data /dev/sdb node1 ceph-deploy osd create --data /dev/sdc node1 # 其他节点同理

实操心得:osd create这一步如果报错说磁盘已被占用,八成是zap没清干净,或者磁盘上有 LVM 残留。用wipefs -a /dev/sdb再清一遍,必要时用dd把磁盘头部清零。另外,如果数据盘和系统盘在同一块物理盘上(不推荐),要格外小心别把系统盘给 zap 了。

OSD 创建完成后,把配置文件和密钥环推到所有节点,这样各节点上的 Ceph 命令才能正常工作:

ceph-deploy admin node1 node2 node3

3.5 验证集群状态

到这里集群应该起来了。在任意节点上执行:

ceph -s

正常的话会看到HEALTH_OK,以及 MON、MGR、OSD 的数量。如果看到HEALTH_WARN,别慌,先看具体警告内容。刚建好的集群最常见的警告是osd count相关的,比如 PG 还没完全 active+clean,等几分钟通常会自己恢复。

ceph osd tree # 看 OSD 分布 ceph mon stat # 看 MON 仲裁状态 ceph df # 看容量

4. 存储池与 PG 数量:最容易算错也最容易埋雷的地方

4.1 创建存储池的正确姿势

集群健康之后,第一件事是建存储池(pool)。存储池是存放数据的逻辑容器,块存储、对象存储、文件存储最终都落在池上。

ceph osd pool create mypool 128 128

后面两个数字是 PG(归置组)数量和 PGP 数量。这里先不展开,下一节专门讲。建完池之后,要把它和某个应用关联起来,否则新版本会警告:

ceph osd pool application enable mypool rbd

rbd表示这个池用于块存储。如果是对象存储用rgw,文件存储用cephfs。

4.2 PG 数量到底怎么算

PG 数量是 Ceph 里最经典的计算题,也是最容易配错的地方。配少了会导致单个 PG 过大、恢复慢、数据分布不均;配多了会消耗大量内存和 CPU,MON 处理 PG 映射的压力也会上升。

官方给的经验公式是:

PG 总数 = (OSD 总数 × 100) / 副本数

然后向上取到 2 的幂。举个例子,假设你有 6 个 OSD,三副本:

(6 × 100) / 3 = 200

向上取到 2 的幂是 256。这 256 是整个集群所有池的 PG 总数,不是单个池。如果你只建一个池,那这个池就是 256 个 PG。如果建多个池,要把 256 按比例分给各个池。

单个池的 PG 数同样建议取 2 的幂,这样 CRUSH 算法分布更均匀。常见的取值是 64、128、256、512。

OSD 数量三副本建议 PG 总数单池常见取值
312864 或 128
6256128 或 256
12512256 或 512
241024512 或 1024

注意:PG 数量建池之后可以调,但调整过程会触发数据重平衡,对生产集群有影响。所以建池时尽量一次算对,别抱着"先随便建,以后再调"的心态。实验环境无所谓,生产环境要慎重。

4.3 副本数与最小副本数的取舍

osd_pool_default_size控制副本数,默认 3。osd_pool_default_min_size控制写入所需的最小副本数,默认 2。这两个参数的关系是:当可用副本数低于min_size时,池会停止写入,进入只读或者不可用状态。

三副本配 min_size=2 是标准做法。含义是:允许一个 OSD 挂掉,集群继续正常读写;如果挂掉两个,写入停止,但已有数据还能读。如果你把 min_size 设成 1,那挂两个 OSD 还能写,但数据丢失风险陡增,不推荐。

实验环境磁盘紧张时,有人用两副本(size=2, min_size=1)。这能省一半空间,但容错能力只剩一个 OSD。两副本在单盘故障时没有余量,恢复期间再挂一块就丢数据,心里要有数。

5. 那些文档不写、但一定会遇到的坑

5.1 MON 起不来:先查时间,再查端口,最后查磁盘

MON 部署失败是最常见的开局问题。排查顺序我总结成三步:

第一,查时间同步。chronyc sources看时间源是否正常,节点之间date差多少。差超过几秒就可能出问题。

第二,查端口占用。ss -lntp | grep 6789看 6789 和 3300 是否被别的进程占了。有时候之前装过 Ceph 没清干净,残留进程还在。

第三,查磁盘空间。MON 的/var/lib/ceph/mon/目录所在分区如果满了,MON 直接起不来。这个坑很隐蔽,因为 MON 数据量不大,但如果你把/var单独分区且给得很小,就容易中招。

5.2 OSD 创建后一直 down:多半是权限或磁盘问题

OSD 创建成功但状态是down,先看日志:

journalctl -u ceph-osd@0 -n 100

常见原因有几个。一是/var/lib/ceph/osd/目录权限不对,ceph用户读不了。二是磁盘本身有坏道或者之前的分区表没清干净。三是ceph.conf里的cluster_network写错了,OSD 找不到集群网络。

我遇到过一次特别隐蔽的:磁盘是之前做过 RAID 的,虽然zap过了,但 RAID 元数据还在磁盘末尾,导致 OSD 启动时读到脏数据。解决办法是用wipefs -a清所有签名,再用dd把磁盘头尾各清 100MB。

5.3 HEALTH_WARN 的各种花样与处理

HEALTH_WARN是常态,不是所有警告都要立刻处理。列几个高频的:

警告信息含义处理方式
application not enabled池没关联应用ceph osd pool application enable
osds have slow opsOSD 操作慢查磁盘 IO、网络、内存
clock skew时间漂移修时间同步
pg degradedPG 降级等恢复,或查 down 的 OSD
mon clock driftMON 时间漂移同上

pg degraded在刚建集群或者刚加 OSD 时很常见,通常是数据在重平衡,等一会儿就好。如果长时间不恢复,就要查是不是有 OSD 真的挂了。

5.4 Dashboard 打不开的排查路径

Nautilus 的 Dashboard 默认在 active MGR 上,https 8443 端口。打不开的话:

ceph mgr module ls # 看 dashboard 模块是否 enabled ceph mgr services # 看 dashboard 的实际地址

如果模块没启用:

ceph mgr module enable dashboard

如果启用了但访问不了,检查 MGR 所在节点的防火墙和端口监听。Dashboard 默认用自签证书,浏览器会报警告,这是正常的,继续访问即可。要改端口或者换证书,可以在ceph.conf里配mgr/dashboard/server_port等参数。

6. 集群跑起来之后:日常维护与扩容思路

6.1 加 OSD 和加节点的区别

扩容分两种。一种是给现有节点加盘,直接ceph-deploy osd create --data /dev/sdX node1就行,新 OSD 会自动加入 CRUSH 并开始接收数据。另一种是加全新节点,需要先在新节点上装 Ceph 包、推配置和密钥环,再创建 OSD。

加节点时有个顺序问题:先把新节点纳入 MON 或者至少让它能通信,再加 OSD。如果新节点的网络配置和现有集群不一致,OSD 加进去也会是 down 的。

扩容后 PG 数量可能需要调整。如果 OSD 数量翻倍,PG 总数也该相应增加,否则单个 PG 会变大。调整命令:

ceph osd pool set mypool pg_num 512 ceph osd pool set mypool pgp_num 512

pg_num和pgp_num要一起调,且pgp_num不能大于pg_num。调整会触发数据迁移,建议在业务低峰期做。

6.2 监控该看哪些指标

集群跑起来不是终点,得盯着。最基础的几个命令:

ceph -s # 总览 ceph osd perf # OSD 延迟 ceph osd df # OSD 容量使用率 ceph pg stat # PG 状态统计

ceph osd df里如果某个 OSD 的使用率明显高于其他,说明数据分布不均,可能是 CRUSH 规则或者 PG 数量的问题。ceph osd perf里如果某个 OSD 的 apply/commit 延迟特别高,那块盘可能有问题。

6.3 备份与恢复的基本认知

Ceph 本身靠副本保证数据安全,但"副本"不等于"备份"。误删池、误删 RBD 镜像这类操作,副本是救不了的。重要的池要单独做快照或者导出。

RBD 镜像可以做快照:

rbd snap create mypool/myimage@snap1 rbd snap ls mypool/myimage

快照是增量的,占用空间不大,但也不能当长期备份用。真正的备份要把数据导出到集群之外的地方。

7. 关于这套流程,我踩过之后想说的几句

装 Ceph 这件事,命令本身不难,难的是环境准备和排错。我见过太多人卡在 SSH 免密、时间同步、磁盘没清干净这几个点上,然后以为是 Ceph 本身有问题。实际上把前置条件做扎实,后面的流程会顺得让你意外。

还有一个心态问题:Nautilus 是 EOL 版本,遇到问题去搜,很多答案都是几年前的,命令和现在的略有出入。这时候别死磕某个博客,直接看官方文档对应版本的章节,或者去社区翻 issue,通常更靠谱。

最后提醒一句,实验环境里怎么折腾都行,但如果你打算把这套东西用到有真实数据的地方,请务必先想清楚:这个版本没有安全更新,你的数据丢了没人能帮你兜底。该升级的时候,别拖。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 18:58:33

Java异步编程:CompletableFuture核心机制与实战解析

1. CompletableFuture 核心机制解析CompletableFuture 是 Java 8 引入的异步编程利器&#xff0c;其核心在于将回调机制与函数式编程结合。底层采用 ForkJoinPool 作为默认执行器&#xff0c;通过 CAS 操作实现无锁化的任务状态流转。每个 CompletableFuture 实例内部维护着一个…

作者头像 李华
网站建设 2026/10/17 21:02:52

Flink on YARN内存调优核心:containerized.heap-cutoff-min详解

1. 项目概述&#xff1a;为什么Flink on YARN的heap-cutoff-min参数值得深挖在某公司实时数仓二期升级中&#xff0c;我们把Flink作业从Standalone模式迁移到YARN集群&#xff0c;本以为能借力YARN的资源弹性调度能力提升稳定性&#xff0c;结果上线首周就连续触发OOMKilled——…

作者头像 李华
网站建设 2026/10/17 18:07:17

企业网盘选型指南:技术原理与成本效益分析

1. 企业网盘选型的核心误区与真实成本分析作为一位服务过数十家企业数字化转型的IT顾问&#xff0c;我见过太多团队在选购网盘时犯下的经典错误。2026年的企业网盘市场早已不是简单的"存储空间"买卖&#xff0c;而是一场关于工作效率与数据安全的战略选择。最常见的误…

作者头像 李华
网站建设 2026/10/20 23:20:51

Re-ID技术是什么?如何帮助客流系统识别重复访客?

一、客流去重为什么不能只依赖目标跟踪&#xff1f;在入口客流统计中&#xff0c;目标跟踪通常用于维持同一摄像头连续视频帧中的目标身份。例如&#xff0c;系统检测到一个行人后&#xff0c;通过连续帧关联&#xff0c;为其分配临时 Track ID。问题在于&#xff0c;Track ID通…

作者头像 李华