京东白条使用 Apache ShardingSphere 解决了千亿数据存储和扩容的问题,为大促活动奠定了基础。
2014 年初,“京东白条”作为业内互联网信用支付产品,数据量爆发式的增长,每一次大促备战都是对技术人员的考验,每一次的战略转型驱动着数据架构的成长。
--张栋芳,京东白条研发负责人

京东白条数据架构演进史

自 2014 年 2 月京东白条业务上线起,为满足快速发展的业务和激增的海量数据,白条的数据架构经历了数次演进。
  • 2014~2015
Solr + HBase 的方案解决了核心、非核心业务系统对关键数据库的访问问题,Solr 作为被检索字段的索引,HBase 用作全量的数据存储。
  • 通过 Solr 集群分担部分读和写的业务,缓解核心库的压力;
  • Solr 扩展体验上欠佳,对业务也存在较大的入侵。
 
  • 2015~2016
引入 NoSQL 方案,业务数据以月份进行分表存储在 MongoDB 集群中,阶段性满足了结算处理场景中海量数据导入导出的需求。
  • 查询热点数据效率高,非结构化的存储方式易于修改表结构;
  • 依然面对着扩展差、对业务入侵强的局面,而且耗内存。
 
  • 2016~2017
随着业务快速发展,数据量突破百亿大关,此时 MongoDB 面临着容量和性能的双重考验。京东白条大数据平台通过 DBRep 以 MySQL Slave 的形式采集变动信息并存储到消息中心,最后落盘到 ES 和 HBase 中。
  • 该方案具有较强的数据实时性,扩展性良好;
  • 基于业务框架的数据分片难以降低代码维护成本。
白条数据架构的演进间接地反应了互联网消费金融的飞速发展,也说明了每一种解决方案在不同背景下都有不同的保质期。

迫在眉睫的架构解耦

为保证业务系统在数据激增情况下始终能保持高效运行,技术团队在设计初期使用了数据分片数据架构,发挥极致性能的同时也兼顾代码的可控性,采用基于应用框架的数据拆分方案完成了数据拆分工作。
 
但随着产品升级迭代,早期的解决方案演变成为了眼前的问题,通过业务框架实现的数据分片方案导致业务代码复杂度增加、维护成本不断攀升,紧耦合的弊端原形毕露,应用每次升级都需要投入较多的精力对分片做相应调整,研发人员难以专注于业务本身。
 
面对如上问题,技术团队经权衡后开始考虑使用成熟的分库分表组件来承担这部分工作,让业务系统升级和架构调整不再复杂。基于自研框架分片和基于 ShardingSphere 分片的对比如下:
 
基于自研框架分片
基于 ShardingSphere 分片
性能
代码耦合度
业务入侵程度
升级难度
扩展性
一般
良好
 
下一阶段工作,解耦。
显然京东白条数据架构将迎来一个新的阶段,解耦的驱动力可以概括如下 3 方面:
  • 聚焦精力:将基于架构的数据库拆分,交给分表组件实现,研发精力需聚焦于业务本身;
  • 简化升级:解耦技术架构,简化业务系统升级工作的研发流程;
  • 规划未来:为系统提供良好的扩展能力,从容应对“618”和“11. 11”等活动。
京东白条业务体量巨大,是名副其实的金融级高并发、海量数据的业务场景,因此分库分表组件应具有以下特点:
1. 产品成熟稳定
 
2. 极致性能表现
 
3. 处理海量数据
 
4. 架构灵活扩展

Apache ShardingSphere 解决方案

ShardingSphere-JDBC 是 Apache ShardingSphere 的第一款产品,它定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
 
ShardingSphere-JDBC 的以下特点能够很好地满足白条业务场景:
  • 产品成熟:经数年打磨产品成熟度高,且社区活跃;
  • 性能良好:微内核、轻量化的设计,性能损耗极小;
  • 改造量小:支持原生的 MySQL 协议,研发工作量小;
  • 扩展灵活:搭配使用迁移同步组件轻松实现数据扩展。
 
经内部大量系统性验证之后,Apache ShardingSphere 成为了京东白条数据分片中间件的首选方案,2018 年底正式开始对接。

产品适配

为能全面支撑白条业务、提供更好的业务体验,Apache ShardingSphere 在京东白条业务落地过程中对产品的功能和性能方面进行了更多的支持和提升,产品再一次经历典型案例的打磨。
  • 升级 SQL 引擎

