易仓跨境SaaS云原生数据库架构演进:PolarDB实践(一)

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 本文将介绍易仓跨境SaaS云原生数据库架构演进过程,并分享PolarDB MySQL引擎在易仓跨境SaaS实践经验。

本文将介绍易仓跨境SaaS云原生数据库架构演进过程,并分享PolarDB MySQL引擎在易仓跨境SaaS实践经验。


作者介绍:

程涵,高级DBA,主要负责易仓SaaS数据库架构设计,监控设计优化,性能调优以及新技术预研工作。


SaaS(Software as a Service,软件即服务)是指软件厂商将应用统一部署在其服务器上,客户根据实际需要向厂商订购及支付费用,并通过互联网最终获得服务的模式。相比于传统软件,SaaS最大的特点在于其多租户架构,包括容器、数据库等服务,对多租户的资源复用能够有效降低开发和运维成本,实现持续快速的升级迭代。早期SaaS软件服务商一般会使用Oracle或者SQLServer比较多,但因为生态、人才、成本的原因,国内厂商趋势慢慢转向MySQL及MySQL生态兼容的数据库。除了数据库选型外,还有一个必须要谨慎考虑的问题是,怎么隔离租户数据?早期一般采用按字段区分租户,所有的租户共享一套库表结构,数据隔离性会比较差,租户数据拆分困难,所以头部SaaS厂商慢慢转向按库分租户,每个租户一套表结构,并期望单实例可以支持更多租户,降低租户资源成本,同时实现更好的租户资源隔离,所以单实例往往会有几百上千租户,单实例要支持数百万表。


01 SaaS场景海量表


对于小租户,为了给租户提供更好的数据隔离性,易仓采用的是按库分租户的模式,数百租户共享一个MySQL数据库实例,单实例会有数百万张表,这对数据库是一个巨大的挑战。在MySQL实例海量表场景下,数据库实例在版本升级,参数变更,或者故障时,需要快速重启数据库恢复服务,但由于表结构太多,MySQL实例启动过程中,需要加载所有表文件,读取文件头页获取文件的meta数据,当表数百万时,表文件也有数百万,要读取的文件太多,每个头文件一次IO,重启时长甚至会长达数十分钟,对业务影响会非常大。另外,在海量表场景,热点表数量也会相应陡增,不仅系统要支持更大句柄数,而且需要更多内存资源缓存热点表的元数据和表文件句柄信息,DBA需要结合业务场景,不断优化参数来提升数据库性能。


以我们重点优化的两个场景为例:

首先,针对易仓跨境SaaS单实例数百万表单场景,易仓运维团队联合PolarDB MySQL团队做了专项快速重启优化,将表的文件meta数据下沉到⽂件系统superblock,一次IO可读大批量文件的meta,bypass所有的⽂件操作,单实例100万表的重启时间提速到30 ~ 60s,200万张可以控制在120秒内。重启时间大幅缩减到原来的1/10,大幅降低实例重启时的服务中断时间,保障易仓跨境SaaS服务可以提供高水平可用性。


image.png


其次,针对易仓跨境SaaS海量表场景,热点表徒增的问题,使用PolarDB默认参数配置,往往不能同时满足性能和稳定的要求。我们对部分核心参数进行了调优:


  • 调大参数open_definition_cache和open_table_cache,缓存更多热点表的元数据,提高打开表的效率,同时适当调低参数innodb_buffer_pool_size,让出一些内存给到open_definition_cache和open_table_cache,使得数据库的性能达到一个性能比较均衡状态。
  • 调大参数table_open_cache_instances,那么实例会创建更多open_table_cache对象,相当于增加了锁的分桶数目,降低了锁的粒度,减少高并发时锁冲突的等待时间,提升PolarDB数据库性能。


下表是我们跨境ERP在实践过程中,形成的一个PolarDB参数配置最佳实践。


image.png


02 快速DDL+并发控制


