Apache ShardingSphere 在转转亿级交易系统落地实践

2023-11-23 05:18

本文主要是介绍Apache ShardingSphere 在转转亿级交易系统落地实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

、背景与挑战

这几年随着转转二手业务的快速发展,订单系统的基础性能问题也愈发严重,作为系统运转的基石,订单库压力不容小觑。

面临的问题:

  • 大促期间 DB 压力大,单库查询 qps 上万占用大量数据库资源,写性能大大降低;

  • 数据与日剧增,单库中包含非常多数据量过数亿的大表,占用空间接近服务器的容量上限;

  • 数据量太大,数据备份和恢复需要耗费很长时间,极端情况下丢失数据的风险越高。

二、为什么选 ShardingSphere

迫于上述所说的 DB 压力问题,起初我们做了一些缓解措施,其中包括:

  • 优化大事务,缩小事务范围,甚至消除事务

33da38dedfbae0b0e88ae19eff0a6d3f.png

通过调整原有业务逻辑顺序将核心的生单步骤放置在最后,仅在订单主表保持事务,主表操作异常时其他订单相关的表允许有脏数据产生。

  • 订单数据添加缓存

1fb41391173d061802af41bee2c02dec.png

缓存这块最重要同时最麻烦的地方是保证数据的一致性,订单信息涉及结算抽佣等,数据的不实时或不一致会造成严重事故。

严格保证缓存数据的一致性,代码实现比较复杂同时会降低系统的并发,因此缓存方案实现这块我们做了一定的妥协:
  1. 允许数据缓存失败情况下请求直接查库;
  2. 给缓存 key 添加版本号,通过读最新版本号的数据确保数据的实时性。

  • 复杂查询走 ES、主从分离、一些大表进行冷热数据分离等

e03558f8022468c96e18e631a7715d68.png

通过上述几个方面的优化 DB 压力虽有所下降,但面对大促等一些高并发场景时仍显得力不从心。为了从根本上解决订单库的性能问题,我们决定对订单库进行数据分片(分库分表)改造,使得未来 3-5 年内不需要担心订单容量问题。

数据分片组件选型这块,我们从效率、稳定性、学习成本和时间多个方面对比,最终选择了 ShardingSphere。

ShardingSphere 优势如下:

  • 提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、容器、云原生等各种多样化的应用场景;

  • 分片策略灵活,支持多种分片方式;

  • 集成方便、业务侵入程度低;

  • 文档丰富、社区活跃。

ShardingSphere 提出 DB Plus 的理念,采用可插拔的架构设计,模块相互独立,可以单独使用,亦可以灵活组合使用。目前 ShardingSphere 由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。

3 款产品特性对比如下:

6c86e547b158bb043bb4ae321e2a9cb0.png

通过上图对比,结合订单高并发特性,本次数据分片中间件选择了 ShardingSphere-JDBC。

ShardingSphere-JDBC 定位为轻量级 Java 框架,在 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

0b1541b0256b5cfeab4541e585112b55.png

随着 5.x 版本的发布,ShardingSphere 还提供了许多新特性:

  1. 全新 distsql 用于加载及展示 shardingsphere 配置信息

  2. 支持跨不同数据库实例的分片 join sql 查询

  3. 增加数据网关能力,支持异构数据库存储

  4. 支持在线动态创建及修改用户权限

  5. 新增自动化探针模块

三、项目落地中的关键点

  • 分片 key 的选择

当前订单 id 的生成,采用了时间戳+用户标识码+机器码+递增序列的方式,其中用户标识码取自买家 id 的第 9~16 位,该码是用户 id 生成时的真随机位,很适合作为分片 key。

  • 选择该用户标识码作为分片 key 有如下优势:

    • 可以使分到各个库表的数据尽可能均匀;

    • 无论是以订单 id、还是以买家 id 作为查询条件,都可以快速定位到具体分片位置;

    • 同一买家的数据能分布到相同的库表,方便买家维度的聚合查询。

98b4a9582ff2ea29234c5765163b39e1.png

具体分片策略上:我们采用了 16 库 16 表,用户标识码取模分库,用户标识码高四位取模分表。

  • 新老库数据迁移

    • 迁移必须是在线的,不考虑停机迁移,迁移的过程中还会有数据的写入;

    • 数据应该是完整的,C 端体验是无感知的,迁移之后需要保证新库和旧库的数据是严格一致的;

    • 迁移过程中需要做到可以回滚,一旦迁移过程中出现问题,可以立即回滚到源库,不会对系统可用性造成影响。

  数据迁移步骤如下:双写->迁移历史数据->校验->老库下线。

四、效果&收益

  • 解决了单库容量上限问题;

  • 数据分片后单库表的数据量大大减少,单表数据量由原来的近亿降为百万级别,总体性能大大提高;

  • 降低了因单库、单表数据过大极端情况数据丢失风险,减轻运维压力。

以下是两次大促期间,下单服务接口调用量与接口耗时对比。

改造前:

c4b8f9e5e2bde4aea55e74eefaa439cd.png

改造后:

9dc439c149f30c50aadcbf8957a8ffc0.png

五、总结感悟

任何公司的“分库分表项目”说白了,都不是一个考验点子思路的常见项目,更多的反而是对一个人、一个团队干活的细致程度、上下游部门的沟通协作、工程化的操作实施以及抗压能力的综合考验。

同时业务的不断发展,又促使系统数据架构需要跟着不断升级,ShardingSphere 以其良好的架构设计、高度灵活、可插拔和可扩展的能力简化了数据分片的开发难度,使研发团队只需关注业务本身,进而实现了数据架构的灵活扩展。

附,最终技术方案目录:

2ae871a49e13982704ef60e60d45b0b1.png
作者简介

张强,转转交易中台研发工程师

这篇关于Apache ShardingSphere 在转转亿级交易系统落地实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415609

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识