白条的业务逻辑非常复杂且庞大,多样化场景的需求对 SQL 的兼容程度有着较高要求,Apache ShardingSphere 重构了 SQL 解析模块,并支持了更多的 SQL。

  1. 路由至单数据节点 ,SQL 100% 兼容;
  2. 路由至多数据节点,可全面支持 DML、DDL、DCL、TCL 和部分 DAL。支持分页、去重、排序、分组、聚合、关联查询。
  • 分布式主键
Apache ShardingSphere 提供了内置的分布式主键生成器,例如 UUID、SNOWFLAKE 等分布式主键生成器。同时 Apache ShardingSphere 提供了分布式主键生成器的接口,用户可自定义自增主键生成算法来满足特殊场景的需求。
  • 业务分片键值注入
对于没有分片条件的 SQL,Apache ShardingSphere 使用 ThreadLocal 管理分片键值,通过编程的方式向 HintManager 中添加分片条件,该分片条件仅在当前线程内生效,实现了 SQL 零侵入。
除了对功能上的增强,Apache ShardingSphere 为满足京东白条业务严苛的性能要求,同时做了多方面调优。
  • SQL 解析结果缓存
  • JDBC 元数据信息缓存
  • Bind 表 & 广播表的使用
  • 自动化执行引擎 & 流式归并
经两团队通力合作,京东白条业务与 Apache ShardingSphere 相结合的各项指标满足预期,性能与原生 JDBC 几乎一致。
关于对接过程中的问题详情及方案,请通过《Apache ShardingSphere 对接京东白条实战》一文来了解。

业务割接

Apache ShardingSphere 使用定制化 HASH 策略对数据进行分片,有效避免了热点数据问题,拆分后的数据节点数达近万个整个割接过程大约持续了 4 周左右的时间。
 
1. DBRep 读取数据,通过 Apache ShardingSphere 将数据同步至目标数据库集群;
 
2. 两套集群并行运行,数据迁移后再使用自研工具对业务和数据进行校验。
 
DBRep 是 ShardingSphere-Scaling 产品设计的基石,Scaling 具备的自动化能力为后续的迁移扩容工作提供了更多的便利。

Apache ShardingSphere 带来的收益

  • 简化升级路径
通过架构解耦,业务系统升级所涉及技术栈得到有效缩短,研发团队不再需要关注分表设计,精力全部聚焦于业务本身,升级路径得到大幅度优化;
  • 节省研发力量
引入成熟的 Apache ShardingSphere 无需重新开发分表组件,在简化业务升级路径的基础上节省了大量研发力量;
  • 架构灵活扩展
搭配使用 Scaling 同步迁移组件从容面对“618”和“11.11”等大型活动,系统灵活扩容。

写在最后

京东白条业务的快速增长驱动着数据架构不断升级,本次架构演进通过引入 Apache ShardingSphere 助力白条架构解耦,简化了系统升级路径,使研发团队只需关注业务本身,同时也实现了数据架构的灵活扩展,在消费金融场景开启了良好的开端。
 
互联网信用消费模式发展逐步多样化,未来 Apache ShardingSphere 将与京东展开更多业务场景的实践和探索,通过推动金融科技创新发展,进一步提升互联网金融的创新速度和效率。

ShardingSphere 作为 Apache 基金会下的顶级开源项目,在 GitHub 上获得了超 14K Star 的关注,已成为行业内受欢迎的开源项目,全球有超过 170 家企业用户登记使用,覆盖金融、电子商务、云服务、旅游、物流、教育、文娱等多个领域。
 
* 欢迎更多技术团队约稿投稿,和大家分享使用 ShardingSphere 的经验思考。对案例感兴趣的伙伴可联系社区经理(ss_assistant_1)或扫描下方二维码回复“加群”进入技术交流群。

加入交流群

 

