京东业务系统数据库分库分表架构设计

news2024/10/8 22:57:14

有幸参与了整个技术方案实施落地,对架构设计及技术细节深入了解,欢迎大家讨论交流!

一元抢宝系统是京东虚拟新兴的一个业务系统,上线以来订单量一直持续增长。在距离618前两个月时,京东商城商品虚拟研发部对系统做了整体预估,订单量快速增长及618大促的到来都将带来单量剧增,届时势必会对数据库容量和负载造成压力。分析结果表明数据库很可能成为影响性能的瓶颈,并决定对数据库底层做分库分表改造,确保数据水平动态扩展能力,满足数据容量持续增长的需求,并提高下单效率。

1. 业务介绍


上图是一元抢宝商品详情页,从图中可以看出,一元抢宝的商品即商品项,其不同于其他京东商品的地方在于:有期次、总人次和剩余人次的概念;假设一个商品项有100个库存,则会分100期次售卖,每期次一个售卖的是一个库存;总人次即设置的每一期抢宝商品价格,假设1000人次,则商品总价是1000元(每人1元);当剩余人次为0时,本期抢宝结束,然后按照相应算法产生抢宝者;然后进行下一期抢宝。

通过技术改造,从整体上来说实现三个目标:1、底层路由策略实现;2、历史数据迁移;3、业务改造。下面详细介绍本次改造的过程。

2. 数据库容器预估

分库分表最重要的是要先做容器预估,依据数据量和业务特性估算出容器/库/表的数量及分库分表规则。

假设一天100万订单,一年则产生3.6亿订单量;假设数据结构是这样的:订单表10个字段,一个字段50个字符;一条订单则需要500字节存储,那么3.6亿订单则需要大约170GB存储空间;假设每台机器存储空间为200GB,则每年增加一台机器即可满足容量需求。而实际需求要根据压测结果来决定;如压测其他一些指标是否满足需求,如QPS、响应时间等。

3. 底层路由策略选择及实现

分库分表路由策略是基础,影响整个系统架构,后期业务需求是否满足和支持,使用是否方便都与此有关。路由策略设计合理,上层业务使用会很方便。一元抢宝项目的路由策略适配和实现是在DAO层实现,对上层业务层透明,可不用关心具体实现,并且路由策略不涉及结构上的改动,对上层不会产生影响。

我们知道常见的分表策略有两种:

hash路由

优点:可实现数据分散,热点分散;

不足:增加数据库节点时,会影响路由策略,需做数据迁移;

分区路由(增量区间路由)

优点:策略支持动态扩容,理论上可无限扩展;

不足:存在数据热点问题,新产生的表,读写频率较高;每次查询需要经过路由策略表。

当然每种策略都不是完美的,只有最适合业务场景的策略才是好的。该项目采用的是两种方式的结合。

首先按抢宝项hash分库,然后按抢宝期区间段分表,如下图所示:

期的路由策略表规则如下:

为什么使用这种策略?

抢宝项是业务上层维度,可以理解为商品,大部分表中都有这个字段;此id生成时是连续的,长期来看,hash分库后数据是均衡的。抢宝期是抢宝项下的一个维度,如一个项库存是100,不停售前提下,会生成100期,在售的期次只有一个。为什么选择期id区间作为分表路由策略呢,有朋友会认为也可以选择订单id,从路由策略上来说,没有问题,但一元抢宝项目的业务场景,有根据项id和期id查询订单参与纪录的场景,所以要考虑通过这两个维度能查到订单。另外,使用区间作为分表策略,可以动态扩展,即使每次查询经过路由表,这点开销可以忽略,而且都是通过缓存加载。

那以上策略,可以路由的维度有哪些呢?

1、通过订单id路由:订单号按照一定规则生成,其存储了库和表的信息,可以根据订单号直接定位到相应的库和表;

2、通过抢宝项id和抢宝期id路由:抢宝项hash定位到库,抢宝期查询路由策略表定位到表,具体图示如下:

4. 聚合查询及聚合数据同步的实现

有分就涉及到聚合查询,我们如何实现呢?先看如下架构图:


上图是数据层改造后的架构图,之前是单表主从模式,改造后为多个分库、基础库。聚合采用了elastic search (以下简称ES)。

为什么使用它呢,首先,简单便捷,容易接入;其次,支持动态扩容分片,对业务层透明等。系统中的聚合查询主要使用了ES,当然我们有很多降级方案,后面会讲到。ES不能当作库来使用,它并不能百分之百保证数据完整性,所以一定要有数据备份,我们使用了聚合表,保存一段时间内的数据,用于降级使用,一旦ES有延迟或集群不可用,就会降级查询聚合表。