在SaaS场景多租户架构背景下,我们数百小租户共享一个数据实例,按库分租户,每个库一套相同的表。由于业务快速发展,版本迭代变更频繁,经常要给表加索引,给表新增、修改字段,删除表,truncate表数据等操作,这种一般都是由系统自动批量下发数据库,一次数百个DDL操作。


官方MySQL的实现里,很多DDL操作都是有锁变更,DDL会对表加MDL锁,会长时间堵塞数据库影响业务运行,导致业务变更效率太低,耗时不可控。其次针对很多涉及到数据拷贝的DDL操作,如建索引,修改主键等,MySQL的原生实现都是单线程穿行,对一些大表往往耗费数小时甚至数天的时间,进而导致失败概率高对业务的影响时间也长。


PolarDB MySQL支持Parallel DDL,利用并行 scan/build Index,和深度优化的并行merge sort,可以帮助我们大幅度提升加索引效率,将DDL的速度提升了10倍,极大的减小了发版变更对业务影响的时间窗口,进而减轻了运维团度的工作量。


image.png


另外,还有一个一直困扰我们的问题,怎样可以快速对表新增、修改和删除字段?在多租户架构下,虽然可能只能对一张表新增一个字段,但乘以租户数,DDL的数量动辄达到数百个,所以我们十分需要数据库支持快速DDL。上线PolarDB MySQL引擎后,现在可以秒级新增表字段,而且PolarDB即将推出秒级修改和删除字段的能力,在变更操作时只需修改表定义信息,无需修改底层数据,非常适合我们这种按库分租户的SaaS场景。


--使用秒级加字段功能,ddl操作加上algorithm=instant即可

alter table test.t add column test_column int, algorithm=instant;


下面对一张47亿行数据的表操作增加列,耗时仅0.02秒:


image.png


我们使用了PolarDB秒级加字段后,由于涉及到表元数据变更,还是会有短暂的MDL锁。这在PolarDB实例负载过高的情况下,对数据库实例中所有库一起加字段或者做其它DDL操作,还是可能会堵塞实例,所以我们希望可以分批次操作。基于PolarDB提供的语句并发控制CCL(Concurrency Control)功能,可以控制语句的并发数,避免堵塞数据库。比如,系统一次下发300个alter表语句,可以通过CCL限制一次并发执行30个,分10次执行,这块可以保证不会阻塞数据库实例。


  • 增加ccl规则

-- 限制表名为ec_product的alter语句,每次只能并发执行10个

dbms_ccl.add_ccl_rule('alter','','ec_product', '10', '');


• 查看ccl规则

dbms_ccl.show_ccl_rule(); -- 显示当前正在生效的限流规则


image.png


• 删除ccl规则


dbms_ccl.del_ccl_rule(75792); -- 删除编号为75792的限流


03 大量短连接优化

易仓应用开发语言主要是PHP,应用层面没有使用连接池,在数据库中会产生大量短连接。对每一个短连接,传统上MySQL都会创建一个独立的线程来响应请求。当MySQL数据库有大量的连接存在时,会出现频繁线程切换消耗CPU导致性能下降。同时大量的系统线程调度和缓存失效,也会导致数据库性能急剧下降。所以,我们期望数据库内核层面可以提升处理效率,在大量短链接场景保证性能不下降。

经过调研和测试,在应用端存在PHP大量短连接的场景,我们选择使用了PolarDB数据库代理层面自带事务级连接池功能,其大幅减少了短连接场景下频繁创建短连接给数据库带来的负载。PolarDB开启事务级连接池后,当客户端发送请求时,会先与PolarDB代理建连,代理不会马上将其与后端数据库建连,而是先从事务级连接池里查找是否存在可用的连接(库名、用户名、客户端IP三要素可以链接复用)。若不存在,代理会与数据库创建一个新连接;若存在,则从连接池里直接拿出并使用,并在当前事务结束后将该连接放回事务级连接池,方便下个请求继续使用。数据库层面支持连接复用,可以无缝地解决我们PHP大量短连接场景遇到的问题,业务无需做任何代码调整,极大的降低了业务开发成本。


