当一个网站从单机数据库发展到多个数据中心以后,数据库架构很快就会遇到一个现实问题:用户可以分布在全球,但数据究竟应该放在哪里?如果数据库部署在北美,亚洲用户访问会产生网络延迟;如果每个地区都建立数据库,又会遇到数据复制、事务一致性、故障切换和数据冲突等问题。Google Cloud Spanner和传统MySQL的区别,正是在这种场景下开始体现出来。
传统MySQL最常见的架构仍然是单实例或主从复制架构。应用程序连接数据库,InnoDB负责事务、锁、MVCC以及数据持久化。如果业务规模扩大,可以增加只读副本、使用高可用集群、分片、缓存和消息队列等组件继续扩展。这套技术体系成熟、生态庞大,而且大量企业已经拥有MySQL运维经验,因此对于区域性业务,完全没有必要因为“全球数据库”这个概念听起来先进,就直接换成分布式数据库。
Cloud Spanner的设计目标则不同。它从底层开始就是分布式关系数据库,可以将数据和计算资源分布在多个节点和区域,通过副本机制提供高可用能力,并支持SQL、事务以及自动的数据分片和负载管理。它的价值并不只是“数据库可以放在多个国家”,而是把分布式存储、复制、事务和扩展能力作为数据库本身的一部分。
两者最重要的区别之一,是数据复制和事务的一致性模型。MySQL本身可以建立非常复杂的高可用和复制架构,包括异步复制、半同步复制以及MySQL Group Replication等不同方案,但不同方案的延迟、故障处理和一致性语义并不相同。如果采用传统异步跨区域复制,主库提交事务以后,远端副本需要经过网络传输才能获得数据,因此两个区域在某个时间点看到的数据可能不同。
Spanner则把跨节点复制和分布式事务作为数据库内部能力来处理。其事务模型强调外部一致性(External Consistency),能够在满足条件的情况下让事务提交顺序与外部观察到的时间顺序保持一致。不过,不能因此把Spanner简单理解成“任何查询在全球任何地点都一定读取最新数据”。Spanner提供多种读取方式,包括强读取和带时间戳或staleness的读取,具体一致性和延迟取决于所使用的读模式以及数据库配置。
这也是全球数据库架构中一个非常重要的工程取舍:越强调跨区域一致性,网络通信就越可能进入事务路径。数据库不能凭空消除地理距离。用户在加拿大、欧洲和亚洲之间相隔数千甚至上万公里,跨区域事务最终仍然受到网络传播延迟影响。因此全球分布式数据库真正解决的是“如何把这种分布式复杂性系统化地交给数据库处理”,而不是让物理网络距离消失。
扩展方式也是两者的重要区别。传统MySQL通常通过增加更强的实例、读副本、分片或者数据库集群扩大容量。分片以后,应用程序或者中间件往往需要决定某条数据属于哪个分片,并处理跨分片查询和事务。对于规模较大的系统,这些工作本身就会成为架构的一部分。
Spanner能够自动进行数据分片和负载重新分配,但这并不意味着开发人员完全不用考虑数据库设计。主键设计尤其重要。如果大量写入集中到相邻的键值区域,就可能形成热点;不合理的索引同样可能增加资源消耗。分布式数据库只是把很多基础设施工作自动化了,并没有取消数据库设计规律。
故障处理也需要区分数据库层和应用流量层。Spanner通过副本机制和数据库自身的分布式架构处理节点和区域层面的故障,而Google Cloud的负载均衡服务属于应用入口和网络流量层。一个完整的全球系统通常仍然需要应用层流量调度、健康检查、服务发现和区域级部署策略。不能简单理解成“用了Spanner以后,全球负载均衡也自动解决”。
那么什么时候真正需要全球级数据库架构?一个重要判断标准,是业务是否同时存在全球用户、跨区域部署、较高可用性要求以及对事务一致性的明确需求。如果一个电商平台的订单、库存和支付状态需要在多个区域之间保持严格一致,而且业务还希望减少自行建设跨区域数据库复制和故障处理系统的工作,那么分布式关系数据库就具有实际价值。
反过来,如果业务主要集中在一个国家或者一个地区,用户访问路径也比较稳定,那么单区域MySQL加高可用、备份、只读副本和缓存系统通常就可以满足需求。即使网站拥有全球用户,也不意味着数据库必须全球分布。例如静态图片、CSS、JavaScript以及部分可缓存内容可以交给CDN处理,而核心交易数据仍然保存在一个主要区域。
数据合规也不能简单等同于“必须使用全球数据库”。例如欧盟《通用数据保护条例》(General Data Protection Regulation,GDPR)涉及个人数据处理、数据主体权利以及跨境数据传输等多项要求。企业应该根据实际业务和数据类型确定数据存储、访问和跨境传输方案。某项业务受到GDPR约束,并不意味着它必须采用Cloud Spanner,更不能因为使用了全球数据库就自动满足合规要求。
成本同样是架构选择的重要因素。MySQL最大的优势之一就是技术成熟、开发人员和运维人员数量庞大,而且企业可以根据业务规模选择从单实例到大型集群的不同部署方式。Cloud Spanner这类分布式数据库则把大量底层运维工作交给云平台,但相应的数据库成本、网络成本以及架构设计要求也需要纳入预算。
对于已经运行多年的MySQL系统,迁移到Spanner也不是简单地修改数据库连接字符串。SQL兼容性、索引设计、事务行为、存储过程、字符集、数据类型、ORM、监控系统以及备份恢复流程,都可能需要重新验证。真正值得迁移的理由应该来自业务架构,而不是单纯追求数据库产品的技术先进程度。
还有一个经常被忽略的问题,就是“全球级数据库”和“全球级应用”其实是两个不同概念。一个全球应用可以采用区域化数据库,把用户数据按照地区进行划分,再通过异步事件和业务规则同步必要的信息;也可以让多个区域共同访问一个分布式数据库。前者可能获得更低的本地延迟,后者则更容易处理跨区域事务,但两种架构的工程代价完全不同。
因此,判断是否需要Cloud Spanner这类全球分布式数据库,真正应该问的不是“我的网站够不够大”,而是“我的业务是否需要跨区域数据和事务,同时又希望数据库自身承担分布式复制、扩展和高可用的大量复杂工作”。如果答案是否定的,成熟的MySQL架构往往已经足够;如果答案是肯定的,那么Spanner这类系统才开始体现它的价值。
数据库架构从来不是一场“单机数据库”和“全球分布式数据库”之间的技术竞赛。单区域MySQL、高可用集群、读副本、分片、缓存、消息队列和全球分布式数据库都是工具,区别只在于它们承担的工程问题不同。真正成熟的架构设计,是让数据位置、事务边界、延迟目标、故障模型和合规要求共同决定数据库形态,而不是先决定使用某个产品,再想办法让业务适应它。
Cloud Spanner 和传统 MySQL 有什么区别,什么时候需要全球级数据库架构
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP