前面我们对MySQL所有的恢复都是基于binlog做的工作,采用二进制日志将之前所做的修改进行恢复,这样的话,我们只要把MySQL从初始化到之后所有的操作的binlog保留下来,就可以将MySQL恢复到任意一个时间点了。既然如此,我们是不是就可以给MySQL做一个实时备份,也就是备份数据库同一时刻和主数据库保持数据一致,虽然也是备份,但是还是有差别,毕竟实时备份是MySQL自动执行,而普通的xtrabackup是我们手动操作。所以今天就给大家讲讲MySQL主从复制的原理。
主从复制能为我们做什么?
- 辅助备份
- 高可用
- 分担负载
MySQL 复制简介
复制是MySQL 的一项功能,允许服务器将更改从一个实例复制到另一个实例。
- 主服务器将所有数据和结构更改记录到二进制日志中。
- 从属服务器从主服务器请求该二进制日志并在本地应用其内容。
主从复制前提
- 两台以上mysql实例(多台物理机或多个mysql实例)
- 主库要开启二进制日志
- 主库要提供复制相关的用户
# replication slave,一个比较特殊的权限
# grant replication slave on *.* to repl@'10.0.0.%' identified by '123456'; - 从库需要将和主库相差的数据,进行追加
一般情况下可以人为备份主库数据,恢复到从库上 - 从应该从恢复之后的时间点,开始自动从主库获取新的二进制日志开始应用
我们需要人为告诉从库,从哪开始自动开始复制二进制日志(file+position),另外还需要告诉从库user,passwd,port,ip
复制中的线程及文件
主库
- Dump(IO) thread
在复制过程中,主库发送二进制日志的线程 - binlog文件
主库的二进制日志
从库
- IO thread
向主库请求二进制日志,并且接受二进制日志的线程 - SQL thread
执行请求过来的二进制的线程 - relaylog
中继日志,存储请求过来的二进制日志 - master.info
1. 从库连接主库的重要参数(user,passwd,ip,port)
2. 上次获取过的主库二进制日志的位置 - relay-log.info
存储从库SQL线程已经执行过的relaylog日志位置
主从复制的工作原理
- 从库IO线程,读取master.info中的信息,获取到连接参数(user\passwd\ip\port)+上次请求过的主库的binlog的位置(例子:mysql-bin.000003,position=640)
- IO线程连接到主库,拿着位置信息(mysql-bin.000003,position=640),问主库有没有比这个更新的二进制日志。
- 主库查询二进制日志,并对比从库发送过来的位置信息(mysql-bin.000003,position=640),如果有新的二进制日志,会通过dump thread发送给从库。
- 从库通过IO线程,接受主库发来的二进制日志,存储到TCP/IP缓存中,并且返回“ACK”确认给主库,这时主库收到ACK后,就认为复制完成了,可以继续其他工作了。
- 从库更新master.info,二进制日志位置更新为新的位置信息。
- 从库IO线程会将TCP/IP缓存中的日志,存储到relay-log中继日志文件中。
- 从库SQL线程,读取relay-log.info,获取到上次执行到的relaylog日志位置,以这个位置信息作为起点,往后继续执行中继日志。
- SQL线程执行完成所有relay之后,会更新relay-log.info信息为新位置信息。
- 到此为止,一次完整的复制过程就完成了。
最后修改于 2019-08-19 09:14:46
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