同步ES我们是怎么做的呢?我们使用了canal。有的朋友可能说了,为什么不在直接在代码中插入时去同步,可以这样做,但有两个问题,一是同步失败如何处理,如何保证事务,二是与业务代码强耦合,借用术语,不beautify。使用canal,代码解耦,不侵入与代码。它其实是模拟了数据库主从复制机制,伪装为一个从库,当数据库(为不影响主库生产,我们监听的是从库)binlog有变化时,canal监听到,通过解析服务解析过滤binlog,把需要的日志过滤出来。解析后,我们通过发送MQ消息,消息体是表名和主键id,不是整条数据,消费端接到变化的表名和id,实时从库中查询最新数据,同步到ES、聚合表。

为什么通过MQ消息呢?还可以用以上两点来解释,一是消息支持失败重试,存储失败后抛异常,等待下次处理,二是系统间解耦。细心的朋友可以看到,一个消息队列,通过多个消费订阅(可以理解为每个消费者的队列都是镜像复制的)。这样做为了在存储时不相互影响;如果使用一个订阅者处理,存储ES失败,其他两个聚合存储成功,那也要抛异常或其他处理方式,下次消费时,另两个聚合还要存储一次。

以上就是我们聚合和同步聚合的设计。查询时,一部分业务会先查询缓存,不存在再查询ES,如果降级,才会查库,正常的聚合查询都不会查到库。

5. 历史数据迁移

由于我们系统上线时是单库,分库是上线几个月后做的技改,所以数据需要迁移,主要迁移步骤如下:


前半部分,从扫描到同步到分库是新代码,后面canal到同步ES、聚合表都是复用上面逻辑,这样设计,降低我们整体工作量,并且保证数据迁移完整。

具体迁移细节如下:


可以看出,主要分为两部分,停机前和停机后。停机前是迁移历史数据,支持重复迁移;停机后,只迁移增量部分,这样,大大缩短我们的上线时间。停机后只需要迁移很少的数据量。

迁移就涉及到数据校验,校验逻辑整体来说比较简单:


三个维度分别和基础库做对比,如果不同,重新迁移某一天数据。

6. 系统关键节点降级

这一部分也很重要,我们的降级主要有两点,一是canal同步延迟降级,一是ES不可用降级。第一种如下:


如果canal同步延迟,或者从库挂掉,开启开关,扫描主库数据(最近几小时)直接同步到ES、聚合表;这样,即使从库挂掉,也不影响业务数据,这一点很重要,实际业务场景中我们也遇到过。

ES降级,ES不可用时,关闭ES开关,直接查询聚合表。

7. 总结

一个系统从设计到最终完成,依赖于整个团队,每个人的想法、不同思路的碰撞和付出;再有前期合理细致的设计尤为重要,每个时间点和具体上线步骤和回滚方案做好详细计划;另外,就是细致深入测试,测试环境和线上多轮测试和回归,也是正常上线的重要保证。

以上就是京东一元抢宝项目分库分表的主要思想,希望有同样想法的朋友可以深入交流,互相提升系统架构。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot:SpringBoot约定大于配置?②

前言: 这一句话,有些人看过就当看过了,对这句话的解读很多文章我是不满意的,里面蕴含的知识量和信息是极少人关注到的。 基于此,我讲两句。 一、领悟约定大于配置 字面意思:约定的东西要大于配置&a…

Linux中的yum

一、yum介绍 yum是一个基于RPM包(RPM是 Red-Hat Package Manager 红帽软件包管理器的缩写)构建的软件更新机制,能够自动解决软件包之间的依赖关系,解决了日常工作中的大量查找安装依赖包的时间。 二、yum仓库简介 先在yum服务器上创建yum repository(yum仓库),在仓库…

Ranger从入门到精通以及案例实操系列

1、Ranger概述 1.1、什么是Ranger Apache Ranger是一个Hadoop平台上的全方位数据安全管理框架,它可以为整个Hadoop生态系统提供全面的安全管理。 随着企业业务的拓展,企业可能在多用户环境中运行多个工作任务,这就需要一个可以对安全策略进…

Mysql数据库--实现主从复制搭建与同步

Mysql数据库--实现主从复制搭建与同步 🔻 一、mysql 同步复制有关概述⛳ 前言、何为主从复制⛳ 1.1 mysql支持的复制方式⛳ 1.2 mysql支持的复制类型1.2.1🍁异步复制1.2.2🍁同步复制1.2.3🍁半同步复制1.2.4🍁[图解]-异…

Spring高手之路2——深入理解注解驱动配置与XML配置的融合与区别

文章目录 1. 配置类的编写与Bean的注册2. 注解驱动IOC的依赖注入与XML依赖注入对比3. Spring中组件的概念4. 组件注册5. 组件扫描5.1 使用ComponentScan的组件扫描5.2 xml中启用component-scan组件扫描5.3 不使用ComponentScan的组件扫描 6. 组件注册的其他注解7. 将注解驱动的…

