分库分表介绍

1、背景mysql

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

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

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

2、分库分表优势性能

分库优势:下降单台机器的负载压力blog

分表优势:提升数据操做的效率事务

3、分库分表的挑战资源

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

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的这条记录,所以若是不进行数据迁移的话,就会出现记录找不到的状况。

相关文章
相关标签/搜索