一、背景

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

一旦业务表中数据太大(对于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的这条记录,因此如果不进行数据迁移的话,就会出现记录找不到的情况。

 

posted on 2018-08-22 15:28  知己一生  阅读(279)  评论(0编辑  收藏  举报