MySQL 5.7 主从集群搭建

IP功能Linux版本192.168.56.136MasterCentOS 7.9192.168.56.140SlaveCentOS 7.9 一、安装前的准备 1、卸载老版本 (1)查看是否安装mariadb(centos7默认安装) 命令: rpm -qa | grep mariadb (2&#xff…

嵌入式软件工程师培训:提升技能、实现卓越

如果您对嵌入式培训感兴趣,以下是一些建议和关键点,可以帮助您进行嵌入式培训: 培训目标:明确确定您的嵌入式培训目标。是为了提升员工的技能水平,使他们能够承担更高级别的嵌入式开发工作,还是为了向非嵌入…

16、DMA直接存储区访问

0x01、DMA简介 DMA(Direct Memory Access)一直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以于其他的事情,好像是多线程一样数据传输支持从…

2022 中国开源创新大赛,时序数据库 TDengine 榜上有名

近日,2022 中国互联网发展创新与投资大赛暨 2022 年中国开源创新大赛在北京落下帷幕,本次大赛由中央网信办信息化发展局指导,中国互联网发展基金会、中国网络空间研究院、中国互联网投资基金联合主办。非常荣幸的是,凭借着强大的开…

他们用卫星,让中国量子通信领跑全球

光子盒研究院 上周二(5月30日),中国宣布其神舟十六号飞船与天宫三号空间站成功对接,官方媒体称景海鹏、朱杨柱和桂海潮这三名中国宇航员将有机会研究“新的量子现象”。这意味着中国量子技术发展的一大突破:我们现在可…

IVD体外诊断已经发展成为医疗健康市场活跃领域之一

体外诊断领域的布局覆盖免疫诊断、血液诊断、尿液诊断、生化诊断、微生物诊断等。得益于自主研发驱动下的技术积累和产品创新 近年来,体外诊断已经发展成为医疗健康市场最活跃、增长最快的领域之一。 从全球体外诊断发展来看,据Kalorama Information的统…

接口测试 —— Requests库介绍

1、Requests库 Requests库是用Python语言编写,基于urllib3模块,采用Apache2 Licensed开源协议的 HTTP 库。 虽然Python的标准库中urllib3模块已经包含了平常我们使用的大多数功能,但是它的 API使用起来让人感觉不太友好。而Requests库使用的…

Vue+springboot果蔬有机蔬菜商城销售种植系统与设计

对于网站的前台设计,要保证主界面的整洁有序,能够抓住人的眼球,不会产生视觉疲劳,更重要的是,带给人容易操作的直观感受,这样才能留住用户去进行使用,增加三分热度的延续期。在系统的后台设计上…

2023预备金九银十,400道阿里必问软件测试高频面试考点详细解析

前言 临近秋招,又到了“金九银十”面试求职高峰期,在金九银十时也参与过不少面试,2023都说工作不好找,也是对开发人员的要求变高。前段时间自己有整理了一些软件测试面试常问的高频考点问题做成一份PDF文档(400道高频…

东软、联影、科曼在今届CMEF好猛, “挖挖”背后的共同点

走出三年疫情阴霾,医疗行业迎来爆发式的展会营销盛况。5月14-17日,为期4天的第87届中国国际医疗器械博览会(CMEF)在上海圆满落幕! 在这场32万平方米的全球医疗产业“航母级”盛会中,一众行业大咖、来自120…

优思学院|如何通过实验设计改善产品质量?

你的企业是否经常因为产品和服务不符合客户的期望而感到苦恼?你是否在想有没有一种方法可以在任何时候都可以帮助你解决问题? 那么,您需要一种突破性改进工具,它也是六西格玛项目中的”杀手锏",它称为实验设计&a…

玩转学生信息管理系统——【c++】

设计一个管理系统实现对学生的基本信息(至少包括姓名、学号、性别、出生日期、宿舍号年龄(通过计算得到)的管理;),具有数据的录入、显示、保存、查询(按学号查查询或姓名查询)、修改…

ASP.NET State Service服务无法启动解决方案

客户服务器ASP.NET State Service启动不起来,如下图所示: 在服务中右击属性查看基本信息,发现aspnet_state.exe在目录中不存在,如下图所示: 若想正常启动,需要重新指向有exe的目录中去,解决方案…

Linux之问件上传下载

目录 Linux之文件上传下载 sftp 定义 用法 常用操作 查看当前目的主机的路径 --- pwd 查看当前本地所在路径 --- lpwd 更改当前目的主机的路径 --- cd 更改当前本地所在路径 --- lcd 查看当前目的主机 --- ls ​编辑 查看当本地的主机目录 --- lls ​编辑 将Window…

08SQL基础知识

SQL知识点 1、SQL语言分类 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组…