架构实战案例解析
王庆友
前1号店首席架构师
立即订阅
2744 人已学习
课程目录
已完结 23 讲
0/4登录后,你可以任选4讲全文学习。
概述篇 (2讲)
开篇词 | 想吃透架构?你得看看真实、接地气的架构案例
免费
01 | 架构的本质:如何打造一个有序的系统?
业务架构篇 (9讲)
02 | 业务架构:作为开发,你真的了解业务吗?
03 | 可扩展架构:如何打造一个善变的柔性系统?
04 | 可扩展架构案例(一):电商平台架构是如何演变的?
05 | 可扩展架构案例(二):App服务端架构是如何升级的?
06 | 可扩展架构案例(三):你真的需要一个中台吗?
07 | 可复用架构:如何实现高层次的复用?
08 | 可复用架构案例(一):如何设计一个基础服务?
09 | 可复用架构案例(二):如何对现有系统做微服务改造?
10 | 可复用架构案例(三):中台是如何炼成的?
技术架构篇 (9讲)
11 | 技术架构:作为开发,你真的了解系统吗?
12 | 高可用架构:如何让你的系统不掉链子?
13 | 高可用架构案例(一):如何实现O2O平台日订单500万?
14 | 高可用架构案例(二):如何第一时间知道系统哪里有问题?
15 | 高可用架构案例(三):如何打造一体化的监控系统?
16 | 高性能和可伸缩架构:业务增长,能不能加台机器就搞定?
17 | 高性能架构案例:如何设计一个秒杀系统?
18 | 可伸缩架构案例:数据太多,如何无限扩展你的数据库?
19 | 综合案例:电商平台技术架构是如何演变的?
总结篇 (2讲)
20 | 从务实的角度,给你架构设计的重点知识和学习路径
结束语 | 和你聊聊我的架构心路历程
结课测试 (1讲)
结课测试 | “架构实战案例解析”100分试卷等你来挑战!
架构实战案例解析
15
15
1.0x
00:00/00:00
登录|注册

18 | 可伸缩架构案例:数据太多,如何无限扩展你的数据库?

王庆友 2020-04-01
你好,我是王庆友。在第 16 讲中,我和你介绍了很多可伸缩的架构策略和原则。那么今天,我会通过 1 号店订单水平分库的实际案例,和你具体介绍如何实现系统的可伸缩。

问题和解决思路

