相关链接
MySQL 官网主从复制:https://dev.mysql.com/doc/refman/5.7/en/replication.html
优秀博文:https://blog.csdn.net/yhl_jxy/article/details/112486032
主从形式
- 一主一从
- 主主复制
- 一主多从—扩展系统读取的性能,因为读是在从库读取的;
- 多主一从—5.7开始支持
- 联级复制—
用途及条件
- 实时灾备,用于故障切换
- 读写分离,提供查询服务
- 备份,避免影响业务
主从部署必要条件:
- 主库开启binlog日志(设置log-bin参数)
- 主从server-id不同
- 从库服务器能连通主库
原理
过程描述
从库生成两个线程,一个
I/O 线程
(I/O thread),一个SQL 线程
(SQL thread);从库 I/O 线程连接主库发送请求到主库(传 pos,binlog event等参数),主库会生成一个
log dump 线程
(dump thread),检查binlog event
,根据从库要求,将
binlog
发送给 从库 I/O 线程,从库 I/O 线程将binlog
写入relay log
(中继日志),从库的 SQL 线程,会读取
relay log
文件中的日志,并解析成具体操作执行,实现主从最终数据一致;
概括
默认 MySQL 异步复制模式下,binlog 不是主库 dump thread 主动传给从库的,是从库 I/O 线程连接主库告诉主库发到什么 pos 的 binglog 给从库,
主库收到后,检查 binlog event,按需发送 binlog 给从库。这样处理是因为可能从库有多个,处理速度和性能不一样,从库根据自身情况
去触发获取 binlog 处理,各个从库互不影响,跟主库保持最终数据一致性
主从复制方式
1、异步复制
异步复制是 MySQL 默认的方式。在异步复制下,主库不会主动的向从库发送 binlog,而是等待从库的 I/O 线程建立连接,
从库 I/O 线程请求主库二进制日志事件(传pos等),然后主库创建dump
线程,检查自己的 binlog event,
将对应位置的 binlog 发送给从库 I/O 线程,从库 I/O 线程将接收到的 binlog 写入到 relay log(中继日志) 中,从库开启 SQL 线程从
relay log 中刷入到从库磁盘,完成主从异步复制操作。
主库处理用户请求和主从复制是两个完全异步化的过程。
2、同步复制
同步模式则是,主库执行一个事务,那么主库必须等待所有的从库全部执行完事务返回 commit 之后才能给客户端返回成功。
主库会直接提交事务,而不是等待所有从库返回之后再提交。MySQL只是延迟了对客户端的返回,并没有延后事务的提交。
同步模式性能会大打折扣,它把客户端的请求和主从复制耦合在了一起,如果有某个从库复制线程执行的慢,那么对客户端的响应也会慢很多。
3、半同步复制
半同步相对于同步的区别在于,同步复制需要等待所有的从库 commit,而半同步只需要一个从库 commit 就可以返回了。
如果超过默认的时间仍然没有从库 commit,就会切换为异步模式再提交。客户端也不会一直去等待了。
因为即使后面主库宕机了,也能至少保证有一个从库节点是可以用的,此外还减少了同步时的等待时间。
4、并行复制
MySQL 并行复制
- 社区版5.6中新增
- 并行是指从库 SQL 线程负责转发到 多个 worker 线程去处理日志
- 库级别并行应用 binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组),一个事务发送到一个 worker 线程执行
设置
set global slave_parallel_workers=10;
设置 sql 线程数为10。
问题及解决方法
1、主库宕机后,数据可能丢失
半同步复制(解决数据丢失的问题)
2、从库只有一个 sql Thread,主库写压力大,复制很可能延时
并行复制(解决从库复制延迟的问题)
3、第一次搭建主从,数据库不存在问题
这个一般是第一次搭建主从的时候,从库存在的问题。需要从主库把数据复制过去,然后在从库恢复即可