先把话放前面:这篇不是那种贴几个命令就完事的“教程”,而是我连续折腾几个晚上、把集群从零装到能跑、再把数据写进去读出来的完整记录。Ceph分布式存储的坑不少,网上资料也杂,很多文章停在理论层面,命令一跑就报错。这篇把我的实测过程、参数选择、踩坑点全部写出来,照着走基本能把环境搭起来,至少不会在第一步就卡住。
适合看这篇的人:想搭一套自己的分布式存储、在测试环境里验证Ceph功能、或者准备在生产环境选型但想先摸清部署细节的同学。文章会尽量把每一步的“为什么”也讲清楚,不只是让你复制命令。
1. Ceph是什么,为什么我选它做存储底座
1.1 先搞懂Ceph里的几个角色
Ceph常被称作“统一存储”,因为它一套集群能同时提供三种存储接口:块存储(RBD)、文件存储(CephFS)、对象存储(RGW)。底层数据存储和分布由RADOS负责,往上再封装不同协议给外部使用。这个概念聊起来很抽象,我换成自己的理解:Ceph的核心思路是把一堆普通机器的磁盘聚合成一个巨大的存储池,然后在这个池子上切块、做副本、分发给客户端。不管用哪种接口读写,数据最终都以对象形式落到底层OSD里,副本数、故障域这些策略由集群统一决定。
部署时打交道最多的是这几个角色:
- MON(Monitor):集群的“大脑”,保存集群状态的地图,负责选主和监控各节点心跳,一般建议至少3个。
- OSD(Object Storage Daemon):真正存数据的进程,一个磁盘通常对应一个OSD,同时负责向MON上报状态、参与数据复制和恢复。
- MGR(Manager):提供监控面板、均衡、编排等扩展功能,现代版本没有MGR很多命令都跑不顺。
- MDS(MetaData Server):只在用CephFS文件存储时需要,保存文件目录的元数据。
- RGW(RADOS Gateway):对象存储网关,对外提供S3兼容接口。
初次上手容易迷糊的地方在于:OSD不是一块磁盘,而是一个进程加一个磁盘的组合;MON也不只是存配置,它还要负责任何时刻的“谁是最新状态”判断。理解了角色才能看懂后续一堆daemon健康检查的输出。
1.2 相比其他方案,Ceph的优势和代价
我之前也对比过其他方案。如果只想做块存储,很多方案都更轻、更简单,比如各类商业存储甚至单机ZFS导出iSCSI。Ceph的强项在“规模化和自愈”:扩容时不用停机,节点宕了自动在别处补副本,数据打散均衡分布,不用人为干预。这些特性对云平台、虚拟化后端这类场景特别重要。我一个测试环境里挂了几台机器,磁盘大小不一、有的是SSD有的是HDD,Ceph也能通过CRUSH规则把数据尽量均衡铺开,这是传统RAID做不到的。
代价同样明显:组件多、部署复杂、运维曲线陡峭。首次启动要同时协调MON和OSD,网络要求高,时钟必须同步,稍有疏忽就会出现“状态异常”但你查了半天找不到原因的情况。成本上也并非省钱的方案——副本机制决定了最低三副本才安全,裸容量打三折之后才是可用容量,小规模使用时性价比不高。我的建议是:存大量数据、想练手分布式架构、或要接云平台,值得折腾;只是给一台机器加存储,完全不必上Ceph。
2. 安装前规划:这些事不做好,后面全是坑
2.1 硬件配置与节点角色划分
先说硬件下限。我实际用的是一组不高档的x86服务器,每台双核CPU、8GB内存、一个系统盘加两块数据盘,跑起来没问题。但如果你要同时开多个MON和MGR,内存建议16GB起,尤其是开启Dashboard和Prometheus监控插件后,内存占用会比想象中高。官方给的MON内存建议是8GB左右,OSD每TB数据大概1GB内存,只做测试可以适当压缩。
节点划分有两种比较常见:一种是所有节点既跑MON又跑OSD,适合小规模;另一种是独立MON节点加独立OSD节点,适合大集群。测试环境建议用前者,省机器也省事。需要注意,每个节点上可以启动多个OSD进程,但一块物理盘只绑定一个OSD,数据盘不要做RAID,最好也别用整盘分区——cephadm会直接使用整块设备。
我从一台试点节点扩展到了三台。这里给一个规划参考:
| 节点 | 用途 | 系统盘 | 数据盘 | 网络 |
|---|---|---|---|---|
| node-1 | MON + MGR + OSD | 64GB SSD | 1TB HDD x2 | 千兆 |
| node-2 | MON + OSD | 64GB SSD | 1TB HDD x2 | 千兆 |
| node-3 | MON + OSD | 64GB SSD | 1TB HDD x1 | 千兆 |
生产环境要求会更高,但测试这套完全够了。三台的MON可以形成法定人数,少一个节点还能继续服务。
2.2 操作系统、网络与时钟准备
操作系统我选的是Debian系和RedHat系都常遇到的兼容性方案。这里说一个教训:旧版本的系统镜像源里带的Ceph包往往很老,手动配仓库很容易把依赖装乱,不建议从系统自带源直接装。正确的做法是用Ceph官方发布的软件源或者直接使用cephadm工具,它在部署时会自动拉取对应版本的容器镜像和包,不用手动装ceph-common之类的依赖。
网络方面有几点容易忽略。Ceph内部流量分两块:客户端访问和节点间数据复制。千兆网在测试环境勉强够用,生产建议至少万兆内网,否则扩容或自愈时网络会成为瓶颈。主机名一定要用静态解析,我一开始在某台机器上忘了设置hostname的永久配置,重启后集群里节点名变了,MON之间始终连不上。记得把每台机器的IP和主机名写进hosts文件,保证互相能ping通且能通过主机名解析。
时钟同步是另一大坑。Ceph的MON对时间漂移极其敏感,时间差超过阈值会导致监视器之间无法达成一致,现象是集群一直提示“clock skew”或者选举异常。我在所有节点上配置了chrony,统一指向同一台内网时间源,装完后专门验证过时间偏差在毫秒级才继续。之后在部署Ceph时,节点的本地时间服务要确保正常运行,查看命令用chronyc tracking即可。
内核参数方面,我调整了文件句柄限制和网络缓冲区参数,但测试环境其实不必追求极致,关键的几项做一个参考记录:
# /etc/sysctl.conf 追加 fs.aio-max-nr=1048576 fs.file-max=2097152 net.core.rmem_default=262144 net.core.wmem_default=262144 net.core.rmem_max=4194304 net.core.wmem_max=4194304执行sysctl -p生效。说实话在低负载测试下这几个参数很难感受到差异,但提前调好可以避免后续压测时候莫名其妙地报“cannot allocate memory”之类的错误。
3. 走一遍实测流程:cephadm部署全记录
3.1 部署方式选型:为什么用cephadm而不是手动部署
Ceph部署方式大致有几种:早期用ceph-deploy,已经淘汰;用ceph-ansible批量部署;手动配置MON、OSD;现在官方主推cephadm。我的选择很明确——cephadm。它用一个静态二进制文件和容器镜像完成整个部署过程,不用预先装一堆软件包,也不用手写复杂的ini配置,配合ceph orch命令能管理OSD和各类服务,对测试环境极其友好。
cephadm的原理简单说:把一个cephadm命令放到节点上,它会创建基于容器的管理单元,通过SSH把集群配置分发到其他节点,再让各节点拉取指定的镜像来运行MON、MGR、OSD等守护进程。这也意味着所有节点要能访问镜像仓库,或者提前把镜像导入到各节点。如果环境不能访问外部网络,就得先在每台节点准备好镜像文件并设置--image参数指定本地镜像,否则部署必挂。
我用的版本是当时社区推荐的稳定版Ceph。启动前检查一遍:所有节点关闭防火墙或放行Ceph端口,SELinux改成Permissive(用cedeadm时这个很重要,我曾在强制模式下遇到过容器创建失败),SSH免密登录必须提前配好——cephadm引导本机不需要,但添加主机节点时需要SSH密钥连通。具体配置免密的操作就是生成一对SSH密钥,把公钥追加到所有节点的authorized_keys里,确保从管理节点能直接ssh到每台机器。
3.2 bootstrap引导集群的关键动作
我先在第一个节点上下载cephadm脚本,然后执行引导命令。引导命令的含义是在当前节点上启动第一个MON和MGR,生成一个最小可用集群。这里要指定监控IP,通常是当前节点的内网IP:
curl --silent --remote-name --location https://raw.githubusercontent.com/ceph/ceph/main/src/cephadm/cephadm chmod +x cephadm ./cephadm bootstrap --mon-ip 192.168.10.11 --allow-fqdn-hostname--allow-fqdn-hostname这个参数是我实测时加上的,因为我的主机名带点号,不带这个参数引导会报主机名不受支持。引导过程会生成一个随机密码,并打印出来,这个密码用于访问Dashboard,必须保存好,丢了会非常麻烦。
引导完成后,用cephadm shell -- ceph -s查看状态。正常情况下可以看到一个MON、一个MGR处于运行状态,集群健康值可能是HEALTH_WARN,还能看到它提示有OSD未创建——这很正常,我们还没加数据盘。
如果你在这一步收到类似“Error EINVAL: mon address is empty”或无法启动MON容器,多半是监控IP写错了或者网络不通。这时不用急着重装,可以去掉bootstrap产生的集群数据后重新引导,或者先排查防火墙和hostname解析。
3.3 添加主机节点与创建OSD的完整步骤
引导完成只是第一步,我们还需要把另外两个节点加进集群,并在三个节点上创建OSD。
添加主机节点前,先确认管理节点到目标节点的SSH免密已经配置好。然后在一台已部署环境的节点上执行:
cephadm shell -- ceph orch host add node-2 --address 192.168.10.12 cephadm shell -- ceph orch host add node-3 --address 192.168.10.13ceph orch host add是cephadm接管的主机管理入口,它会自动为你添加到ssh配置。之后还可以用ceph orch host ls确认所有节点的状态。
添加主机的常见坑是权限与端口不通。cephadm默认通过SSH的22端口连接,如果你改了SSH端口需要在配置里指定。另外一个隐藏问题:cephadm给其他节点部署服务时,用的SSH用户需要有sudo权限,否则它无法在远程节点写入配置、启动容器,我遇到过提示“Failed to connect to SSH host”但实际网络是通的,查了半天发现是sudo权限没给够。
主机加好之后就可以创建OSD了。我采用的是整块设备自动发现方式。先确认每台节点上都能看到裸盘:
lsblk然后让Ceph自动把可用设备都做成OSD:
cephadm shell -- ceph orch device ls cephadm shell -- ceph orch apply osd --all-available-devices--all-available-devices会把所有未被使用的磁盘都创建为OSD,测试环境很省事,但生产环境要小心,避免误把系统盘也做了OSD。如果某块盘不想被纳入,可以先在节点上对磁盘打标签或加过滤规则,再执行apply。创建完成后再次ceph -s,就能看到OSD数量变成了5个(我三台机器总共五块数据盘),集群健康值通常会变成HEALTH_OK。
如果你觉得自动创建不可控,也可以手动逐个加OSD:先高级模式进入节点,用ceph orch daemon add osd <host>:<device>指定具体磁盘。实测下来整盘自动方式更稳,手动指定时还要处理磁盘路径变化的问题。
3.4 部署Dashboard并设置登录认证
cephadm在bootstrap阶段已经自动部署了Dashboard,默认端口是8443。不需要额外安装,只需要确认它正常运行,并设置登录密码:
cephadm shell -- ceph dashboard set-login-credentials admin your-strong-password因为默认证书是自签名的,浏览器第一次访问会有安全警告,测试环境直接信任继续即可。访问方式是在浏览器打开https://<任意节点IP>:8443。Dashboard能看到整个集群的容量、OSD状态、PG分布情况,还能查看性能指标,图形化界面比命令行直观很多。
我实测时发现,Dashboard如果打不开,先检查8443端口是否监听,再检查8443端口是否在防火墙规则里;之前我因为内网安全组拦截导致外网访问不了,看起来像是服务没起来,其实就是端口没放行。
生产环境建议配置Let's Encrypt或自建证书,这不是必需的,但能省去后续客户端访问时的麻烦。测试环境跳过这个步骤完全可行。
4. 安装后的健康检查与数据读写验证
4.1 看懂ceph -s输出的状态字段
安装不等于成功,集群真正健康才算数。最常用的命令是ceph -s,它输出的信息看着简单,但包含了大量状态信息。截图不方便,我直接讲解关键字段:
cluster:集群唯一标识符,多个集群实例要区别开。mon:显示MON的daemon数量,正常应该是3个(部署了3个MON的情况下),如果显示“1: mon.node-1 is down”说明某个MON挂了或无法连接。osd:显示OSD总数、在线数和未被使用状态。比如5 osds: 5 up, 5 in,意思是有5个OSD全部在线并纳入集群。如果出现1 osds: 0 up,说明OSD进程没起来。pgs:放置组的状态统计。正常是active+clean,如果出现degraded或recovering,说明数据正在迁移或副本不足。HEALTH_OK表示集群正常,HEALTH_WARN一般是有警示但不影响功能,直接看提示信息判断原因。
我习惯再执行ceph health detail查看具体的健康告警内容,比如“1 osds down”和“recovery 123 objects misplaced”这种。排查时先看ceph -w,它会持续输出状态变化,观察数据恢复进度时特别好用。
4.2 创建RBD块存储并验证读写
集群建好,下一步就是验证能不能用。我用RBD块存储做了一次完整的读写测试,这是最直观的功能确认方式。
在管理节点进cephadm shell,先创建存储池然后创建块设备:
ceph osd pool create mypool 128 rbd pool init mypool rbd create --size 5G mypool/myimage rbd ls mypool128是PG数量,测试环境的小池子128够用,生产环境要根据集群规模计算,PG数量并非越大越好,太大会增加OSD的负载。之后在客户端机器上做内核映射:
rbd map mypool/myimage mkfs.ext4 /dev/rbd0 mount /dev/rbd0 /mnt/ceph-test然后往挂载目录里写个大文件再读出来,对比哈希值是否一致。我这里写了个2GB的文件,用dd生成再sha256sum对比。第一次写的时候速度一般,因为只有3个OSD且没有做缓存池,但这能确认数据确实在“分布”而不是存在某一台机器上。测试完取消映射:
umount /mnt/ceph-test rbd unmap /dev/rbd0每次做rbd map前要确认客户端内核支持rbd模块,用modprobe rbd加载即可。Ubuntu系自带这个模块,RedHat系可能需要额外装ceph-common或安装包。
4.3 扩展验证:对象存储网关与CephFS
块存储OK之后,我还顺手验证了另外两个接口,因为标题说了“统一存储”,不试一下总觉得缺了一块。
对象存储网关RGW的部署用cephadm非常简单:
ceph orch apply rgw test它会自动部署radosgw服务,并默认监听8000端口。验证时可以用S3客户端,也可以直接使用curl发起简单请求。RGW本身依赖存储池,配置时会自动创建一系列默认池。如果你不需要对象存储,可以不开RGW——这个服务会消耗额外内存。
CephFS需要先部署MDS,再创建文件系统。命令如下:
ceph orch apply mds myfs ceph fs volume create cephfs创建文件系统时,Ceph会自动创建两个数据池和一个元数据池。挂载CephFS稍微麻烦一点,需要内核驱动或fuse工具。我是在客户端上装了ceph-fuse后挂载的,命令是ceph-fuse -m <mon-ip>:6789 /mnt/cephfs。测试环境能跑通文件协议挂载,Ceph基本功能就算验证完整了。
这里提醒一句:如果暂时不需要CephFS,不建议创建,因为MDS服务和对应的元数据池会占资源。按需开启才是合理的运维习惯。
5. 亲测踩坑记录:安装中出现的典型问题与排查过程
5.1 bootstrap超时和MON容器起不来的排查
我最早遇到的一个问题就是bootstrap到一半提示超时,MON容器不断重启。当时日志里反复出现“Failed to connect to mon.”或者“no daemon active”的信息。排查发现主要有两个原因:第一是节点本身时间漂移太严重,和另一个节点差了十几秒,导致MON无法达成共识;第二是防火墙拦截了6789端口。
先把chrony配好、确认timedatectl显示时间正常,再确保6789、3300、8443等端口放行,重新执行bootstrap就过了。这里给大家一个经验:bootstrap挂掉不一定需要完全清掉环境重来,只要不是数据盘被误格式化,可以删除/etc/ceph和/var/lib/ceph下的相关内容后重新引导。
5.2 OSD起不来:磁盘与权限的两类原因
OSD创建后有时会处于down状态,接排查时分别在节点上看OSD服务日志。我遇到的情况有:磁盘本身有分区表残留,Ceph无法直接使用,需要用ceph orch device zap <host> <device> --force把磁盘清一遍;还有一次是权限问题,cephadm用户对磁盘设备没有读写权限,需要在节点上调整udev规则或者用root执行cephadm命令。
判断磁盘能不能被Ceph使用,可以看ceph orch device ls,如果设备出现在列表里且状态是Available,那就能直接用;如果显示Stopped或者Unknown,先清理磁盘或者手动创建OSD。
5.3 Dashboard无法登录与端口占用
Dashboard登录不上的情况分两种:一种是密码忘记了,可以用ceph dashboard acm-show查看当前用户重新设置密码;另一种是端口被占用或者防火墙拦截。我的情况是8443端口没对外开放,放行之后打开页面正常。
还有一次是Dashboard显示“Failed to connect prometheus”之类的提示,这是因为监控插件没启全,在Dashboard里启用Prometheus模块或者执行ceph dashboard set-alertmanager-api-host之类的命令即可。这些提示不影响核心存储功能,但看着碍眼。
5.4 时间同步导致的状态异常
时钟问题在Ceph集群里表现得非常隐蔽。我有一次集群整体健康,但隔一会儿就出现“MON clock skew”警告,恢复又告警,来回反复。排查时发现其中一台机器没有配置开机自启chronyd,重启后时间同步服务没起来,时间就慢慢偏了。
解决办法很简单:systemctl enable --now chronyd让服务常驻,并把所有节点的时间源配置为同一台服务器。之后再用ceph health detail确认没有时钟告警。生产环境还可以配置MON自身的时间容忍范围,但在小集群里把时钟同步做好才是根本。
5.5 常见问题速查表
| 现象 | 可能原因 | 快速解决 |
|---|---|---|
| bootstrap超时 | 端口未放行、时间漂移 | 打开6789/3300/8443端口,配置chrony后重新引导 |
| MON节点反复重启 | 主机名解析失败、时间差过大 | 检查hosts文件静态解析,同步时钟 |
| OSD创建后down | 磁盘有残留分区、udev权限 | 对磁盘执行zap清理,调整udev规则 |
| Dashboard打不开 | 防火墙拦截8443、密码错误 | 放行8443端口,重置登录密码 |
| 集群HEALTH_WARN | 有OSD离线或PG recover中 | 执行ceph health detail定位具体告警 |
| 添加主机失败 | SSH免密未配、sudo权限不足 | 检查authorized_keys,确认远程sudo免密 |
| RBD map失败 | rbd内核模块未加载 | modprobe rbd后重试 |
这个速查表收集的都是我实测中遇到的高频问题,如果你配置过程中碰到类似现象,直接对照能省不少时间。实际操作时先把基础环境核实一遍,再盯日志和集群状态,大部分问题都能定位。
6. 写在最后的一点经验
几次从零搭建Ceph集群下来,我的体会是:Ceph的难度不在“跑起来”,而在“跑多久不坏”。部署工具已经把门槛降得很低了,真正考验人的是对它工作原理的理解。装上之后多观察ceph -w的输出,看它自愈和再均衡的过程,你会慢慢明白为什么分布式存储既要设计精巧又要依赖可靠的底层环境。其实这种“把一堆普通设备拧成一个可靠系统”的思路,本身就很值得体验。
最后分享一个小技巧:测试环境下玩坏了不用心疼,但一定要先把/etc/ceph/ceph.conf和ceph.client.admin.keyring备份出来。这两个文件是管理整个集群的钥匙,丢了就只能重新引导。集群规模不大的时候,定期把OSD的容量使用情况记录一下,能帮你提前规划扩容,避免出现磁盘写满才手忙脚乱的局面。