半同步复制方案

MySql的Replication默认是一个异步复制的过程,从MySql5.5 开始,以插件的形式支持半同步复制,我先谈下异步复制,这样可以更好的理解半同步复制

  1. 异步复制

MySql默认的复制是异步的,主库在执行完客户端提交的事务后会立即返回结果给客户端,并不关心从库是否已经接受处理,这样就会有一个问题,如果从库宕机或者网络延时等原因,此时主库上的数据并没有同步到从库上,造成主库和从库数据不一致

  1. 半同步复制

半同步复制是介于异步复制和全同步复制之间,既主库在执行完客户端提交的事务后不立即返回结果给客户端,而是至少等待一个从库接收并写入ready log中才返回给客户端结果。相对于异步复制,半同步复制方案增加了数据一致性可靠,但同时也造成了一定程度上的延时(因为每次写入主库后会去从库中拿接收的结果),这个延时至少是 一个TCP/IP的往返时间。所以半同步复制最好在低延时的网络中使用

  • 半同步复制的优点

利用数据库原生功能,实现比较简单

  • 该方案缺点

主库写请求的耗时增加,降低吞吐量

数据库中间件方案

数据库一致性解决方案.jpg

  1. 数据库中间件方案实现步骤
  • 所有对数据库的读写操作都走中间件,通常情况下,写请求路由到主库,读请求路由到从库
  • 记录所有路由到写库的key,在主从同步的时间间隙内(如500ms),如果所有读请求访问,此时有可能从库还是旧数据(因为主从同步还未完成),就把这个key上的读请求路由到主库
  • 在主从同步过后,对应key的请求继续路由到从库
  1. 相关中间件:
  • Canal
  • otter
  1. 该方案优点

能保证数据一致

  1. 该方案缺点

引入中间件,开发成本较高

缓存记录写Key法

数据库一致性解决方案-第 2 页.jpg
缓存记录的方式是将写入数据库的数据生成一个对应的key,查询数据之前先查询key是否在缓存中存在,存在路由到主库中查询,不存在按正常路由规则查询
具体步骤

  1. 写流程
  • 首先将需要写入数据库的key写入缓存,并设置缓存过期时间,例如设置300ms
  • 然后修改主数据库
  1. 读流程
  • 根据key从缓存中查询有没有数据
  • 如果有数据,说明该数据刚才发生过数据库写操作,此时将请求路由到主数据库上查询
  • 如果没有数据,说明该数据刚才没有发生过数据库写操作,此时按正常规则路由

该方案优点
相对中间件,成本较低
该方案缺点
为了保证数据一致性,引入了缓存组件,在读写数据库时需要操作缓存