2013 年,随着 1 号店业务的发展,每日的订单量接近 100 万。这个时候,订单库已有上亿条记录,订单表有上百个字段,这些数据存储在一个 Oracle 数据库里。当时,我们已经实现了订单的服务化改造,只有订单服务才能访问这个订单数据库,但随着单量的增长以及在线促销的常态化,单一数据库的存储容量和访问性能都已经不能满足业务需求了,订单数据库已成为系统的瓶颈。所以,对这个数据库的拆分势在必行。
数据库拆分一般有两种做法,一个是垂直分库,还有一个是水平分库。
垂直分库
简单来说,垂直分库就是数据库里的表太多,我们把它们分散到多个数据库,一般是根据业务进行划分,把关系密切的表放在同一个数据库里,这个改造相对比较简单。
水平分库
某些表太大,单个数据库存储不下,或者数据库的读写性能有压力。通过水平分库,我们把一张表拆成多张表,每张表存放部分记录,分别保存在不同的数据库里,水平分库需要对应用做比较大的改造。
当时,1 号店已经通过服务化,实现了订单库的垂直拆分,它的订单库主要包括订单基本信息表、订单商品明细表、订单扩展表。这里的问题不是表的数量太多,而是单表的数据量太大,读写性能差。所以,1 号店通过水平分库,把这 3 张表的记录分到多个数据库当中,从而分散了数据库的存储和性能压力。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《架构实战案例解析》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(16)

  • 李博
    1 号店最终是根据用户 ID 后三位取模进行分库,初始分成了 6 个库,理论上可以支持多达 768 个库。
     老师这个最大支持768怎么算出来的?

    作者回复: 你看的很仔细啊,三位数最大是999,从6开始翻倍,最大翻到768,这已经够用了。

    2020-04-01
    3
  • Jxin
    1.分页为何不走es? 这样聚合多库数据觉得比较复杂,而复杂本身就是需要警惕的事。

    2.取模那里,0库转移%12=7的数据。没有6号库,只有5号库,转移%12=11的数据。

    3.用户id可以截取写入订单号中,以此减少一次中间表映射的成本。担心安全性,则做加密处理。毕竟加密解密是cpu密集操作,其效率正常都会比查表这种io操作快,更何况这表字段虽少,但写频繁,切行数不会少。

    作者回复: 1. 分页怎么处理具体要看场景,实时性要求不高的可以走大数据或ES,要求高的还是要并行直接查数据库。
    2. 关于数据迁移逻辑,原来6个库(编号为0-5),分别放 Id %6后0-5的数据,现在新增加编号是6-11号库,原来0号库一半数据(id%12=6)要迁到6号库,文中说的6号库,指的是迁移后新加的6号库。
    3. 文章最后提到,最后落的方案是按照用户id后三位取模,对订单编号进行改造,加入了用户ID后三位。

    2020-04-01
    1
    3
  • Geek_ae94ad
    现有数据库的表是主键id自增的方式,现在想分库分表,老数据如何做数据兼容操作?

    作者回复: 分库字段是这个主键id吗?如果不是的话,那老数据不影响。如果是,还是可以直接取模方式分,只是新id的算法要换下,改为由数据库外部服务统一生成,比如雪花算法等。

    2020-05-28
    1
  • 小洛
    谢谢老师的分享,我们这边的分库是一次性分128个 因为综合考虑下公司的业务量、未来增长、和成本,以及如果以后再次扩容,需要做数据迁移的工作,数据迁移的工作 还是比较繁琐的,什么双写方案、数据校验、不停机平滑迁移扩容等,就是琐碎的很,所以就直接一步到位了。然后分页这块看具体场景了,确实没有好的方案,一般非实时走ES,如果不行 就和产品撕逼,看看做这个的意义何在,多问他为什么?然后呢?一般有时候他自己都被问懵了,还是看具体场景,有时候业务和技术要折中~
    2020-04-05
    1
  • Middleware
    分页的处理方法可否进一步分享一下 可落地的实现办法

    作者回复: 最简单的方式就是所有库拿数据,然后在内存里重排取记录,从数据库拿可以使用多线程并发。

    分页没有特别好办法,需要具体情况具体分析。

    2020-04-03
    1
  • tt
    都是具体的,有步骤的,可以落地的经验,收藏!
    2020-04-01
    1
  • AlfredLover
    精彩,分页这里,代码层面是循环去查询每个库的记录,还是每个库一个线程并行的方式去查询?

    作者回复: 文章后面有提到,dal层提供开关,让上层调用时选择是否并行执行

    2020-04-01
    1
  • 陈方义
    王老师好,请问一下:sharding-proxy能解决分片后的聚合、分页问题吗?

    作者回复: 简单的聚合是可以,但分页的话可以选择放在应用里二次排序然后选择范围,在代理层做会比较复杂。

    2020-06-17
  • Mandalorian
    用一致性哈希的分法,分库的时候迁移的数据量会更少。
    2020-05-31
  • Geek_ae94ad
    老师,针对订单中心的表数据,业务库用mysql,同步到es做查询时,比如一个订单主表,关联5个子表,比如商品表,优惠分摊表,订单属性扩展表等,在es存的时候是以嵌套的形式存一个index,还是mysql一张表,对应es的一个index,然后维护父子关系?或者有更好的方案,我这边的需求是想支持各个维度的查询操作

    作者回复: 应该是文档嵌套的形式合成一个index,简化查询

    2020-05-28
  • Robin康F
    公司的老系统之前数据库也有订单表,采用的方式是保留3个月的数据,其余都通过定时脚本转移到备份表,再好一点是转移到别的数据库,再好一点呢就是做分表了
    2020-05-08
  • 飞哥
    MySQL数据库订单表在千万行级别,30列左右,使用数据库的分区功能是否可以

    作者回复: 可以,这个量不算大

    2020-04-09
  • 孙同学
    https://www.processon.com/view/link/5e51378ce4b0c037b5f9d1e3 整理更新
    2020-04-08
  • 蓝天
    1,老师这里分库是逻辑上的分库吧,不是物理上的吧,否则几张表一个库有点浪费
    2,我们现在用的rds,现在一个慢sql全卡住了,微服务用rds是不是成本会高呢

    作者回复: 1. 物理机部署,分库本来的目的就是解决存储和性能的问题,使用逻辑库意义不大。
    2. 如果用mysql,可以一台机器装多个实例,每个微服务使用自己的实例。

    2020-04-02
  • 台风骆骆
    老师的课特别接地气,实用,赞
    2020-04-01
  • 正在减肥的胖籽。
    老师中午好,请教你几个问题
    1.水平拆分库,代码层面也就是修改路由。你们线上怎么实现平滑迁移?如果我现在4个表,需要拆分成8个表。上线的时候用户还需要正常访问。我现在没想到好的方案。

    作者回复: 凌晨2-3点短暂停系统,提前全网会发公告

    2020-04-01
    1
收起评论
16
返回
顶部