18 | 可伸缩架构案例:数据太多,如何无限扩展你的数据库?
问题和解决思路
- 深入了解
- 翻译
- 解释
- 总结
1号店订单水平分库的实际案例为读者提供了数据库扩展的解决方案。文章首先介绍了水平分库的两种方式:垂直分库和水平分库,并重点讨论了水平分库的实施过程。作者提出了量化分析的方法来确定分库维度,并介绍了根据ID范围和根据ID取模的数据分库方法及其优缺点。此外,文章还讨论了分库数量的选择和分库带来的新问题。在具体实施过程中,文章提到了分库路由、分页处理、分库字段映射等技术细节,并分享了1号店订单水平分库的总体技术架构和安全落地的实施过程。最终,文章总结了1号店订单水平分库的成果和经验教训,强调了分库策略的重要性,以及在实施过程中需要注意的要点。整体而言,本文详实全面,对于需要扩展数据库的技术人员具有一定的参考价值。文章通过具体案例和技术细节,帮助读者了解了数据库水平分库的实际操作和实施过程,为设计复杂方案的技术人员提供了宝贵的经验和思路。
《架构实战案例解析》,新⼈⾸单¥59
全部留言(18)
- 最新
- 精选
- 李博1 号店最终是根据用户 ID 后三位取模进行分库,初始分成了 6 个库,理论上可以支持多达 768 个库。 老师这个最大支持768怎么算出来的?
作者回复: 你看的很仔细啊,三位数最大是999,从6开始翻倍,最大翻到768,这已经够用了。
2020-04-01213 - Jxin1.分页为何不走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-0126 - Geek_ae94ad现有数据库的表是主键id自增的方式,现在想分库分表,老数据如何做数据兼容操作?
作者回复: 分库字段是这个主键id吗?如果不是的话,那老数据不影响。如果是,还是可以直接取模方式分,只是新id的算法要换下,改为由数据库外部服务统一生成,比如雪花算法等。
2020-05-284 - biscuitlife停服分库有点low,老师有么有更好的办法?
作者回复: 分库是比较大的动作,还是停服一下比较好,当然可以通过周密计划,大幅缩短停服时间。
2021-06-282 - Middleware分页的处理方法可否进一步分享一下 可落地的实现办法
作者回复: 最简单的方式就是所有库拿数据,然后在内存里重排取记录,从数据库拿可以使用多线程并发。 分页没有特别好办法,需要具体情况具体分析。
2020-04-032 - 开心小毛请问王老师:在垂直分库之后,是否会存在跨数据库的外键 (foreign key constraint): 是否必须把存在外键关联的表分到同一个数据库中;还是说我们必须在分库之后必须删除外键限制,再在应用层模拟外键。
作者回复: 现在数据库设计实践,一般不在数据库物理层面设置外键,而是在应用系统维护。
2020-07-2621 - 蓝天1,老师这里分库是逻辑上的分库吧,不是物理上的吧,否则几张表一个库有点浪费 2,我们现在用的rds,现在一个慢sql全卡住了,微服务用rds是不是成本会高呢
作者回复: 1. 物理机部署,分库本来的目的就是解决存储和性能的问题,使用逻辑库意义不大。 2. 如果用mysql,可以一台机器装多个实例,每个微服务使用自己的实例。
2020-04-021 - 正在减肥的胖籽。老师中午好,请教你几个问题 1.水平拆分库,代码层面也就是修改路由。你们线上怎么实现平滑迁移?如果我现在4个表,需要拆分成8个表。上线的时候用户还需要正常访问。我现在没想到好的方案。
作者回复: 凌晨2-3点短暂停系统,提前全网会发公告
2020-04-0131 - AlfredLover精彩,分页这里,代码层面是循环去查询每个库的记录,还是每个库一个线程并行的方式去查询?
作者回复: 文章后面有提到,dal层提供开关,让上层调用时选择是否并行执行
2020-04-011 - Nero Lou请问根据用户ID分库的话,那些跟用户ID无关的表,比如商品。是不是得冗余到每个库中?好像微服务之类比较好分,维度太多的业务模型比较难搞
作者回复: 水平分库针对具体的库,比如订单数据库使用用户ID,商品数据库使用商家id等。如果库里的某些表,不支持id分库,特殊情况,是可以冗余到每个库里。
2022-08-18归属地:上海