邓荣伟:稳定支撑每秒百万笔支付请求,支付宝数据库架构的过去、现在与未来

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
传统型负载均衡 CLB,每月750个小时 15LCU
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 8 月 10 日,2022 OceanBase 年度发布会在京沪深三地同时召开,支付宝资深数据库专家邓荣伟在会上分享了《从“小”到“大”,支付宝分布式升级之路》的主题演讲,为我们带来了支付宝的架构演进以及上线 OceanBase 的故事。

以下为演讲实录分享:


大家都知道支付宝是 OceanBase 的“元老级”用户,支付宝的每一次架构演进都与 OceanBase 的版本迭代息息相关。今天,我将从支付宝的数据库架构演进展开,主要围绕以下三个方面进行分享:

第一, 支付宝在线库架构演进;

第二,支付宝历史库架构,面对 PB 级数据归档,如何横向无限扩展;

第三,面对多样化存储需求,支付宝的未来探索。

image.png

支付宝一开始诞生在“IOE”时代,数据库首选 IBM 小型机+Oracle 数据库+EMC 的传统搭配。然而,当支付宝迎来第一个“双 11”,与之而来出现“峰值脉冲”,原单库单表的集中式数据库方案自然扛不住如此高的流量。所以,支付宝在很早期就进行了拆库拆表,由此诞生了基于中间件方案的第一代分布式架构。

随着支付宝的用户规模不断增长,以及历年“双 11”都需要应对超高并发,传统架构性能瓶颈凸显,数据存储成本攀升。2013 年 5 月,支付宝下线最后一台 IBM 小型机之后,开始下一步的升级迭代,众所周知,核心底层存储的替换挑战非常大,支付宝对新数据库不仅要求成本低,还要求具备高性能、可扩展、高可用等特性,OceanBase 就在这种背景下诞生了。

如下图所示,是支付宝在 2017 年之前整个数据库架构的演进。首先是底层存储全部替换为 X86,然后是数据库从 Oracle 升级为 OceanBase 0.5、再到 OceanBase 1.0。

image.png

阳老师在《OceanBase 4.0 核心技术解读》中分享了 OceanBase 的版本迭代历程。在 0.5 时代,OceanBase 因为读是分布式的,写是集中式的,所以没有办法将性能做到极致。在 1.0 时代,OceanBase 实现了一个集群内所有节点都是对等的,每个节点都可以进行读写,成为真正的分布式数据库。

OceanBase 1.0 是支付宝投产时间最长、应用范围最广的版本,主要有以下三个特点:

  • 多租户。多租户能在中小数据库整合场景中很好地提升资源利用率,例如,我们上线一套 MySQL 或 Oracle,遇到流量激增时会不得不进行拆库拆表,但 OceanBase 能以租户为资源载体的方式进行动态扩容。
  • 高可用。支付宝的金融场景,要求数据库必须满足机房级容灾、城市级容灾,OceanBase 是基于 Paxos 协议的分布式数据库,先天满足这些诉求。
  • 弹性伸缩。历年“双 11”,支付宝都会转移一部分流量去一个“泡”在湖水中的数据中心——千岛湖数据中心。当支付宝还在使用传统关系型数据库时,数据库弹出只能通过主备库的方式先在千岛湖数据中心搭一个备库,然后主备切换过去。但这种方式会有切换闪断问题,业务有感知。迁移至 OceanBase 后,数据库弹出可以直接使用 OceanBase 的加减副本、平滑切主特性,在用户不感知的情况下完成弹出。此外,OceanBase 可以做到在大促峰值结束 30 分钟内释放数千台服务器给其他业务使用。

现在式:稳定支撑每秒百万笔支付请求

家都知道,每年双 11 的各项数据都在增长,到了 2017 年的双 11时期, 1 %的压力峰值就已经超过了单库单机的最大容量。传统数据库扩容方案主要依赖分库分表拆分进行水平扩容,用多套库的方式共同流量峰值。虽然这种方案可行,但存在很多弊端,比如多套数据源、多套 DB 集群,增加了配置管理、日常管理成本。

我们需要更优雅的分布式数据库解决方案,即只使用一个库,就可以支持百万甚至更高的支付峰值,让横向扩容直接在数据库闭环,做到应用不感知,OceanBase 2.0 分区提供了完美的解决方案。

OceanBase 2.0 分区方案思路和传统的分库分表拆分一样。我们在交易支付核心库上,在原有百库百表的基础上继续按用户 UID 进行更深层次拆分,每个分表再拆成一百个 Partition,应用端只看到一张表,在用户无感知的前提下把数据拆分到更多的机器上,突破单机性能瓶颈,自动负载均衡,从而实现稳定支撑每秒百万笔支付请求的能力。

