数据库分库解决方案

当业务数据量非常大,单数据库无法支撑的时候,有可能是单库已经写满了,也可能数据库读写比较频繁,已经触碰到单库的io瓶颈了,这时就需要考虑分库。

下面聊一下该怎么分库,如何优化:

刚开始只有数据库A, 后来又加了数据库B。

假如数据表都是有时间戳字段,而且数据查询条件都带一个时间戳字段,这样我们可以根据数据创建的时间范围来分库,比如给数据库按年份命名db_2019, 到2020年新生成一个库db_2020, 在业务端进行数据读写操作时,先根据时间戳条件获取到年份,然后选择相应年份的数据库进行操作。

但上面这种方式只适合这种特定的业务场景,而且这种方式,可能旧数据很少读取,新数据会比较频繁读取,会导致不同数据库负载是不均匀的。所以会不会有更好的分片方式呢? 答案是肯定的。几乎任何一张表都会有键字段,假如键值是数字类型,可以键值与数据库数量取模的方式进行分片,比如键值是100,数据库数量是2, 那么100%2得到0,就应该存储到索引为0的数据库。假如键值是字符串呢,可以通过crc32(value)算出一个数字,然后再通过数字取模的方式得到相应的数据库。

假如在使用过程中,数据库又不够用了,需要再扩容,怎么办?

停服,根据新的分片逻辑进行数据迁移,起服上线新的分片逻辑。没毛病,假如业务允许停机一段时间, 这也是一种稳妥方式。假如业务不允许停机,或只允许停机很短的时间,这时该如何数据库扩容呢,或者说该如何平滑地进行数据库迁移而不影响业务呢?

可以通过下面步骤来

方案一:

  • 修改写数据库逻辑:对需要迁移的数据,进行双写(写原数据库和要迁往的数据库)

  • 写一个迁移脚本:从原数据库迁数据到目标数据库

  • 校验原数据库是否跟跟目标数据库数据一致(在迁移的瞬间可能发生了原数据库删除了数据,而目标数据库依然写入),删掉目标数据库多余的数据。

  • 修改数据库分片逻辑,去掉双写逻辑

  • 删掉各个数据库冗余的数据

若数据库双倍分库扩容有更好方案

方案二:

  • 原数据库和要迁往的数据库设计成双主同步

  • 修改数据库分片逻辑

  • 删掉各个数据库冗余的数据

后面找个时间再补充一些图表,以便读者能更直观得理解。

还有一些问题:

问题一:假如方案一中,进行双写的时候一个写成功,一个写失败,该如何处理?

问题二:分库后,如何分页查询数据?

后面会再写一篇较大篇幅的文章分析如何跨数据库分页查询数据。

(0)

相关推荐

  • MySQL高级部分理论知识细讲

    文章目录 一.数据库分区.分表.分库.分片 YesOk ,大家好 ,我是小刘,许久不见,甚是想念 ,小刘今天来带大家学习 分库分表的基础知识 1.1 单机数据库的瓶颈 单个表数据量越大,读写锁,插入操 ...

  • Mysql某个表有近千万数据,CRUD比较慢,如何优化?

    我是[会点代码的大叔],每天为你分享程序员干货,关注并私信我数字"1",送你一份程序员大礼包. MySQL 数据库某张表近千万的数据,CRUD比较慢,如何优化? 说实话,这个数据量 ...

  • 数据库分库分表

    垂直分表 将字段拆分出多个表 水平分表 将数据拆分多个表 <!-- 分库分表插件 --><dependency> <groupId>org.apache.shard ...

  • 数据库的分库分表思想,高级工程师必备

    前言 关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维 度较多,即使添加从库.优化索引,做很多操作时性能仍下降严重.此 ...

  • 数据库:我都快爆了,你为什么还不分库分表?

    在文章开头先抛几个问题: 什么时候才需要分库分表呢?我们的评判标准是什么? 一张表存储了多少数据的时候,才需要考虑分库分表? 数据增长速度很快,每天产生多少数据,才需要考虑做分库分表? 这些问题你都搞 ...

  • singleR的7个数据库文件下载失败的解决方案

    祖传的单个10x样本的seurat标准代码 祖传的单个10x样本的seurat标准代码(人和鼠需要区别对待) singleR自带7个数据库文件,需要联网才能下载,其中5个是人类数据,2个是小鼠的数据: ...

  • 收藏:数据库云灾备解决方案

    对于IT而言,容灾就是一个提供能防御各种灾难的计算机信息系统.当政府.企业.商家的核心IT系统在遭受如:火灾.水灾.地震.战争.人为破坏等不可抗拒的灾难和意外时,能够有效保护数据幵及时恢复生产系统的正 ...

  • 基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案

    本文源码:GitHub·点这里 || GitEE·点这里 一.项目结构 1.工程结构 2.模块命名 shard-common-entity: 公共代码块 shard-open-inte: 开放接口管理 ...

  • 手摸手教你你用数据库中间件Mycat SpringBoot完成分库分表

    优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:叩丁狼教育 蓝雄威 https://www.jianshu.com/p/f81422b1c915 一.背景 随着 ...

  • redis 数据库主从不一致问题解决方案

     在聊数据库与缓存一致性问题之前,先聊聊数据库主库与从库的一致性问题. 问:常见的数据库集群架构如何? 答:一主多从,主从同步,读写分离. 如上图: (1)一个主库提供写服务 (2)多个从库提供读服务 ...

  • 忘记本地MySQL数据库密码的解决方案。

    忘记本地MySQL数据库密码,解决方案,分以下10个步骤: 参考链接:                  https://blog.csdn.net/weidong_y/article/details ...