首页 > 技术文章 > MySQL 分库分表/读写分离

ruhuanxingyun 2020-08-06 08:29 原文

一、分库分表

  1. 水平切分

    A. 定义:它是将同一个表中的记录拆分到多个结构相同的表(不同库)中;

    B. 优点:可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力;

    C. 缺点:跨界点join性能差、事务复杂;

  2. 垂直切分

    A. 定义:是将一张表按列切分成多个表,通常是按照列的关系密集程度进行切分;

    B. 优点:方便实现动静分离,冷热分离的数据库表的设计模式,数据维护相对简单;

    C. 缺点:主键会出现冗余,需要管理冗余列,并会引起Join操作,且事务变得复杂;

  3. 涉及到问题

    A. 分片策略;

    B. 事务支持:分布式事务;

    C. 跨库链表查询;

    D. 跨节点的count、order by、group by及聚合函数等;

    E. ID唯一性;

  4. 数据库分片方案

    A. 客户端代理:分片逻辑在应用端,封装在jar包中,例如Sharding-JDBC;

    B. 中间件代理:在应用和数据中间加了一个代理层,分片逻辑统一维护在中间件服务中,例如Mycat;

 

二、主从复制

  1. 定义:将主库的数据异步的同步到从库的操作,由于主从同步的异步性,从库与主库的数据会短时间内不一致。

  2. 工作原理

    A. binlog线程:Master服务器在每个事务更新数据完成之前,将该操作记录串行地写入到二进制日志文件(Binary Log);

    B. I/O线程:Slave服务器中I/O线程在不停地监听Master的二进制日志是否有更新,如果没有它会睡眠等待Master产生新的日志事件,如果有新的日志事件,则会将其拷贝至Slave服务器中的中继日志(Relay Log);

    C. SQL线程:Slave服务器中SQL线程从中继日志读取事件,并重做其中的事件从而更新Slave的数据,使其与Master中的数据一致。

 

   3. 复制方式

    A. 异步复制:是MySQL默认的复制方式,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整;

    B. 半同步复制:介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间;

      全同步复制:指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响;

    C. GTID模式:

    D. 多源复制:

 

三、读写分离

  1. 定义:主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。

  2. 作用

    A. 主从服务器负责各自的读和写,极大程度缓解了锁的争用;

    B. 从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;

    C. 增加冗余,提高可用性。

 

可参考:Sharding-JDBC 数据库中间件

    Alibaba Canal 数据同步中间件

推荐阅读