image.png


04 计算快弹 + 存储按量付费

易仓主要做跨境电商业务,租户(卖家)会经常搞大促,特别在黑5、双11等节日,业务流量会徒增,MySQL数据库计算资源存储需要支持快速扩容,应对业务洪峰。租户业务也有生命周期,当租户停用下线时,如果数据库存储资源不能自动回收,会导致存储资源浪费,增加资源成本。传统上面对这种问题,一般通过迁移新实例或合并实例方式来回收存储资源,但耗时太长,运维成本会比较高。

PolarDB MySQL采用存储和计算分离的架构,所有计算节点共享一份数据,扩容时不需要迁移底层数据,增减节点可以在分钟级完成,可以满足我们跨境电商大促时,快速升配的需求。PolarDB存储采用分布式块存储设计和文件系统,使得存储容量不限制于单节点的规格,扩展比较容易,可以支持100TB级别的数据规模,我们不用担心会有存储容量瓶颈。而且存储空间无需手动配置,根据数据量自动伸缩,按实际使用量计费。租户停用下线清理后,存储会自动回收,节约资源成本。

基于共享存储架构的数据库完美解决了传统本地盘部署时,DBA需要面对的扩缩容及容量管理的挑战。极大降低了运维负担。

image.png


结语

一直以来,我们也有尝试各种类型的数据库,期望可以解决易仓在跨境SaaS遇到的独特问题和挑战。从早期自建MySQL,然后到RDS,再到TiDB…,中间我们也踩过很多坑,但一直没有找到一个完美的解决方案。

