滚动新闻 →
中资承建巴基斯坦大坝防护堤决口引发质疑 安徽砀山大润发超市发生随机砍人事件 网传5人伤亡 美伊停火谈判陷入僵局 卡塔尔调解角色引关注 俄第二大炼油厂遭袭,40万战损数据曝光 土耳其钢铁厂爆炸致10死4失联 孩子犯错时父母应该怎样处理才不会推卸责任 什么情况下应该使用快速剪辑 辛亥革命为什么能够推翻清朝 伊南大爆炸!1小时轰塌38桥?黄出轨细节曝光! 台湾主持人郑弘仪揭秘父母长寿秘诀 三要素助力健康长寿 黄仁勋婚外情牵出共谍疑云 嫡系公司涉中共国资调查 陕西司机驾驶挖掘机冲击政府大楼 网民称其为英雄 霍建华女儿痴迷韩星引吃醋,自称‘上古帅哥’遭吐槽 阳台空间除了晾衣服还能怎么利用 奈良古寺旁的柿叶寿司 美军组建铁门特遣队阻断伊朗陆路通道 川普称战事已获突破 杭州万达广场疑似发生持枪抢劫案 民众披露更多细节 坐在加拿大金三角温泉的露天池里,看群山静静站在远方 王健林时隔14年重返万达商管董事长职位 中国男子东京银座涉嫌干扰通讯发送钓鱼短信 燃油泵异响应该如何判断 黄渤坦言无戏可拍 面临双重现实困境 山西太原高楼大火 至少14人死亡 高雄前镇发现缠附哑铃骨骸 疑为连环杀人案受害者 车道保持辅助到底有什么作用 桃园警方拦查可疑厢型车 7名移工跳车4人被捕3人逃逸 秦皇岛遭罕见特大暴雪袭击 深厚积雪画面曝光 加拿大投资房应该如何计算真实租金收入 塞内加尔海域非法移民船难致34人遇难 搜救持续 为什么长期投资需要耐心 民主党拟对马斯克及白宫幕僚长展开调查 黄仁勋婚外情牵涉间谍调查 川普马斯克回应 川普承认移民政策过于严苛 愿与民主党协商 二手游艇内部设备应该如何检查 新竹县议会成全台第18个通过反跨境镇压提案的县市议会 伊拉克霍尔莫尔气田遭无人机袭击 沙特阿美大楼遇空袭 电影项目如何寻找导演 张艺谋警示AI冲击电影业 中共新政引发演员失业担忧 美军特遣队封锁伊朗陆路 川普证实行动 中国中东部8省市遭遇强降雪 局地降温超14℃

Cloud SQL Read Replica 是什么,数据库读压力增加后可以怎样扩展

发布时间: 2026-10-18 21:00:02    最后更新: 2026-11-09 08:50:11    阅读:311  约11 分钟阅读     

Cloud SQL Read Replica 是什么,数据库读压力增加后可以怎样扩展
图片说明:示意图   图片来源:Public Domain(公有领域)
当一个应用从几百个用户增长到数万甚至更多并发请求时,数据库最先遇到的问题往往不是存储空间不够,而是读请求越来越多。首页查询、商品列表、用户资料、报表接口以及后台管理系统都会不断向数据库发起SELECT请求。如果所有读写操作都集中在同一个数据库实例上,即使CPU和内存配置已经很高,也可能因为连接数、磁盘I/O和查询并发度达到瓶颈。

Google Cloud的Cloud SQL提供了Read Replica,也就是只读副本,可以把主数据库产生的数据异步复制到一个或多个副本实例,让应用把部分读取请求转移到副本,从而形成基本的读写分离架构。

Cloud SQL Read Replica到底是什么

Read Replica并不是一个独立的数据源,也不是简单地把数据库复制一份之后完全脱离主库运行。它通常通过数据库引擎提供的复制机制,从Primary Instance持续接收并应用变更。

应用仍然把INSERT、UPDATE、DELETE等写操作发送到主实例,而SELECT等可以接受一定数据延迟的读取请求,则可以发送到Read Replica。

因此,一个典型架构可以表示为:

应用 → Primary Instance → 写操作

应用 → Read Replica 1 → 读操作

应用 → Read Replica 2 → 读操作

应用 → Read Replica 3 → 读操作