这时候大家可能会有两个疑问,为什么已经拥有分区能力,还要用分表加上分区的方案。支付宝是一个单元化部署架构,分库分表是架构的一个基础,所以分库分表不能变,在此基础上可以继续分区。这样,用户看起来还是百库百表,然后通过 OceanBase 自动负载均衡,把 1% 的表自动均摊到多台机器上,以此突破单机容量上限。

那么,OceanBase 能否在不分区的前提下使用多台机器资源?答案是可以的,支付宝内部也有很多系统没有分区,直接将单库多表均摊到多台机上的应用场景。以及,OceanBase 的分区表,是否一定要业务指定分区 ID,这其实需要根据业务场景而定,如果业务场景追求极致性能,建议指定分区 ID,我们可以按照一定的规则分区,通过应用或中间件计算出分区 ID,只要让 OBProxy 感知到分区,SQL 路由到正确的机器上即可,否则需要 OceanBase 内部二次路由,性能稍有衰减。

同时,OceanBase 2.0 为了极致性能引入 Partition Group,将业务使用了一组逻辑表的相同分区,聚集在相同的 OceanBase 节点,使分布式事务退化为单机事务做到极致性能。具体来说,假设现在是单库单表,当某业务做一笔支付请求要在这三张表里落数据时,现在是按照用户的 UID 维度,按照相同的分表分区规则做拆分,用户支付之后一定是在这三个表的同一个分区落数据,也就是说,这三个表相同分区就可以满足用户的整个业务逻辑,所有操作不需要跨机、不需要产生分布式事务。

现在,OceanBase 2.0 版本在支付宝也承担了非常多的核心业务,主要有以下三个特点:

  • 高兼容。OceanBase 支持 MySQL/Oracle 语法,让支付宝在数据库迁移时成本代价更低。
  • 性能提升,成本下降。单库单表可以扩展到多机,单库容量不再受限于单机硬件能力。相对 OceanBase 1.0,数据库整体性能提升 50%,存储空间节省 30%。
  • 更低的运维成本,更好的弹性能力。以前支付宝做数据库弹出的时候,需要业务配合。现在,OceanBase 数据库可以横向伸缩,在数据库上就已经闭环,业务不感知,基本一键完成了这件事。

迁移OceanBase之路

Oracle/MySQL 是支付宝最早投入使用的数据库,体量非常大,这种传统关系型数据库在扩展、容灾等能力上存在短板,没办法满足支付宝的发展诉求。此外,对于我们 DBA 来说,一是经常要去担心数据一致性问题,二是不得不重复维护多套运维体系、容灾体系以及生态工具,代价非常大。所以,支付宝开始规模化地将Oracle/MySQL 全部迁移至 OceanBase。现在,支付宝全栈都运行在 OceanBase 上。

异构数据库迁移是一个复杂的过程——主要是兼容性和数据质量的问题。为了高效迁移, OMS(OceanBase Migration Service,OceanBase 数据迁移工具)提供一站式的异构数据库上 OceanBase,首先为了应对兼容性问题,平台提供静态代码评估,动态流量回放评估,其次数据质量通过全量校验,增量校验,离线校验等多重手段实时保证数据一致性。

迁移至 OceanBase 后,一方面是效率提升,DBA 可以更从容地应对日常的容量容灾问题,日常容量应急、故障切换配合运维体系已经完全自动化,计划内的大促弹性和容灾演练都可以一键完成;一方面是成本降低,首先是 OceanBase 的多租户整合 Oracle/MySQL 长尾业务,优化碎片资源,其次是 OceanBase 的超高数据压缩比。让我印象非常深刻的是,当时支付宝最后一批传统集中式数据库下线,原本需要上百台机器,迁移至 OceanBase 后,10 台左右机器就解决了。


image.png

随着越来越多的业务迁移到 OceanBase,以及支付宝的业务发展迅猛,我们面临生产库磁盘不足、IOPS 性能下降,以及备份时间变长等问题,数据归档就变得非常重要。

如何高效且低成本地把这些数据归档呢?过去,我们要么引入高端商业存储阵列,要么引入新一代分布式存储。现在,我们只需要用 SATA 盘 X86 加 OceanBase 的分布式能力,就可以轻松搞定单库 PB 级存储。

其实,历史库总结起来就两个核心点,即负载均衡和故障恢复。


image.png

核心点一:负载均衡
负载均衡最主要的目的就是在成本尽量低的情况下让存储利用率和计算资源利用率尽量高。

存储利用率最大化。随着集群规模不断变大,不断接入更多业务,再加上不同年份采购机器型号的差异,会逐渐出现木桶短板效应,少部分机器影响整个集群磁盘使用率,浪费存储的问题。OceanBase 针对该问题做了特殊优化——基于分区级别进行动态的负载均衡,能最大限度利用每台机器的磁盘空间。

