为什么要主从复制?
- 有一句sql语句当锁表的时候不能读,这会影响运行中的业务。使用主从复制,让主库负责写,从库负责读,这样即使出现锁表,也可以通过从库读。
- 做数据的热备。
- 架构的扩展。可以降低磁盘IO访问的频率,提高单个机器的IO性能。
什么是mysql的主从复制?
指数据可以从一个mysql数据库服务器主节点复制到一个或多个从节点。mysql默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有或者特定的数据库,或者特定的表。
mysql复制原理
- master服务器将数据的改变记录到二进制binlog日志中
- slave服务器会定期对binlog进行检测是否发生改变。如果发生改变,则开启一个IO Thread拉取master的binlog中的内容到relay log中,sql线程负责从relay log中读出内容,并更新到slave的数据库中。保证slave和mater数据一致。
- mysql复制至少需要2个mysql的服务
- mysql的复制确保版本:master<=slave服务器
- master和slave两节点时间需要同步
mysql主从形式
- 一主一从 一台master,一台slave
- 主主复制 互为备份
- 一主多从 一般用于读写分离。主写,从读,分担读取压力
- 多主一从 用来做数据备份,应用较少
- 联级复制 浪费时间;依赖太强,应用较少
mysql主从同步延迟分析
在mysql5.7以前:
由于mysql的主从复制是单线程操作,主库对所有DDL和DML产生的日志写入binlog,由于binlog是顺序写,效率很高,slave的sql线程将DDL和DML操作事件重新生成,而DML和DDL的IO操作是随机的,效率低。另一方面,由于sql thread也是单线程的,当主库并发较高时,产生的DML和DDL数量超过slave的SQL Thread所能处理的速度,或者当slave中有大型query语句产生了锁等待,那么延迟就会产生了。
解决方案:
- 业务的持久化层的实现采用分库架构,mysql服务可以平行扩展,分散压力
- 单个库读写分离,一主多从,主写读从,分散压力。让从库压力高于主库压力,保护主库
- 服务的基础架构在业务和mysql之间加入memcache或者redis的cache层,降低mysql的读压力
- 不同业务的mysql物理上放在不同机器,分散压力
- 使用比主库更好的硬件设备作为slave,mysql压力小,延迟自然小
- 使用更加强劲的硬件设备
在mysql5.7以后:
使用MTS并行复制技术,永久解决复制延迟问题。
MTS(enhanced multi-threaded slave),增强型多线程从机
master服务器上是怎么并行执行的,那么slave上就怎样进行并行回放