Ceph分布式存储部署实战:从零搭建到读写验证全记录
先把话放前面这篇不是那种贴几个命令就完事的“教程”而是我连续折腾几个晚上、把集群从零装到能跑、再把数据写进去读出来的完整记录。Ceph分布式存储的坑不少网上资料也杂很多文章停在理论层面命令一跑就报错。这篇把我的实测过程、参数选择、踩坑点全部写出来照着走基本能把环境搭起来至少不会在第一步就卡住。适合看这篇的人想搭一套自己的分布式存储、在测试环境里验证Ceph功能、或者准备在生产环境选型但想先摸清部署细节的同学。文章会尽量把每一步的“为什么”也讲清楚不只是让你复制命令。1. Ceph是什么为什么我选它做存储底座1.1 先搞懂Ceph里的几个角色Ceph常被称作“统一存储”因为它一套集群能同时提供三种存储接口块存储RBD、文件存储CephFS、对象存储RGW。底层数据存储和分布由RADOS负责往上再封装不同协议给外部使用。这个概念聊起来很抽象我换成自己的理解Ceph的核心思路是把一堆普通机器的磁盘聚合成一个巨大的存储池然后在这个池子上切块、做副本、分发给客户端。不管用哪种接口读写数据最终都以对象形式落到底层OSD里副本数、故障域这些策略由集群统一决定。部署时打交道最多的是这几个角色MONMonitor集群的“大脑”保存集群状态的地图负责选主和监控各节点心跳一般建议至少3个。OSDObject Storage Daemon真正存数据的进程一个磁盘通常对应一个OSD同时负责向MON上报状态、参与数据复制和恢复。MGRManager提供监控面板、均衡、编排等扩展功能现代版本没有MGR很多命令都跑不顺。MDSMetaData Server只在用CephFS文件存储时需要保存文件目录的元数据。RGWRADOS Gateway对象存储网关对外提供S3兼容接口。初次上手容易迷糊的地方在于OSD不是一块磁盘而是一个进程加一个磁盘的组合MON也不只是存配置它还要负责任何时刻的“谁是最新状态”判断。理解了角色才能看懂后续一堆daemon健康检查的输出。1.2 相比其他方案Ceph的优势和代价我之前也对比过其他方案。如果只想做块存储很多方案都更轻、更简单比如各类商业存储甚至单机ZFS导出iSCSI。Ceph的强项在“规模化和自愈”扩容时不用停机节点宕了自动在别处补副本数据打散均衡分布不用人为干预。这些特性对云平台、虚拟化后端这类场景特别重要。我一个测试环境里挂了几台机器磁盘大小不一、有的是SSD有的是HDDCeph也能通过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-1MON MGR OSD64GB SSD1TB HDD x2千兆node-2MON OSD64GB SSD1TB HDD x2千兆node-3MON OSD64GB SSD1TB 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-nr1048576 fs.file-max2097152 net.core.rmem_default262144 net.core.wmem_default262144 net.core.rmem_max4194304 net.core.wmem_max4194304执行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通常是当前节点的内网IPcurl --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自动把可用设备都做成OSDcephadm 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端口是否在防火墙规则里之前我因为内网安全组拦截导致外网访问不了看起来像是服务没起来其实就是端口没放行。生产环境建议配置Lets 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:放置组的状态统计。正常是activeclean如果出现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的容量使用情况记录一下能帮你提前规划扩容避免出现磁盘写满才手忙脚乱的局面。