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

标签: apache shardingsphere 转转 | 发表时间:2022-12-29 17:02 | 作者:转转技术团队
出处:https://juejin.cn/backend

一、背景与挑战

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

  • 大促期间DB压力大,单库查询qps上万占用大量数据库资源,写性能大大降低;
  • 数据与日剧增,单库中包含非常多数据量过数亿的大表,占用空间接近服务器的容量上限;
  • 数据量太大,数据备份和恢复需要耗费很长时间,极端情况下丢失数据的风险越高。

二、为什么选ShardingSphere

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

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

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

  • 订单数据添加缓存

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

    严格保证缓存数据的一致性,代码实现比较复杂同时会降低系统的并发,因此缓存方案实现这块我们做了一定的妥协:

  1. 允许数据缓存失败情况下请求直接查库;
  2. 给缓存key添加版本号,通过读最新版本号的数据确保数据的实时性。
  • 复杂查询走ES、主从分离、一些大表进行冷热数据分离等

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

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

ShardingSphere优势如下:

提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景; 分片策略灵活,支持多种分片方式; 集成方便、业务侵入程度低; 文档丰富、社区活跃。 ShardingShpere提出DB Plus的理念,采用可插拔的架构设计,模块相互独立,可以单独使用,亦可以灵活组合使用。目前ShardingSphere 由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 3款产品特性对比如下:

通过上图对比,结合订单高并发特性,本次数据分片中间件选择了ShardingSphere-JDBC。   ShardingSphere-JDBC定位为轻量级 Java 框架,在JDBC层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

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

  1. 全新 distsql 用于加载及展示 shardingsphere配置信息
  2. 支持跨不同数据库实例的分片 join sql 查询
  3. 增加数据网关能力,支持异构数据库存储
  4. 支持在线动态创建及修改用户权限
  5. 新增自动化探针模块

三、项目落地中的关键点

  • 分片key的选择

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

  • 选择该用户标识码作为分片key有如下优势:
  1. 可以使分到各个库表的数据尽可能均匀;
  2. 无论是以订单id、还是以买家id作为查询条件,都可以快速定位到具体分片位置;
  3. 同一买家的数据能分布到相同的库表,方便买家维度的聚合查询。

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

  • 新老库数据迁移
  1. 迁移必须是在线的,不考虑停机迁移,迁移的过程中还会有数据的写入;
  2. 数据应该是完整的,C端体验是无感知的,迁移之后需要保证新库和旧库的数据是严格一致的;
  3. 迁移过程中需要做到可以回滚,一旦迁移过程中出现问题,可以立即回滚到源库,不会对系统可用性造成影响。

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

四、效果&收益

  • 解决了单库容量上限问题;
  • 数据分片后单库表的数据量大大减少,单表数据量由原来的近亿降为百万级别,总体性能大大提高;
  • 降低了因单库、单表数据过大极端情况数据丢失风险,减轻运维压力。 以下是两次大促期间,下单服务接口调用量与接口耗时对比。

改造前:

改造后:

五、总结感悟

任何公司的“分库分表项目”说白了,都不是一个考验点子思路的常见项目,更多的反而是对一个人、一个团队干活的细致程度、上下游部门的沟通协作、工程化的操作实施以及抗压能力的综合考验。 同时业务的不断发展,又促使系统数据架构需要跟着不断升级,ShardingSphere以其良好的架构设计、高度灵活、可插拔和可扩展的能力简化了数据分片的开发难度,使研发团队只需关注业务本身,进而实现了数据架构的灵活扩展。

附,最终技术方案目录:


作者简介

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

转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。`

关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~`

相关 [apache shardingsphere 转转] 推荐:

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

- - 掘金 后端
这几年随着转转二手业务的快速发展,订单系统的基础性能问题也愈发严重,作为系统运转的基石,订单库压力不容小觑. 大促期间DB压力大,单库查询qps上万占用大量数据库资源,写性能大大降低;. 数据与日剧增,单库中包含非常多数据量过数亿的大表,占用空间接近服务器的容量上限;. 数据量太大,数据备份和恢复需要耗费很长时间,极端情况下丢失数据的风险越高.

Apache ShardingSphere:刚柔并济的开源分布式事务解决方案