计算资源利用率最大化。历史库一般按照时间分区,很容易出现相同月份的分区聚集在少量机器,导致写入热点,压力不均衡。OceanBase 针对该问题也做了特殊优化——为了充分发挥每台机器的计算资源,OceanBase 将不同表相同月份的分区打散到不同机器,所有 Parition 的 leader 也均衡打散到所有机器,分散写入,防止写入热点。

核心点二:故障恢复

不论故障机器是否彻底宕机,替换的新机器都会作为目标迁入数据,瓶颈都在新机器单机的写入能力。按照普通 SATA 盘 200MB/s 的写入能力计算,100TB 数据迁移几乎需要一周时间。过长的替换时间会带来非常多的弊端,如可能出现二次宕机出现单副本,变更周期过长,容易出现失误。

鉴于常规替换时间长的种种弊病,我们利用 OceanBase 的原生分布式能力,加速替换。只需要两步,首先新机器上线,其次故障机器直接永久下线,OceanBase的总控服务 RootService 检测副本缺失,直接走补副本模式,补副本是多机到多机拷贝,生产可达 30-50GB/s,100TB 数据迁移只需两三个小时就可以完成。


image.png

支付宝的业务场景非常丰富,对存储能力的需求也是多样化的,未来,我们 DBA 团队主要会围绕 HTAP 和多模这两方面做一些探索,持续打磨 OceanBase 的能力。

一是 HTAP 方面的探索。目前蚂蚁实现 HTAP 链路复杂,和传统方案一样,订阅在线日志到数仓进行计算,不仅维护成本过高,而且过多依赖第三方组件,经常出现可用性事件。未来我们将在 OceanBase OLTP 能力的基础上扩展 OLAP 的能力,可以实现一个系统、一份数据同时处理交易和实时分析的高性价比方案,“一份数据”的多个副本可以存储成多种形态(行存/列存),用于不同的工作负载。

二是多模方面的探索。过去为了满足一种业务场景对存储的需求,比如文档、KV、时序等,我们需要引入全新的一种数据库,维护多套运维系统,重复建设容灾体系。在未来,我们将在 OceanBase 统一的存储引擎和分布式引擎之上发展多模型能力,实现一份数据,多种访问方式,更加轻松应对多样化的存储需求。

我今天的分享就到这里,希望能对大家有所帮助,谢谢大家。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
Prometheus 网络协议 JavaScript
api 网关 kong 数据库记录请求响应报文
Kong的tcp-log-with-body插件是一个高效的工具,它能够转发Kong处理的请求和响应。这个插件非常适用于需要详细记录API请求和响应信息的情景,尤其是在调试和排查问题时。
183 0
api 网关 kong 数据库记录请求响应报文
|
6月前
|
缓存 安全 API
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
公司对外开放的OpenAPI-Server服务,作为核心内部系统与外部系统之间的重要通讯枢纽,每天处理数百万次的API调用、亿级别的消息推送以及TB/PB级别的数据同步。经过多年流量的持续增长,该服务体系依然稳固可靠,展现出强大的负载能力。
167 9
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
|
2月前
|
XML Java 数据库
在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂
【9月更文挑战第8天】在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂。日志作为系统行为的第一手资料,传统记录方式因缺乏全局视角而难以满足跨服务追踪需求。本文通过一个电商系统的案例,介绍如何在Spring Boot应用中手动实现日志链路追踪,提升调试效率。我们生成并传递唯一追踪ID,确保日志记录包含该ID,即使日志分散也能串联。示例代码展示了使用过滤器设置追踪ID,并在日志记录及配置中自动包含该ID。这种方法不仅简化了问题定位,还具有良好的扩展性,适用于各种基于Spring Boot的微服务架构。
52 3
|
6月前
|
缓存 自然语言处理 前端开发
第一章 引言-HTTP协议基础概念和前后端分离架构请求交互概述
第一章 引言-HTTP协议基础概念和前后端分离架构请求交互概述
144 0
|
4月前
|
存储 关系型数据库 Serverless
函数计算产品使用问题之连外部数据库请求特别慢是什么原因导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
245 7
|
5月前
网络编程中的互联网协议 , IP地址 , 域名 , 端口 , 架构 , 网页数据请求 , 响应码
网络编程中的互联网协议 , IP地址 , 域名 , 端口 , 架构 , 网页数据请求 , 响应码
|
5月前
|
SQL 分布式计算 MaxCompute
MaxCompute操作报错合集之通过UDF(用户定义函数)请求外部数据库资源并遇到报错,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
254 0
|
5月前
|
XML 前端开发 JavaScript
后端请求响应和分层解耦web开发的三层架构
后端请求响应和分层解耦web开发的三层架构
39 0
|
6月前
|
存储 消息中间件 Java
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的高可靠消息服务设计实现
在深入研究了 **“【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现”** 设计实现后,我们意识到,尽管API网关为服务商提供了高效的数据获取手段,但实时数据的获取仍然是一个亟待解决的问题。
101 1
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的高可靠消息服务设计实现
下一篇
无影云桌面