Ceph RGW多区部署实战:从概念原理到排障调优

发布时间:2026/10/14 1:10:49
Ceph RGW多区部署实战:从概念原理到排障调优 1. 项目概述与多区部署的适用场景先说说我自己的理解。Ceph对象网关RGW多区部署本质上解决的是“一个地区的网关挂了数据不能丢、服务不能断”和“不同地域的用户都要就近读写数据”这两个最现实的问题。官方文档里管这套东西叫 multisite配置起来有点绕网上能搜到的资料大多只讲了命令怎么敲却没讲清楚背后的设计取舍导致很多人照着文档敲完发现同步根本不生效或者主备切换之后客户端彻底连不上了。这篇就把我从零搭建、踩坑、调优的完整过程梳理出来给后来的人省点时间。这套方案的适用场景很清楚如果你的业务只需要单机房、单集群那完全没必要上多区徒增复杂度但如果你是跨地域部署、有灾备诉求、或者希望不同区域的用户都能就近访问对象存储那么多区基本是现在唯一成熟、开箱即用的选择。适合的读者包括准备在生产环境落地Ceph RGW多区的运维工程师以及想搞明白realm、zonegroup、zone这几个概念之间到底什么关系而不是只会抄命令的同学。先说一个容易误解的地方Ceph多区不等于多集群的简单复制。它有一套自己独立的逻辑体系数据同步不是靠底层的rados复制而是靠RGW层跑后台进程拉取和推送增量日志。这个设计决定了它既能跨集群工作也让故障排查的思路和普通Ceph集群完全不同。2. 核心概念梳理与架构设计2.1 Realm、Zonegroup、Zone 三者关系我见过太多人栽在这三个概念上其实用“国家、省、市”来类比一下就通了。Realm领域相当于“国家”是一套隔离的命名空间。每个realm有自己的全局配置不同的realm之间互不可见、互不复制。Zonegroup区域组相当于“省”一个realm下可以有多个zonegroup。在普通双活或主备场景下通常只有一个zonegroup。Zone区域相当于“市”真正存储数据和处理请求的单元。一个zonegroup里可以有多个zone。realm创建之后会生成一个叫做period的东西你可以把它理解成“配置快照”。所有zone之间要同步靠的就是把当前period发布出去其他zone拉取到这个period之后才知道全局有哪些zonegroup、哪些zone、各自的endpoint是什么。很多人配置完发现别的zone看不到自己十有八九是period没发布或者没拉取成功。2.2 多区复制链路的基本工作方式RGW多区的同步分两条链路元数据同步和数据同步。元数据同步解决的是“每个区都知道现在有哪些bucket、哪些用户”。它靠的是zone内一个叫做meta master的角色元数据变更先落到这个zone再由meta master广播到其他zone。数据同步解决的是“对象内容本身怎么过去”。每个zone会为每个log shard维护一个游标后台进程从游标位置读取数据变更日志然后跨集群执行复制写入。理解这个机制对排障特别重要。比如你发现某个区域新增的bucket迟迟没有出现在远端多半要查metadata同步队列如果bucket能看到但里面的对象同步不过去那问题就在data sync那一层。两条链路独立工作一个挂了另一个不会受影响但也正因如此自检的时候要分别看。2.3 设计决策双区还是多区、双活还是主备我做了几个实际部署项目之后总结出来的经验是在动手配置之前一定要先想清楚你到底是哪种模式。双活模式两个zone都能写入业务流量可以按地域就近接入。代价是容易出现并发写同一个对象的冲突需要业务侧有冲突处理机制而且网络延迟和带宽要求高。主备模式平时只有主区对外服务备区只读或干脆不接入流量只在主区故障时切换。配置简单运维心里踏实绝大多数“灾备”诉求其实选这个就够了。三区甚至更多通常是“主备套备”或者“两个双活区加一个只读区”。多一个区同步链路的复杂度、带宽占用、故障排查面都是成倍增长的不是单纯加个机房的事。从我实操的角度强烈建议绝大多数场景先做一主一备。RGW多区的复制不是实时的在最坏情况下数据延迟取决于同步队列的积压程度和对象大小。把预期管理好后续加区再扩展比一上来就铺开三区稳得多。3. 部署前准备与环境规划3.1 网络规划带宽、时延和端口多区同步对网络的要求很多人一开始会低估。你可以把RGW多区复制想象成两地之间每天跑一趟物流货车车就是同步线程货物的体积取决于你上传对象的速度和大小而路况就是网络时延和抖动。先说时延。RGW同步进程是跨集群发HTTP请求的如果两个机房之间往返延迟超过100毫秒你会在同步速度上立刻感觉到差距。尤其是元数据同步它是偏串行的时延高会直接拖慢整个创建bucket、创建用户这类操作在远端生效的节奏。再说带宽。你需要估一个数字业务峰值写入量乘以一个冗余系数就是同步需要的带宽。比如单日产生5TB新数据按8小时业务活跃时间折算峰值写入大概是1.5Gbps左右那两区之间的专线带宽至少得按2Gbps起步规划否则数据永远追不上积压越来越深。端口方面RGW同步本质上是调用对端RGW的API所以只需要把RGW端口默认7480尤其是用于同步的端口在两个区之间互相放通不需要开放Ceph集群内部的各个端口。很多人误以为多区同步要集群底层网络互通其实完全不必要这也正是RGW多区方案的一个巨大优点两个集群可以深度隔离。3.2 时钟同步与DNS解析不要笑时钟同步真的是我踩过的一个大坑。RGW同步日志里大量用时间戳做游标和排序如果两个区的系统时钟偏差超过几秒会出现同步服务反复重启、同步位点诡异回退、甚至老数据永远同步不过去的现象。建议在两边的所有Ceph节点上统一配置好NTP并定期用 chronyc tracking 检查偏差。控制在100毫秒以内比较稳。DNS解析要提前规划好。每个zone都会配置一个或多个endpoint这些endpoint会被写进period并分发给其他zone。问题在于如果你用的是机房内网域名另一个机房根本解析不了那同步请求就会直接失败。我建议直接用公网域名或者两边都能解析的独立域名然后在两个机房分别配好对应的解析关系。另外客户端访问的域名和RGW同步用的endpoint最好分离。比如对外提供 store.example.com但zone的endpoint配置成 rgw-sync-a.internal.example.com。这样将来做故障切换的时候只需要动客户端的解析不需要动zone配置。3.3 软件版本选择与集群健康检查多区部署对版本比较敏感。我见过有人拿两套大版本不同的集群做多区结果某个新增的桶属性在旧版本上无法识别日志里全是“unknown attr”之类的警告。所以首选方案永远是一边升级到同一个版本再做多区配置如果实在没法统一至少确保两个版本之间的RGW API兼容并且以低版本那一边作为功能基准。配置多区之前还要确保两套集群各自都是健康的存储池有足够的余量。别觉得这是废话我就处理过一次案例某集群的存储池余量只剩5%用户说“同步过去的数据都是坏的”实际上是因为对端集群的池空间耗尽写入直接报了错而RGW的管理日志里只有一句不痛不痒的“failed to write”。先看集群健康能省掉一半的排障时间。4. 多区部署实操全流程4.1 主区的初始配置当基础环境没有问题后开始真正的部署动作。以下命令基于常见版本不同小版本在参数细节上略有差异但整体流程不会变。我在主集群上执行首先创建realm并设为默认radosgw-admin realm create --rgw-realmprod-realm --default注意realm一旦创建集群内已有RGW的旧配置可能会陷入“没有realm”的空白状态所以建议大家在配置维护窗口内操作并且确认所有RGW都在同一个realm下。接着创建zonegroup和zoneradosgw-admin zonegroup create --rgw-zonegroupzg-prod --rgw-realmprod-realm --default radosgw-admin zone create --rgw-zonegroupzg-prod --rgw-zonezone-a --master --defaultzone-a指定了master意味着这个zone同时承担元数据中心的角色也是整个多区体系的“源”。随后要把配置文件更新到ceph.conf里。很多发行版要求RGW启动时显式指定rgw_zone如果不写网关会按默认zone启动跟你的多区配置完全对不上。之后就是最容易漏掉的一步发布period。radosgw-admin period update --commit这个命令会把当前配置固化成一个新的period版本并推送到所有endpoint。我遇到过有人在主区把所有配置都做好了也确认了radosgw-admin zone list能正常输出但忘记敲period update结果从区那边怎么pull都只能看到默认的old realm配置。这个命令直接决定了其他区能否感知到你的新配置优先级很高。主区的zone端点要设置好radosgw-admin zone modify --rgw-zonezone-a --endpointshttp://rgw-a.example.com:7480 radosgw-admin period update --commit然后重启主区的RGW进程确认它以新realm启动即可。4.2 从区的配置与拉取从区的第一次配置核心操作是“pull”。先在从区机器上执行radosgw-admin realm pull --rgw-realmprod-realm --urlhttp://rgw-a.example.com:7480 --access-key... --secret...这里的access-key和secret不是你的Ceph集群keyring而是为同步专门生成的系统账号。它存储于新realm的配置数据中你需要通过以下命令获取radosgw-admin period pull --remote_token --access-key... --secret...实际上主区可以通过如下方式为用户生成带有特定权限的凭据并把它安全地分享给从区用于初始化拉取radosgw-admin user create --uidsync-user --display-nameSync User --system这一步给同步用户赋予了系统级权限这个用户创建好之后两台集群的RGW之间通信都依赖它。因为涉及密钥交互建议通过加密渠道传递不要明文写在工单或聊天记录里。realm拉取成功之后继续拉取最新的period配置。然后再创建从区的zoneradosgw-admin zone create --rgw-zonegroupzg-prod --rgw-zonezone-b --access-key... --secret...注意创建从区zone时不要加--master参数。此时从区集群上已经存在一个名为default的zone它会和zone-b冲突。最省事的做法是直接修改期radosgw-admin zone rm --rgw-zonedefault顺序不能反先pull realm再删旧zone再创建新zone最后重新发布period。如果先删default再做realm pull从区在拉取前就已经失去了zone配置操作过程可能直接报错。最后将zone-b设置为默认zone并把endpoint指向本区的网关radosgw-admin zone modify --rgw-zonezone-b --default radosgw-admin zone modify --rgw-zonezone-b --endpointshttp://rgw-b.example.com:7480 radosgw-admin period update --commit到这一步从区的配置数据其实已经具备但要真正跑起来还需要把从区的RGW进程重启确保加载的是新realm。4.3 启动与初步验证启动从区RGW进程之后第一步就是登录从区的管理接口查看realm状态。我习惯用的检查方式比较朴素radosgw-admin realm list radosgw-admin zone list radosgw-admin sync statussync status是排障精度最高的命令之一。它会输出当前zone的元数据同步状态和数据同步状态包含同步位点、追赶延迟、是否有错误。第一次部署时如果你看到类似“synchronization not fully caught up”的信息是正常的等一小段时间再查。更直观的验证方式是直接操作业务数据。在主区创建一个测试bucket上传一个对象然后在从区用radosgw-admin bucket list看看是否能列出这个bucket再通过radosgw-admin bucket stats确认对象的字节数。如果这些都对得上说明整条链路已经通了。这里要留个心眼从区如果也配置了对外域名客户端直接往从区写数据在双活模式下会实时同步回主区如果只想让从区作为灾备应该在网关前面做一层流量调度让写请求只在主区落地。否则一旦两个区同时写同一个对象版本冲突会让你后面排查很痛苦。5. 同步工作机制与调优经验5.1 元数据同步与数据同步的差异为什么要把这一节单独拿出来写是因为我遇到过不少同事一旦同步出问题就盲目地重启RGW、甚至重启整个集群结果毫无变化。把同步机制搞清楚之后很多问题根本不需要重启。元数据同步的消费端依赖的是zone自身的meta queue它记录着在本zone“发生”的元数据变更。数据同步则依赖每个zone的data queue负责承载对象级别的操作日志。RGW后端进程里每个不同的queue有独立的游标和并发度设置这也就意味着你完全可以在不动业务的情况下单独调大某个同步线程的参数。在实际表现上元数据同步通常很快因为元数据条目小、变更频率相对低。数据同步才是大头尤其是大对象和高并发上传场景。如果你看到主区写入很快但从区数据迟迟不齐建议先查数据同步游标是否在推进再检查是否有大文件卡住了某个分片。分片shard这个概念也要提一嘴。每个zone的data log都分了多个shard默认配置下shard数不会太高。如果业务写入非常密集而shard太少会出现热点效应某个shard的日志积压很多其他shard却闲着。你可以通过修改rgw_data_log_window等参数并给zone配置更大的shard数来改善但注意修改量越大占用的存储和元数据开销也越大建议在测试环境先跑几天看看效果。5.2 同步参数调优的实践经验先说结论默认参数能应对大多数场景但如果你对RPO有严格诉求下面几个参数值得调。rgw_sync_data_increase_bw提高数据同步瞬时带宽适合有小带宽抖动但总带宽富裕的专线。rgw_sync_data_trim_deferred控制同步完成后延迟清理日志条目的时间。太短会导致大量日志对象被反复扫描太长会占用额外存储。rgw_max_chunk_size多段上传时单次同步的对象块大小。块越大网络往返次数越少但单次失败需要重传的粒度也大一般建议保持默认。调参的核心逻辑其实是“在每一轮同步中让它少吃多跑”。RGW数据同步线程是周期性遍历游标之后再批量拉取条目并执行副本写入的。增大batch size可以减少遍历次数但会增加单轮的执行时间。如果没有大数据量场景的压测数据支撑别随意改batch size。还有一个小技巧是我自己摸索的调高从区RGW进程的日志级别观察同步线程的运行节奏可以帮助定位是“每轮同步卡在等待网络IO”还是“本地写入池子太慢”。这比单纯看同步状态有效得多。之前有一次我以为是带宽问题结果一查日志发现是远端zone的RGW开启了系统限流qps被打满导致每个同步请求都成功连上但排队时间很长。这种问题不看同步线程内部日志根本发现不了。6. 常见问题与排查技巧实录6.1 同步位点不推进最典型的现象是sync status一直卡在同一个“last sync”时间点日志里也不报错。我先说结论八成是消费端有写入失败被反复重试但日志级别太低没打出来或者对端有慢请求导致同步线程长期等在一个HTTP请求上。排查顺序建议是先看对端集群的RGW访问日志确认同步请求是持续到达还是根本没有到达。再看同步线程日志把日志级别临时调到20观察是否有长时间卡住的写操作。检查对端Ceph集群的容量和健康状态确认是否有pool满或者PG降级。我遇到过一次很典型的案例从区的某个存储池的配额被设成了1TB而实际数据已经写了1.1TB。起初同步一切正常后来容量超限所有写入都失败但问题是失败原因被Ceph内部消化掉了RGW同步线程只会无限重试不报FATAL级错误。最后通过对端客户端侧的访问日志才看出来所有来自主区同步用户的请求都返回了503。这个案例提醒我多区同步问题不要只看RGW本身对端存储的任何异常都可能表现为“同步位点卡住”。6.2 双活场景下的写入冲突双活模式最怕的事情是两个区同时写同一个key而且写的内容还不一样。RGW的冲突解决机制本质上是按时间戳比较的两个zone各自生成的时间戳在极端情况下可能不一致导致最终结果跟业务预期不符。我建议在那段业务还没完全稳定期先别开双活写入。如果一定要开考虑在客户端侧做一层路由规则让同一个业务桶的写入固定落到一个区虽然名义上是双活但实际是按桶拆分的负载。这样既享受了双活的容灾读取能力又不至于出现频繁的对象内容互搏。如果冲突已经发生处理起来比较棘手。比较务实的思路是以业务层认定的“源”为准用radosgw-admin bucket rm某个版本再重新同步。这里没有完美的自动化方案所以更要在设计阶段规避冲突。6.3 从区网关域名切换后的“历史残留”还有一个高频问题从区已经接管了业务流量但用户通过新域名访问老对象时会发现能列出桶能拿到对象列表可对象下载就是404。这通常是因为对象刚同步到从区时同步时写的placement信息里还带着主区的endpoint而客户端访问从区时RGW返回的重定向链路失效了。本质上RGW对象在网关层是有“归属”概念的不要以为数据到了从区请求就一定能在从区被完整处理。遇到这种问题需要检查bucket的placement目标配置确认它映射到当前zone。早期版本的RGW对跨zone读取的支持还比较弱新版本更健壮但如果你的业务依赖跨区读已有对象我仍然建议提前做一轮对象头信息的验证而不是等故障发生了再研究。7. 多区部署监控与日常运维经验7.1 关键监控指标不针对某个具体监控平台只说哪些指标是我觉着必须盯的同步滞后时间也就是从区最新同步位点和主区当前写入位点之间的时间差。这个值能直接反映RPO。data log积压条目数如果这个数字持续上升说明同步能力已经跟不上写入速率。同步线程活跃度和错误次数RGW内部暴露的同步线程状态比如List/Write同步线程每次循环的执行时间。对端集群的写延迟从区写入慢会倒逼主区同步线程变慢所以监控里不能只看主区从区也要看。我惯用的做法是在监控平台上把“主区对象数增长量”和“从区对象数增长量”做两个曲线叠加正常情况它们应该几乎重合一旦出现明显剪刀差就说明同步出现了异常。这个方法简单粗暴但准确率很高。7.2 权限与安全细节多区部署意味着两套集群之间有系统级账号通信而且这套账号拥有跨集群的读写权限。因此安全层面的几个习惯非常重要建议在从区上对该同步账号设置可管理的IP白名单只允许主区的网关IP段访问不要把同步账号的密钥写死在客户端配置里要用独立的keyring文件并定期轮换。还有一点在多区拓扑中你在任意一个zone上用radosgw-admin创建的普通用户如果这个zone是元数据中心会同步到其他zone如果是在从区创建则需要确认从区的元数据同步回写链路是否也正常。我在实际项目里见过有人图方便直接在从区创建了用于生产的用户结果主区迟迟看不到这个用户业务调用直接报InvalidAccessKeyId。搞清楚“配置管理在哪个区是权威”这个原则能避免这类细节问题。8. 个人体会与踩坑总结多区部署这套东西从文档看好像很简单几条命令就搭起来了但真要在生产环境稳定运行反而比单集群更考验运维的耐心和全局理解力。我最大的体会是不要在对Ceph本身不熟的情况下直接上多区否则你会分不清到底是同步逻辑的问题还是底层存储的问题。我在某个跨机房项目中前两周全在踩底层池、网络、域名解析的坑真正多区配置本身反而是最后一天完成的。所以如果你是新接触Ceph建议先在单集群里把RGW的日常管理、排障、数据迁移都跑熟了再碰多区。最后分享一个实用的小技巧在做任何大范围配置变更比如增删zone、修改zonegroup结构前先备份一下本地的period配置文件radosgw-admin period pull radosgw-admin period export --fileperiod_backup.json永久保留一份配置快照。别小看这一步我有个朋友在给多区集群改zone endpoint时手滑删错了zone最后硬是靠这份json救命把period导入回去才恢复了配置。任何时候多一步备份就是多一条退路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询