【干货】分库分表最佳实践 - 有梦想的老王 - 博客园

标签: | 发表时间:2021-09-11 07:22 | 作者:
出处:https://www.cnblogs.com

何时分库分表

MySQL单表(innoDB)可以存储10亿级数据,只是这时候性能比较差,业界公认MySQL单表容量在1KW以下是最佳状态,因为这时它的BTREE索引树高在3~5之间。

参考阿里开发手册建议:

1.单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表;如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

2.实际情况受mysql机器配置等多方面影响,可能数据量很大但性能依旧不错,但考虑后续发展一定要进行分库分表考虑。

如何分库分表

设置合适的分片数量

根据实际的业务场景选择合适的分片数据,参考如下:

  • 满足当前数据平均后的数据量在一个合理的范围(<=100w)
  • 预估未来5年的数据量发展情况,数据量在一个合理的范围(500w左右,有合理的归档备份机制)

选择合适的分片字段

根据实际的业务场景选择适当的分片字段,要达到如下要求:

  • 字段类型常规
  • 字段不易过多
  • 字段应该是业务场景大多数都会被使用的

设计合理的分片规则

分表数量和分表字段确定后,要设计一个合理的分表规则,良好的分表规则要达到如下条件:

  • 规则计算高效,逻辑清晰
  • 规则计算后,分片数据均匀
  • 方便后续扩容分片

如何保证分片数据均匀,参考:

  • 分片字段本身就是随机均匀的,可以直接使用
  • 分片字段随机,但不均匀,如对总分片取模后,会导致数据不均匀,建议先对分片字段进行2次随机处理(如:zebra提供的:md5/crc32 方法)

如何保证方便后续分片扩容,参考:

  • 如果是按照时间或数值范围进行分片,只需要创建分片库表,修改分片规则,立即生效
  • 如果是hash分片,条件允许可考虑停服迁移,停止服务,将数据按新分片规则进行迁移,修改分片规则,启动服务
  • 某些情况下可考虑升级从库,如2分库扩容为4分库,可将从库升级为主库并修改分片规则,后续可将冗余的数据进行清除并补上缺失的从库。
  • 数据库双写,同时按新老分片规则写入两套物理表,并逐渐下线老数据模型,可参考-新老迁移参考

SQL使用注意

如何高效的使用分库分表,核心是做到尽量的路由到最少的表,最好是只路由到一个表里面

核心规则如下:

  • 能带分片字段的就尽量把其带上
  • 尽量不使用范围查询
  • 无分片使用limit时不要查询太靠后的数据
  • 尽量不要使用复杂的sql
  • sql写法尽量规范

新老迁移方案参考

阶段一

  • 数据库双写(事务成功以老模型为准),查询走老模型。
  • 每日job数据对账,并将差异补平。
  • 通过job导历史数据。

阶段二

  • 历史数据导入完毕并且数据对账无误。
  • 依然是数据库双写,但是事务成功与否以新模型为准,在线查询切新模型。
  • 每日job数据对账,将差异补平。

阶段三

  • 老模型不再同步写入,异步补齐(同步数据终态)。
  • 此阶段只有离线数据依然依赖老的模型,并且下游的依赖非常多,待改造完就可以完全废除老模型了。

相关 [干货 最佳实践 梦想] 推荐:

【干货】分库分表最佳实践 - 有梦想的老王 - 博客园

- -
MySQL单表(innoDB)可以存储10亿级数据,只是这时候性能比较差,业界公认MySQL单表容量在1KW以下是最佳状态,因为这时它的BTREE索引树高在3~5之间. 1.单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表;如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表.

jQuery最佳实践

- andi - 阮一峰的网络日志
上周,我整理了《jQuery设计思想》. 那篇文章是一篇入门教程,从设计思想的角度,讲解"怎么使用jQuery". 今天的文章则是更进一步,讲解"如何用好jQuery". 我主要参考了Addy Osmani的PPT《提高jQuery性能的诀窍》(jQuery Proven Performance Tips And Tricks).

PHP最佳实践

- xiangqian - 阮一峰的网络日志
虽然名字叫《PHP最佳实践》,但是它主要谈的不是编程规则,而是PHP应用程序的合理架构. 它提供了一种逻辑和数据分离的架构模式,属于MVC模式的一种实践. 我觉得,这是很有参考价值的学习资料,类似的文章网上并不多,所以一边学习,一边就把它翻译了出来. 根据自己的理解,我总结了它的MVC模式的实现方式(详细解释见译文):.

MongoDB最佳实践

- - NoSQLFan
将 MongoDB加入到我们的服务支持列表中,是整个团队年初工作计划中的首要任务. 但我们感觉如果先添加一项对NoSQL存储的支持,而不是先升级已支持的关系型数据库,可能对用户不太好,毕竟目前的用户都使用关系型数据库. 所以我们决定将引入MongoDB这项工作放到升级MySQL和PostgreSQL之后来做.

Dockerfile 最佳实践

- - DockOne.io
在容器领域,Docker 公司提出的容器镜像已经成为目前容器打包交付的事实标准. 构建镜像需要编写 Dockerfile,如何编写一个优雅的 Dockerfile 呢. 在 Docker 公司的官方文档中给出了一篇:《 Best practices for writing Dockerfiles》.

文章: Grails最佳实践

- - InfoQ cn
我在IntelliGrape工作,这是一家专门使用Groovy & Grails进行开发的公司. 本文是我们Grails项目遵循的最佳实践的基本清单,收集自邮件列表、Stack Overflow、博文, 播客和 IntelliGrape的内部讨论. 它们分为控制器、服务、Domain、视图、TagLib、测试和其他.

PHP最佳实践(译)

- - CSDN博客Web前端推荐文章
原文:  PHP Best Practices-A short, practical guide for common and confusing PHP tasks. 译者: youngsterxyf. 本文档最后审阅于2013年3月8日. 由我, Alex Cabal,维护该文档. 我编写PHP程序已有很长一段时间了,当前我 经营着 Scribophile,由认真作家组成的一个在线写作团体,  Writerfolio,为自由职业者提供的一个易用写作工具集,以及  Standard Ebooks,一个图文并茂、无数字版权管理的公共领域电子书出版商.

Log4j最佳实践(原) - Mainz

- - 博客园_Mainz's Blog
本文是结合项目中使用 Log4j总结的最佳实践,非转载. 网上可以找到的是这一篇《 Log4j最佳实践》. 本来 Log4j使用是非常简单的,无需多介绍其用法,这只是在小型项目中;但在 大型的项目中使用 log4j不太一样. 大型项目非常依赖日志,因为解决线上问题必须依靠log,依靠大量的日志.

再谈RestAPI最佳实践

- - 企业架构 - ITeye博客
http://www.javacodegeeks.com/2014/05/rest-api-best-practices-reloaded.html ,仅供学习和参考,转载请注明出处. 近一年半,我参与了2到3个项目的工作,这些项目涉及到大量供“外部”使用的Rest API,稍后我们再来解释为什么要将“外部”这个词放在引号之中.

一些 REST 最佳实践

- - 鸟窝
原文: Some REST best practices, 作者: Pierre-Olivier Bourgeois. 译文: 一些REST最佳实践, 译者: yongx. 如今,REST APIs 已经非常普遍,几乎所有WEB应用都用到了它们. 提供简单,一致,实用的API是种义务,方便其它人很容易的使用.