Apache ShardingSphere 在京东白条场景的落地之旅的更多相关文章

  1. 重磅|Apache ShardingSphere 5.0.0 即将正式发布

    Apache ShardingSphere 5.0.0 GA 版在经历 5.0.0-alpha 及 5.0.0-beta 接近两年时间的研发和打磨,终于将在 11 月份与大家正式见面! 11 月 10 ...

  2. Apache Sharding-Sphere

    Sharding-Sphere 正式步入 Apache 基金会孵化器 - 开源中国 https://www.oschina.net/news/101691/sharding-sphere-enter- ...

  3. Apache ShardingSphere:由开源驱动的分布式数据库中间件生态

    2021 年 7 月 21 日 2021 亚马逊云科技中国峰会现场,SphereEx 联合创始人.Apache ShardingSphere PMC 潘娟受邀参与此次峰会,以<Apache Sh ...

  4. Apache ShardingSphere 元数据加载剖析

    唐国城 小米软件工程师,主要负责 MIUI 浏览器服务端研发工作.热爱开源,热爱技术,喜欢探索,热衷于研究学习各种开源中间件,很高兴能参与到 ShardingSphere 社区建设中,希望在社区中努力 ...

  5. DistSQL:像数据库一样使用 Apache ShardingSphere

    Apache ShardingSphere 5.0.0-beta 深度解析的第一篇文章和大家一起重温了 ShardingSphere 的内核原理,并详细阐述了此版本在内核层面,特别是 SQL 能力方面 ...

  6. SQL 居然还能在 Apache ShardingSphere 上实现这些功能?

    在去年 10 月 5.0.0-alpha 版本发布之后,Apache ShardingSphere 经历了长达 8 个多月的持续开发与优化,终于在 6 月 25 日正式迎来了 5.0.0-beta 版 ...

  7. Apache ShardingSphere 5.0.0 内核优化及升级指南

    经过近两年时间的优化和打磨,Apache ShardingSphere 5.0.0 GA 版终于在本月正式发布,相比于 4.1.1 GA 版,5.0.0 GA 版在内核层面进行了大量的优化.首先,基于 ...

  8. Apache ShardingSphere 5.1.2 发布|全新驱动 API + 云原生部署,打造高性能数据网关

    在 Apache ShardingSphere 5.1.1 发布后,ShardingSphere 合并了来自全球的团队或个人的累计 1028 个 PR,为大家带来 5.1.2 新版本.该版本在功能.性 ...

  9. Apache ShardingSphere 邀您相约 Open Source Day

    Apache ShardingSphere 很荣幸接受 AnitaB.org 的邀请参加 OpenSourceDay Summer 2021 活动. Open Source Day (OSD) 是一个 ...

随机推荐

  1. new一个对象的时候,实际做了些什么

    当我们说new一个对象的时候,实际做了些什么, 可以参考下图理解

  2. a、b、n为正整数且a>b,证明:若n|(a^n-b^n),则n|(a^n-b^n)/(a-b).

  3. Java同步之线程池详解

    带着问题阅读 1.什么是池化,池化能带来什么好处 2.如何设计一个资源池 3.Java的线程池如何使用,Java提供了哪些内置线程池 4.线程池使用有哪些注意事项 池化技术 池化思想介绍 池化思想是将 ...

  4. MySQL-表迁移工具的选型-xtrabackup的使用

    1.1. 场景 有的时候test人员可能需要在测试库上比较新的数据,这时候只能是从生产库上面去那了.如果是小表还好实用mysqldump/mysqlpump就可以轻松的解决.但是,如果遇到了大表这将是 ...

  5. linux centos7 “git clone https://github.com/XXXXX” 报错解决方法

    2021-08-04 1. 问题描述 在执行以下命令时出现错误"正克隆到 'XXXXX'... fatal: unable to access 'https://github.com/lag ...

  6. K8s 系列(三) - 如何配置 etcd https 证书?

    在 K8s 中,kube-apiserver 使用 etcd 对 REST object 资源进行持久化存储,本文介绍如何配置生成自签 https 证书,搭建 etcd 集群给 apiserver 使 ...

  7. noip模拟38

    \(\color{white}{\mathbb{深秋总有廖落处,雁归每是菊败时,名之以:残菊}}\) 这场比赛几乎全场都在打暴力,几乎人均切掉的 \(t1\) 没有想到双指针,\(t3\) 的暴力也没 ...

  8. Python - 面向对象编程 - __str__()

    为什么要讲 __str__ 在 Python 中,直接 print 一个实例对象,默认是输出这个对象由哪个类创建的对象,以及在内存中的地址(十六进制表示) 假设在开发调试过程中,希望使用 print ...

  9. Python - 执行cmd命令

    python操作cmd 我们通常可以使用os模块的命令进行执行cmd 方法一:os.system os.system(执行的命令) # 源码 def system(*args, **kwargs): ...

  10. 样式和模板快速入门Style,Template

    http://www.cnblogs.com/jv9/archive/2010/04/14/1711520.html 样式(Style)和模板(Template)的定义 在Silverlight中,样 ...