半同步复制方案
MySql的Replication默认是一个异步复制的过程,从MySql5.5 开始,以插件的形式支持半同步复制,我先谈下异步复制,这样可以更好的理解半同步复制
- 异步复制
MySql默认的复制是异步的,主库在执行完客户端提交的事务后会立即返回结果给客户端,并不关心从库是否已经接受处理,这样就会有一个问题,如果从库宕机或者网络延时等原因,此时主库上的数据并没有同步到从库上,造成主库和从库数据不一致
- 半同步复制
半同步复制是介于异步复制和全同步复制之间,既主库在执行完客户端提交的事务后不立即返回结果给客户端,而是至少等待一个从库接收并写入ready log中才返回给客户端结果。相对于异步复制,半同步复制方案增加了数据一致性可靠,但同时也造成了一定程度上的延时(因为每次写入主库后会去从库中拿接收的结果),这个延时至少是 一个TCP/IP的往返时间。所以半同步复制最好在低延时的网络中使用
- 半同步复制的优点
利用数据库原生功能,实现比较简单
- 该方案缺点
数据库中间件方案
- 数据库中间件方案实现步骤
- 所有对数据库的读写操作都走中间件,通常情况下,写请求路由到主库,读请求路由到从库
- 记录所有路由到写库的key,在主从同步的时间间隙内(如500ms),如果所有读请求访问,此时有可能从库还是旧数据(因为主从同步还未完成),就把这个key上的读请求路由到主库
- 在主从同步过后,对应key的请求继续路由到从库
- 相关中间件:
- Canal
- otter
- 该方案优点
能保证数据一致
- 该方案缺点
引入中间件,开发成本较高
缓存记录写Key法
缓存记录的方式是将写入数据库的数据生成一个对应的key,查询数据之前先查询key是否在缓存中存在,存在路由到主库中查询,不存在按正常路由规则查询
具体步骤
- 写流程
- 首先将需要写入数据库的key写入缓存,并设置缓存过期时间,例如设置300ms
- 然后修改主数据库
- 读流程
- 根据key从缓存中查询有没有数据
- 如果有数据,说明该数据刚才发生过数据库写操作,此时将请求路由到主数据库上查询
- 如果没有数据,说明该数据刚才没有发生过数据库写操作,此时按正常规则路由
该方案优点
相对中间件,成本较低
该方案缺点
为了保证数据一致性,引入了缓存组件,在读写数据库时需要操作缓存