这种架构最适合读多写少的业务。如果一个网站的大部分请求都是读取数据库,而写入比例相对较低,那么增加Read Replica可以把读取压力分散到多个数据库实例。

但Read Replica并不能直接解决所有数据库瓶颈。如果真正的瓶颈是写入能力、锁竞争、单条SQL执行时间或者主实例磁盘性能,那么单纯增加只读副本不会让问题消失。

Read Replica最大的特点是异步复制

设计读写分离架构时,最容易被忽略的问题就是复制延迟。

主数据库提交了一笔新的数据之后,Read Replica需要经过复制、传输和应用过程才能看到这笔变化。因此,副本中的数据可能暂时落后于Primary。

例如用户刚刚修改了账户资料,随后立即刷新页面。如果下一次读取请求被路由到一个存在复制延迟的Read Replica,应用可能暂时看到旧数据。

这就是典型的read-after-write问题。

因此,不能简单地把所有SELECT都无条件发送到Read Replica。对于用户刚刚提交的数据、支付状态、订单状态或者其他要求立即读取最新结果的操作,通常仍然应该从Primary读取,或者由应用建立明确的一致性策略。

应用层必须真正实现读写分离

创建Read Replica只是基础设施层面的第一步,真正决定它能不能发挥作用的是应用程序。

数据库连接池需要知道哪些连接用于写操作,哪些连接用于读取。例如应用可以维护Primary连接池和Replica连接池,写事务固定使用Primary,而普通查询根据负载情况发送到Replica。

如果应用所有SQL最终仍然连接Primary,那么创建十个Read Replica也没有意义。

更复杂的系统还需要根据查询类型进行路由。例如用户登录后的账户信息、订单确认页面等对最新数据敏感的查询可以进入Primary;公共内容、搜索结果、产品目录等允许存在短暂延迟的查询,则可以进入Read Replica。

这种路由逻辑最好由应用框架、数据库访问层或者专门的数据库代理统一管理,而不是让开发人员在每个SQL语句中手工决定连接哪个数据库。

增加Read Replica并不等于无限扩容

当一个Read Replica已经接近CPU、内存或者磁盘I/O瓶颈时,可以继续增加其他Replica,把读取请求进一步分散。

例如原来所有读取都进入Primary,随后增加两个Replica,就可以形成三个读取目标。随着业务增长,还可以继续增加副本。

但这里存在一个重要限制:Read Replica解决的是读扩展,而不是写扩展。

所有写操作最终仍然需要进入Primary以及其复制链路。如果应用的主要瓶颈已经转变成INSERT、UPDATE、DELETE吞吐量,那么继续增加Replica不会解决核心问题。

此外,副本数量增加以后,复制链路、网络流量、监控复杂度以及数据库实例成本也会同步增加。因此,扩容之前应该先确认瓶颈究竟发生在Primary的CPU、内存、磁盘I/O、连接数,还是SQL本身。

不要把慢查询直接交给Read Replica

很多数据库系统在性能下降以后,会产生一个非常自然的想法:把慢查询全部放到Read Replica。

这只能解决部分问题。

如果一个查询本身需要扫描数百万甚至数千万行数据,那么它放到Replica以后,只是从“Primary很慢”变成“Replica很慢”。如果多个报表同时执行大型JOIN、排序或者聚合操作,副本同样会出现CPU和I/O竞争。

因此,在增加副本之前,通常应该先检查慢查询日志、执行计划、索引设计以及查询返回的数据量。

一个正确的索引或者一次SQL重写,有时能够减少大量数据库负载,而不需要增加新的数据库实例。

跨区域Read Replica解决的不只是读取问题

对于需要跨区域部署的应用,可以考虑将Read Replica部署到其他区域,让距离用户更近的应用服务器访问对应的数据副本。

例如主数据库位于一个区域,另外一个区域部署Read Replica。当用户主要来自多个地理区域时,这种架构可以降低部分读取请求的网络延迟。

但跨区域复制也意味着需要认真计算网络延迟、复制延迟以及数据传输成本。

如果业务要求读取结果必须始终与Primary完全同步,那么异步Read Replica并不适合直接承担这类强一致读取任务。

跨区域副本还经常与灾难恢复策略联系在一起,但需要注意,Read Replica本身并不等于完整的备份系统。真正的灾难恢复还涉及备份、恢复点目标(RPO)、恢复时间目标(RTO)以及故障切换流程。

