一. 主从复制实现过程?
1.主库在收到客户端提交事务的请求,先写入binlog,再提交事务,将日志刷到磁盘中,返回给客户端成功;
2.主库会用log dump线程将binlog日志传输给从库,从库会创建一个I/O线程读取binlog,然后先写入relay log中继日志;再返回给主库『复制成功的响应』。
3.从库会创建回放I/O线程读取relay log中继日志,回放binlog到自己磁盘中;最终实现主从数据一致性;
二. mysql主从复制几种方式?
1. 同步复制:
主从复制时,主库需要等待所有从库返回成功才可;有一个从库失败,整个复制失败;工作中应用很少,性能太差;
2. 异步复制:
主从复制时,异步进行,性能很高。但是会出现从库数据丢失的情况;主库I/O线程发送到从库发生宕机,从库数据就会出现丢失;
3. 半同步复制:
一主多从同步中,主库只监控部分从库返回复制成功状态即可;即解决了同步复制的性能问题,又解决了异步复制出现的从数据丢失问题;
三. 主从复制延迟问题
1.主从复制延迟,导致主从数据库数据不一致问题;
举个例子,用户发布评论场景,会先写入主库,再异步调用审核评论模块,审核模块会拿着id去从库中查询但查询不到,因为从库还未同步主库数据;
2.解决方案:
1)数据冗余:在异步调用审核模块,就将所需数据一并传输,但要注意数据大小,过大数据会占用网络带宽和时间;
2)更新到缓存:写入主库时一并将数据写入redis,然后读取redis,但会有缓存一致性问题;这时候可以加分布式锁;
四. 主从复制延迟优化
在mysql5.7之前,数据库从机回放binlog是单线程的,5.7版本开始支持多线程;称作『并行复制』;
并行复制两种模式:
1)COMMIT ORDER:主机怎么并行,从机就怎么并行;和主机事务一致,若主机一次插入1000条数据,就比较慢;
2)WRITESET:基于每个事务的,只要一个事务内的操作不冲突(主键冲突),就可以多线程并行处理;多线程插入1000条数据;
五. 主从复制延迟监控
在主库创建一个心跳表,比如说每1秒更新心跳表时间;用从机当前时间-从库心跳表时间=主从延迟时间;