直到最后使用了PolarDB, 因为PolarDB在海量表支持、计算存储资源快速弹性伸缩、快速稳定DDL、海量短链接支持等方面的能力,完美的解决了我们SaaS场景遇到的各种极端问题。最终我们的业务在PolarDB的支持下持续稳定的进行迭代,更好的服务了我们的客户!

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
Cloud Native 关系型数据库 分布式数据库
让PolarDB更了解您--PolarDB云原生数据库核心功能体验馆
让PolarDB更了解您——PolarDB云原生数据库核心功能体验馆,由阿里云数据库产品事业部负责人宋震分享。内容涵盖PolarDB技术布局、开源进展及体验馆三大部分。技术布局包括云计算加速数据库演进、数据处理需求带来的变革、软硬协同优化等;开源部分介绍了兼容MySQL和PostgreSQL的两款产品;体验馆则通过实际操作让用户直观感受Serverless、无感切换、SQL2Map等功能。
197 7
|
19天前
|
Cloud Native 关系型数据库 分布式数据库
PolarDB开源:云原生数据库的新篇章
阿里云自研的云原生数据库PolarDB于2023年5月正式开源,采用“存储计算分离”架构,具备高性能、高可用及全面兼容性。其开源版本提供企业级数据库解决方案,支持MySQL、PostgreSQL和Oracle语法,适用于高并发OLTP、核心业务系统等场景。PolarDB通过开放治理与开发者工具构建完整生态,并展望更丰富的插件功能与AI集成,为中国云原生数据库技术发展贡献重要力量。
130 17
|
2月前
|
运维 供应链 前端开发
中小医院云HIS系统源码,系统融合HIS与EMR功能,采用B/S架构与SaaS模式,快速交付并简化运维
这是一套专为中小医院和乡镇卫生院设计的云HIS系统源码,基于云端部署,采用B/S架构与SaaS模式,快速交付并简化运维。系统融合HIS与EMR功能,涵盖门诊挂号、预约管理、一体化电子病历、医生护士工作站、收费财务、药品进销存及统计分析等模块。技术栈包括前端Angular+Nginx,后端Java+Spring系列框架,数据库使用MySQL+MyCat。该系统实现患者管理、医嘱处理、费用结算、药品管控等核心业务全流程数字化,助力医疗机构提升效率和服务质量。
148 4
|
2月前
|
关系型数据库 测试技术 分布式数据库
刷新世界纪录!阿里云PolarDB凭借创新的「三层解耦」架构刷新TPC-C基准测试世界纪录
刷新世界纪录!阿里云PolarDB凭借创新的「三层解耦」架构刷新TPC-C基准测试世界纪录
|
3月前
|
存储 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 1 架构解读
PolarDB 是阿里云研发的云原生分布式数据库,基于 PostgreSQL 开源版本,旨在解决传统数据库在大规模数据和高并发场景下的性能和扩展性问题。其主要特点包括: 1. **存储计算分离架构**:通过将计算与存储分离,实现极致弹性、共享一份数据以降低成本、透明读写分离。 2. **HTAP 架构**:支持混合事务处理和分析处理(HTAP),能够在同一系统中高效执行 OLTP 和 OLAP 查询。 3. **优化的日志复制机制**:采用只复制元数据的方式减少网络传输量,优化页面回放和 DDL 锁回放过程。 4. **并行查询与索引创建**:引入 MPP 分布式执行引擎。
193 8
|
4月前
|
运维 关系型数据库 分布式数据库
阿里云PolarDB:引领云原生数据库创新发展
阿里云PolarDB引领云原生数据库创新,2024云栖大会将分享其最新发展及在游戏行业的应用。PolarDB凭借弹性、高可用性、多写技术等优势,支持全球80多个站点,服务1万多家企业。特别是针对游戏行业,PolarDB助力Funplus等公司实现高效运维、成本优化和业务扩展。通过云原生能力,PolarDB推动游戏业务的全球化部署与快速响应,提升用户体验并保障数据安全。未来,PolarDB将继续探索AI、多云管理等前沿技术,为用户提供更智能的数据基础设施。
141 2
|
4月前
|
存储 关系型数据库 分布式数据库
[PolarDB实操课] 01.PolarDB分布式版架构介绍
《PolarDB实操课》之“PolarDB分布式版架构介绍”由阿里云架构师王江颖主讲。课程涵盖PolarDB-X的分布式架构、典型业务场景(如实时交易、海量数据存储等)、分布式焦点问题(如业务连续性、一致性保障等)及技术架构详解。PolarDB-X基于Share-Nothing架构,支持HTAP能力,具备高可用性和容错性,适用于多种分布式改造和迁移场景。课程链接:[https://developer.aliyun.com/live/253957](https://developer.aliyun.com/live/253957)。更多内容可访问阿里云培训中心。
122 0
[PolarDB实操课] 01.PolarDB分布式版架构介绍
|
9月前
|
存储 Cloud Native 关系型数据库
PolarDB 高可用架构设计与实践
【8月更文第27天】 在现代互联网应用中,数据库作为核心的数据存储层,其稳定性和可靠性尤为重要。阿里云的 PolarDB 作为一款云原生的关系型数据库服务,提供了高可用、高性能和自动化的特性,适用于各种规模的应用。本文将详细介绍 PolarDB 的高可用架构设计,并探讨其实现数据安全性和业务连续性的关键技术。
282 0
|
5月前
|
运维 监控 Cloud Native
云原生之运维监控实践:使用 taosKeeper 与 TDinsight 实现对 时序数据库TDengine 服务的监测告警
在数字化转型的过程中,监控与告警功能的优化对保障系统的稳定运行至关重要。本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品之一,详细介绍了如何利用 TDengine、taosKeeper 和 TDinsight 实现对 TDengine 服务的状态监控与告警功能。作者通过容器化安装 TDengine 和 Grafana,演示了如何配置 Grafana 数据源、导入 TDinsight 仪表板、以及如何设置告警规则和通知策略。欢迎大家阅读。
174 0
|
6月前
|
存储 Cloud Native NoSQL
云原生时代的数据库选型与架构设计
云原生时代的数据库选型与架构设计
89 0

相关产品

  • 云原生数据库 PolarDB