数据库扩展之前,缓存往往更加便宜

如果大量请求重复读取完全相同的数据,那么让每一次请求都访问Cloud SQL并不是最有效的架构。

例如网站首页配置、热门文章、商品分类、公共API结果等数据,可以通过缓存减少数据库访问次数。

Google Cloud环境中可以根据应用需求采用Memorystore等缓存服务。应用首先检查缓存,如果缓存命中,就不需要访问Cloud SQL;只有缓存不存在或者已经过期时,才访问数据库。

这种方式与Read Replica并不冲突。

缓存解决的是“请求根本不需要访问数据库”的问题,Read Replica解决的是“确实需要访问数据库,但不能全部压在Primary上”的问题。

什么时候需要从Read Replica进一步升级架构

如果增加多个Read Replica以后,数据库仍然无法满足业务需求,就需要重新判断系统瓶颈。

如果问题来自单个数据库实例的写入能力,可以考虑数据库垂直扩容、优化事务、减少无效写入,或者根据业务特点进一步采用分片(Sharding)等架构。

如果问题主要来自分析查询,则不应该让生产事务数据库承担越来越多的复杂报表任务。可以考虑将分析工作负载迁移到更适合分析处理的数据平台。

如果问题来自大量重复读取,则缓存可能比继续增加Read Replica更加有效。

如果问题来自某些SQL查询本身,则应回到执行计划、索引和数据访问模式进行优化。

因此,数据库扩展并不是一条固定路线,而通常是从SQL优化开始,然后根据实际瓶颈逐步进入缓存、Read Replica、垂直扩容、分析系统分离以及分片等不同阶段。

Cloud Monitoring应该监控什么

Read Replica部署以后,监控不能只看CPU。

首先需要观察Primary和Replica的CPU、内存、磁盘I/O、数据库连接数和网络吞吐量。同时还要重点观察复制延迟,因为Replica即使CPU只有30%,如果复制已经明显落后,它仍然可能不适合承担对实时数据敏感的查询。

应用层则应该记录Primary和Replica分别承担了多少请求,并观察P50、P95、P99数据库查询延迟。

如果新增Replica之后,数据库总体CPU下降了,但用户实际请求延迟没有改善,就说明问题可能不在数据库计算资源,而是在网络、应用连接池、SQL执行效率或者缓存命中率。

这也是云数据库架构中非常重要的一点:不要因为某个资源指标下降,就直接认定系统性能已经改善,最终还是应该回到真实请求延迟和业务吞吐量。

一套比较完整的扩展路线

对于一个正在增长的Cloud SQL应用,可以按照这样的顺序进行演进:

首先优化SQL、索引和数据库连接池,解决可以通过软件优化消除的问题;随后根据CPU、内存和I/O情况进行实例规格调整;当读请求成为主要瓶颈时,引入Read Replica并在应用层实现读写分离;对于重复读取严重的业务增加缓存;如果跨区域访问成为主要问题,再考虑区域级部署;当数据库规模继续增长并出现单实例无法解决的结构性瓶颈时,再考虑分片或者把特定工作负载迁移到专门的分析系统。

Cloud SQL Read Replica真正的价值,并不是简单地“复制一个数据库”,而是给数据库架构增加了一条横向扩展读取能力的路径。它可以把Primary从大量普通SELECT请求中释放出来,让主实例更多承担核心写入和事务工作。但它同时带来了复制延迟、连接路由、数据一致性、监控和成本等新的工程问题。

所以,当数据库读压力开始增长时,最合理的做法并不是立即增加更多数据库实例,而是先找到真正的瓶颈。只有确定主要压力来自读取,并且业务能够接受副本存在一定复制延迟之后,Read Replica才真正成为合适的扩展方案。随着业务继续增长,再把缓存、区域部署、分析系统和分片等技术逐步组合起来,才能形成能够长期运行的数据库架构。

喜欢这篇报道?

使用下面的功能,方便以后继续阅读和分享 MNewsTV

设为 Google 新闻首选来源 让 Google 新闻优先显示 MNewsTV 的最新报道 ›
★ 我的收藏 查看已经收藏的文章
关于文章收藏 收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。 删除收藏请进入「我的收藏」进行管理。
分享这篇报道

捐助(Paypal): https://www.paypal.me/observeccp
订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP