如何评估是否需要分片库


决定因素

我们评估一下数据库是否需要做水平拆分要考虑的几个要素主要是

  1. 主库性能:受限于单个主库的CPU/内存/磁盘IOPS的影响,接近或者达到上限后,需要拆分。
  2. 容灾方面:减少单个主库宕机对于写入的影响。
  3. 空间容量:如果你公司的mysql容量比较大,解决了单实例的空间容量限制,但是仍然需要注意特大表的查询性能问题。

别的优化方式

针对以上3点,实际上除了简单的拆分外,我们还需要或者说还可以多考虑一下,有没有更合适的方案

  1. 主库性能:
    1)可以通过读写分离的方式,降低对于写库的读请求量,从而提升对于写入的支撑
    2)优化数据写入模型,减少批量写入(削峰),按照我们线上物理机配置,简单的写入模型支撑5k-7k/s的写入。
    有的业务表比较窄,写入可以达到15-20k/s。
  1. 容灾方面:
    1)这个主要要看业务场景,如果业务对于读高可用要求比较高,一般建议是做读写分离,将重要的请求路由至读库。读库数量一般会比写库多N个,在代理层面会做容灾的自动切换。
    2)从集群整体的角度看,分库分表实际上是会扩大故障率的。假设单台物理机的SLA是99.99%则2台物理机的SLA约是99.98%10台物理机的SLA就只剩下99.90%。平均每年的故障时间从52分钟提升到525分钟。由于我们采用的通过代理层转发的方案实现分库分表的路由,在有些场景下单个节点故障可能会导致代理整个不可用,从而放大故障的影响范围。

分区的必要条件

按照经验评估,我们的拆分需求主要还是源之于写入能力的要求(比如要求写入tps 10万笔/s 等等)。
如果是基于容灾考虑,我们是建议先做上面提供的优化方案
1)通过读写分离提升读库的SLA
2)减少主库上不必要的读和写,降低故障的概率(物理设备故障无法避免)
3)配置HA自动切换,减少故障影响的时间(这个可以单独沟通)

简而言之,分库分表不是”银弹“,建议先评估清楚后再上船。

Q: 单表超过10亿条数据,需要分库分表吗?
A: 只要业务请求的响应时间满足预期,不需要考虑数量的问题(线上百亿级别的表也不少)


文章作者: 希特文
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 希特文 !
评论
评论
 上一篇
分布式锁的几种实现方式 分布式锁的几种实现方式
一、为什么需要分布式锁与分布式锁相对应的是「单机锁」,我们在写多线程程序时,避免同时操作一个共享变量产生数据问题,通常会使用一把锁来「互斥」,以保证共享变量的正确性,其使用范围是在「同一个进程」中。 如果换做是多个进程,需要同时操作一个共享
2021-10-04
下一篇 
  目录