分表分库

分表分库

笔直分表

简略来说就是拆表,将一张表的字段拆分到多个表中。

这样能够削减对同一条记载可是不同字段的争抢,提高功能。注意text,blob字段这样的大字段,尽量和热门数据区别,防止读取热门数据时和text这样占用大量空间的字段在一张表中,由于text这样的字段占用空间大,形成跨页IO读取,影响热门数据读取功能。

水平分表

水平分表处理单张表数据量过大的问题,将一张表中的数据按路由规则划分到不同表中。水平分表提高了单张表的IO功能,可是仍受数据库实例的IO功能限制。

分表分库

常用的路由方法有字段hash或许字段映射等。字段hash数据分配的较为均匀,防止分表后数据歪斜;也能够对表中时刻或许区域等字段作为路由依据,一段时刻一张表或许一个区域一张表,可是这样难以应对突发的流量暴增导致数据歪斜。

水平分表后,形成分页排序失效,必须全表扫描都现已这么大数据还分什么页。 关于查询条件中,没有路由信息的,那么也会全表扫描。例如现在现已依照区域(region)分表,可是where条件中不含有region字段,而是要查询指定name,那么就会走全表扫描。 分表之后还或许形成分布式业务的呈现。(暂时没有比如)

笔直分库

和笔直分表差不多,原有数据库实例中或许含有不同模块的表,一旦某个模块呈现流量上升,就会牵连其他模块功能。为了提高可用性,将不同模块表迁移到各自专属的数据库实例。

水平分库

水平分库提高数据库IO功能,进程和水平分表差不多。

分表分库

分表分库的分布式问题

分表分库带来功能提高,可是也会引进分布式问题。原来单表主键依靠一个自增序列就能够处理,可是分布式场景下,就需要额定引进全局唯一性主键来防止不同表中主键抵触。

  • 运用同一自增序列 不同表都运用一个自增序列,这样就能够防止主键抵触。可是一切表依赖一个序列有单点问题,影响可用性,不推荐
  • 预留主键id 给每张表预分配一段id。如table1主键在区间1000-1999,table2主键在区间2000-2999,防止主键抵触。可是这样存在诸多危险,不能应对突发流量,一旦预留资源耗尽就需要手动修改。
  • 雪花算法
  • UUID

此外,路由的逻辑也需要引进到使用中。在客户端引进路由称为客户端分库如sharding-JDBC,还有额定引进署理的proxy分库如Mycat和TDDL。还有自己算表名然后拼上去

读写别离

除了做分表分库之外,还能够规划数据库实例进行读写别离,master实例担任写入,slave担任读取,提高数据库功能。

MySQL主从仿制和Redis主从差不多,master节点记载每一条写入操作到binlog文件中,并入slave节点后将binlog发过去,slave再进行数据同步。

分表分库

MySQL默认选用异步仿制,不要求主从强共同而是最终共同。master节点写入即以为成功,不考虑slave是否接纳并同步。

分表分库

如果想要集群强共同,那么能够选用半同步方法,除master写入成功外,还要求对折slave节点接纳并成功同步,这时才会向client返回成功。

分表分库

参考文献:
[1]: 一次分表踩坑实践的讨论