zoukankan      html  css  js  c++  java
  • 分库分表介绍

    一、背景

    读写分离是为了扩展数据库的读能力,分库分表则是为了扩展数据库的写能力。

    一旦业务表中数据太大(对于mysql,单表数据一般不超过3000w,单库不超过300G),无论是任何CRUD操作,所耗费资源和性能都极大。这个时候一般就需要

    分库分表,将海量数据分配给N个子表维护。

    二、分库分表优点

    分库优点:降低单台机器的负载压力

    分表优点:提高数据操作的效率

    三、分库分表的挑战

    主要体现在四个方面:基本的数据增、删、改操作,分布式ID生成,分布式事务,动态扩容。

    3.1 对于研发人员,即使分库分表,我们仍然希望能够像单表那样去操作数据库。

    例如我们希望插入四条用户记录:

    insert into user(id,name) values (1,”tianshouzhi”),(2,”huhuamin”), (3,”wanghanao”),(4,”luyang”)
    

      而在分库分表之后,这样的sql已经无法执行。只有将sql转化为如下形式才可以执行:

    insert into user_1(id,name) values (1,”tianshouzhi”)
    insert into user_2(id,name) values (2,”huhuamin”)
    insert into user_3(id,name) values (3,”wanghanao”)
    insert into user_0(id,name) values  (4,”luyang”)
    

      

    3.2 分布式ID

    在分库分表后,我们不能再使用mysql的自增主键。因为在插入记录的时候,不同的库生成的记录的自增id可能会出现冲突。因此需要有一个全局的id生成器。

    3.3 分布式事务

    例如上面的批量插入记录到四个不同的库,如何保证要么同时成功,要么同时失败。关于分布式事务,mysql支持XA事务,但是效率较低。柔性事务是目前比较主流的方案,柔性事务包括:最大努力通知型、可靠消息最终一致性方案以及TCC两阶段提交。

    3.4 动态扩容

    动态扩容指的是增加分库分表的数量。

    例如原来的user表拆分到2个库的四张表上。现在我们希望将分库的数量变为4个,分表的数量变为8个。这种情况下一般要伴随着数据迁移。例如在4张表的情况下,id为7的记录,7%4=3,因此这条记录位于user_3这张表上。但是现在分表的数量变为了8个,而7%8=7,而user_7这张表上根本就没有id=7的这条记录,因此如果不进行数据迁移的话,就会出现记录找不到的情况。

  • 相关阅读:
    haproxy 2.5 发布
    cube.js sql 支持简单说明
    基于graalvm 开发一个cube.js jdbc driver 的思路
    apache kyuubi Frontend 支持mysql 协议
    oceanbase 资源池删除说明
    基于obd 的oceanbase 扩容说明
    jfilter一个方便的spring rest 响应过滤扩展
    cube.js schema 定义多datasource 说明
    typescript 编写自定义定义文件
    meow 辅助开发cli 应用的工具
  • 原文地址:https://www.cnblogs.com/zhangjwcode/p/9517965.html
Copyright © 2011-2022 走看看