- - IT瘾-dev
成熟的XA事务管理器非常多,Apache ShardingSphere(Incubating)并未选择重新造轮子,而是寄望于打造一个生态,将合适的轮子有机地整合在一起,提供成熟稳定的分布式事务处理能力. 1.   复用成熟引擎,自动切换底层实现. Sharding-transaction-xa模块进一步定义了面向XA事务管理器开发者的SPI,开发者仅需实现SPI定义的接口,即可自动加入至Apache ShardingSphere(Incubating)生态,作为其XA事务管理器.

[转][转]使用 Apache MINA2 实现 Web 系统的消息中间件

- - heiyeluren的Blog
来源: http://www.ibm.com/developerworks/cn/web/1108_sumeng_mina2/index.html. 本文将介绍如何使用 Apache MINA2(以下简称 MINA2)解决复杂 Web 系统内各子系统之间同步消息中间件的问题. MINA2 为开发高性能和高可用性的网络应用程序提供了非常便利的框架.

ShardingSphere x Seata,一致性更强的分布式数据库中间件

- - IT瘾-dev
日前,分布式数据库中间件 ShardingSphere 将Seata 分布式事务能力进行整合,旨在打造一致性更强的分布式数据库中间件. 数据库领域,分布式事务的实现主要包含:两阶段的 XA 和 BASE 柔性事务. XA 事务底层,依赖于具体的数据库厂商对 XA 两阶段提交协议的支持. 通常,XA 协议通过在 Prepare 和 Commit 阶段进行 2PL(2 阶段锁),保证了分布式事务的 ACID,适用于短事务及非云化环境(云化环境下一次 IO 操作大概需要 20ms,两阶段锁会锁住资源长达 40ms,因此热点行上的事务的 TPS 会降到 25/s 左右,非云化环境通常一次 IO 只需几毫秒,因此锁热点数据的时间相对较低).

Apache Shiro 介绍

- - CSDN博客推荐文章
什么是Apache Shiro?. Apache shiro 是一个强大而灵活的开源安全框架,可清晰地处理身份认证、授权、会话(session)和加密. Apache Shiro最主要的初衷是为了易用和易理解,处理安全问题可能非常复杂甚至非常痛苦,但并非一定要如此. 一个框架应该尽可能地将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码.

Apache Derby Papers

- -
Derby Type System (Note: if your browser shows HTML source for this page instead of displaying it, save the file locally with . It will prompt you to click on "Grant license to ASF for inclusion in ASF works", and this is the permission we need in place to host your contribution on the Derby web site..

Apache防止攻击

- - 小彰
为了防止恶意用户对Apache进行攻击,我们需要安装mod_security这个安全模块. mod_security 1.9.x模块的下载与安装. 下载地址: http://www.modsecurity.org/download/index.html. 建议使用1.9.x,因为2.x的配置指令与1.x完全不同,解压后进入解压目录,执行:.

Apache OpenOffice 3.4发布

- - Solidot
Apache OpenOffice的第一个版本v3.4正式发布. 主要新特性包括:改进ODF支持,包括ODF 1.2加密选项和新电子表格功能;改进Calc组件的数据透视表(Pivot Table)支持;原生支持SVG,增强图形如线帽和剪切变形;简体和繁体中文等原生语言支持;改进性能等. 在甲骨文将OpenOffice.org捐给Apache软件基金会后,OOo的命运曾存在许多争议.

Apache PDFBox 1.8.0 发布

- - 开源中国社区最新新闻
Apache PDFBox 1.8.0 发布了,该版本除了修复大量 bug 之外,还包含如下新特性:. PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具. PDF 文档加密与解密. 与 Lucene搜索引擎的集成. 填充PDF/XFDF表单数据.

Apache Log4j 2.0介绍

- - CSDN博客推荐文章
Apache Log4j 2.0介绍. 作者:chszs,转载需注明. 作者博客主页:http://blog.csdn.net/chszs. Apache Log4j是著名的Java日志框架之一,在早些年应用最广. 但近两年来,随着SLF4J和LogBack的兴起,很多流行的开源框架在日志模块方面逐步转移到SLF4J+LogBack上,Log4j日渐衰落.