Google Cloud Spanner是Google Cloud提供的全托管分布式关系型数据库服务,目标是把关系数据库的事务模型、SQL能力与跨区域扩展结合起来。它并不是简单地把一台MySQL服务器复制到几个国家,而是在底层将数据划分为可以独立管理的Split,再通过多副本同步复制、事务协议和自动负载管理,让一个数据库能够跨越多个故障域运行。对于需要高可用、事务一致性以及大规模水平扩展的业务,Spanner解决的核心问题,是如何在数据规模和用户地域不断扩大以后,仍然保持关系数据库的事务语义。
Spanner最重要的特征之一是外部一致性(External Consistency)。Google官方文档将其描述为比通常所说的“强一致性”更严格的事务排序保证:事务不仅能够以可串行化方式提交,而且不同客户端观察到的提交顺序与事务实际提交顺序保持一致。Spanner利用TrueTime提供的时间不确定性界限辅助事务提交排序,同时使用基于Paxos的复制机制维护不同副本之间的一致性。这里需要注意,TrueTime并不是简单意义上的“全球服务器时钟同步到毫秒级”,它提供的是带有不确定性区间的时间服务,Spanner利用这个区间来完成外部一致性所需要的提交排序。
Spanner的另一个核心设计是数据自动分片。数据库中的数据并不是永远放在某一台服务器上,而是按照主键范围等方式划分成多个Split。随着数据规模和访问负载变化,Spanner可以自动增加或调整Split边界,并将不同Split分配到不同服务器,从而把计算负载分散开来。Google官方文档还说明,Spanner可以根据负载进行Split,以缓解某些读取热点。因此,Spanner的水平扩展并不是传统意义上由开发人员手工维护大量数据库Shard,而是由数据库服务负责大量底层分片管理。
但是,自动Split并不意味着任何数据库设计都能够无限扩展。主键设计仍然非常重要。如果大量写入集中在一个连续的键范围,或者业务产生明显的热点,数据库仍然可能出现资源集中。Google官方性能文档也明确建议设计能够避免热点的Schema。因此,Spanner虽然把大量分片管理工作自动化了,但并没有取消数据库Schema设计的重要性。
多区域部署则解决了另外一个问题,也就是单一区域发生故障时数据库能否继续提供服务。Spanner可以使用区域、双区域和多区域配置。在多区域配置中,数据会被复制到多个区域,并通过投票副本形成写入Quorum。Google当前的基础多区域配置包含多个读写副本以及Witness等副本角色,其中一个读写区域被指定为默认Leader Region。写事务首先在Leader Region处理,并通过复制机制完成提交;如果默认Leader Region发生故障,Spanner可以在其他读写区域重新建立Leader,从而维持数据库服务。
这里也容易产生一个误解:Spanner并不是把全球所有写请求自动发送到距离用户最近的数据库区域。对于多区域部署,写事务存在Leader Region概念。如果应用部署在非Leader区域,写操作仍然需要与Leader相关副本完成协调。Spanner提供Leader-aware routing,可以把客户端的读写事务请求更有效地路由到Leader Region,从而减少不必要的网络往返,但这与传统意义上的“DNS自动寻找最近服务器”不是一回事。
读操作则具有更多选择空间。Spanner提供强一致读取,也支持在特定场景下使用具有时间新鲜度限制的读取方式。对于全球部署的应用,如果某些业务允许读取略旧的数据,就可以利用更接近用户的副本降低读取延迟;如果业务要求读取最新提交的数据,则需要根据数据库配置和读取方式承担相应的跨区域协调成本。Google的多区域性能建议也特别指出,非Leader区域的低延迟读取可以通过适当的Staleness设置获得,而写密集型应用则应该尽量把关键计算资源放在Leader Region附近。
这意味着Spanner解决的是一个很具体的架构问题:企业不希望把全球业务拆成几十个彼此独立的数据库,再由应用程序自己解决数据同步、冲突处理和跨区域事务;同时又不希望所有数据都集中在一个区域,以至于全球业务扩展以后出现可用性、故障恢复和容量瓶颈。Spanner提供的是一个统一的数据库抽象,让企业可以在一个数据库体系内进行跨区域复制、事务处理和水平扩展。
例如,一家跨国电商平台可能同时拥有北美、欧洲和亚洲用户。订单、库存、账户余额等数据之间存在明显的事务关系。如果业务要求多个数据修改必须作为一个原子事务提交,那么把数据拆成多个完全独立的区域数据库以后,应用层就必须自己处理跨数据库事务和数据一致性。Spanner可以把这部分复杂性下沉到数据库层。当然,这并不意味着所有电商系统都必须使用Spanner。很多业务通过单区域关系数据库、只读副本、缓存、消息队列或者应用层分片同样能够满足需求,而且成本和架构复杂度可能更低。
Spanner的价值还体现在它把数据库扩展与故障处理的一部分运维工作交给托管服务。随着数据增长,Spanner可以自动进行Split;不同副本可以分布在不同故障域;多区域配置可以通过复制和Quorum机制提高区域级故障容忍能力。对于企业,这减少了手工维护数据库集群、复制拓扑和分片迁移的工作量。不过,“自动管理”并不意味着企业无需进行容量规划。Spanner仍然需要配置足够的计算容量,并且Schema、索引、主键和查询方式都会影响实际性能。
全球数据库还有一个容易被忽视的问题,就是数据所在地。不同国家和行业可能存在数据驻留、隐私以及监管要求。Spanner允许企业选择区域或多区域配置来控制数据存储范围;目前的文档还提供了Geo-partitioning能力,可以根据Placement把数据分布到不同的实例分区,并针对特定业务数据实现更细致的地域放置。该能力目前属于Enterprise Plus中的Pre-GA功能,因此不能把它简单理解成所有Spanner部署默认拥有的全球自动分片能力。
Spanner也不是传统MySQL的简单升级版。两者都提供关系模型和SQL,但底层架构和适用场景存在明显差异。一个中小型企业如果业务主要集中在一个国家或一个区域,数据规模并不大,也没有跨区域强一致事务的要求,那么普通MySQL加备份、只读副本、缓存以及必要的分片,可能已经能够满足需求。为了一个只有几十GB数据的网站建立全球多区域Spanner集群,就像为了每天买一袋面包而购买一辆集装箱卡车,技术上当然可以,经济上却未必合理。
Spanner真正值得考虑的场景,是数据库本身已经成为全球业务架构中的核心基础设施,同时企业确实需要关系数据库的事务能力、跨区域高可用、自动水平扩展以及统一的数据模型。例如全球账户系统、订单系统、金融类交易平台、大型SaaS平台以及需要跨区域运行的核心业务,都可能从这种架构中受益。对于只需要全球内容分发的应用,则没有必要因为“全球用户”四个字就直接选择Spanner,CDN、缓存和区域化应用架构往往解决的是另一类问题。
Spanner的代价也必须计算进去。多区域副本意味着更复杂的网络协调和更高的基础设施成本;跨区域写入天然存在网络距离,因此不能期待“全球强一致”与“单区域本地数据库一样低的写延迟”同时免费获得。Google官方文档也明确指出,多区域配置中的副本需要形成跨区域写入Quorum,因此写延迟会受到区域之间网络距离影响。
因此,Google Cloud Spanner真正解决的并不是简单的“数据库容量不够大”问题,而是传统关系数据库在全球化业务中同时面对的几个结构性挑战:如何保持事务一致性,如何跨故障域复制数据,如何随着数据和负载增长进行水平扩展,以及如何让全球应用在统一数据库模型下继续运行。它把大量分布式数据库的复杂机制隐藏在托管服务内部,但并没有消除分布式系统本身的成本。
对于企业架构设计,选择Spanner的关键也不是单纯比较“谁的QPS更高”,而是先判断业务是否真的需要全球多区域事务、高可用和水平扩展。如果业务规模和地域要求有限,传统MySQL、PostgreSQL加复制、缓存、消息队列或应用层分片仍然可以构成非常成熟的架构;如果业务已经进入全球化阶段,并且数据库一致性、区域故障恢复和水平扩展成为核心约束,那么Spanner提供的是一种把这些复杂问题更多交给数据库平台处理的架构选择。
Google Cloud Spanner 是什么,全球分布式数据库解决了哪些实际问题
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP