十七、Mysql的主从(一)--主从原理

       随着访问量的不断增加,单台MySQL数据库服务器压力不断增加,需要对MYSQL进行优化和架构改 造,MYQSL优化如果不能明显改善压力情况,可以使用高可用、主从复制、读写分离来、拆分库、拆分 表来进行优化。 ​ MYSQL主从复制集群在中小企业、大型企业中被广泛使用,MYSQL主从复制的目的是实现数据库冗余 备份,将Master数据库数据定时同步至Slave库中,一旦Master数据库宕机,可以将WEB应用数据库配 置快速切换至Slave数据库,确保WEB应用较高的可用性。

一、主从复制的前提

 
1、主从复制的前提
1.1 两台以上mysql实例
   多台物理机
   多个mysql实例
1.2 主库要开启二进制日志,建议从库也开启二进制日志

1.3 主库要提供复制相关的用户
    replication slave,一个比较特殊的权限
    grant replication slave on *.* to repl@'10.0.0.%' identified by '123456';
1.4 从库需要将和主库相差的数据,进行追加
    一般情况是手动备份主库数据,恢复到从库上
1.5 从库恢复到主库备份的时间点,开始自动从主库获取新的二进制日志开始应用
    因此需要人为告诉从库,从哪开始自动开始复制二进制日志(file+position),另外还需要告诉从库user,passwd,port,ip
    
mysql>CHANGE MASTER TO
  MASTER_HOST='主库的ip地址',
  MASTER_USER='replication的用户名',
  MASTER_PASSWORD='replication用户名的密码',
  MASTER_PORT=3306,端口号
  MASTER_LOG_FILE='master2-bin.001',binlog日志
  MASTER_LOG_POS=4, position号
  MASTER_CONNECT_RETRY=10; 连接次数

二、主从复制的线程及文件

1、主库线程
Dump(IO) thread:在复制过程中,主库发送二进制日志的线程
2、从库线程
IO thread:向主库请求二进制日志,并且接受二进制日志的线程
SQL thread:执行请求过来的二进制的线程

3、主库文件
binlog文件(mysql-bin.000001文件):主库的二进制日志
4、从库文件
relaylog(vm01-relay-bin.000001):中继日志,存储请求过来的二进制日志
master.info:
    1、从库连接主库的重要参数(user,passwd,ip,port)
    2、上次获取过的主库二进制日志的位置
relay-log.info
    存储从库SQL线程已经执行过的relaylog日志位置

三、主从复制原理

 

主从复制的工作原理
1 从库,IO线程,读取master.info中的信息,
    获取到连接参数(user\passwd\ip\port)+上次请求过的主库的binlog的位置(例子:mysql-bin.000003,position=640)
2 IO线程使用链接到主库,拿着位置信息(mysql-bin.000003,position=640),问主库有没有比这个更新的二进制日志。
3 主库查询二进制日志,并对比从库发送过来的位置信息(mysql-bin.000003,position=640),如果有新的二进制日志,会通过
    dump thread发送给从库。
4 从库通过IO线程,接受主库发来的二进制日志,存储到TCP/IP缓存中,并且返回“ACK”确认给主库,这时主库收到ACK后,
    就认为复制完成了,可以继续其他工作了。
5 从库更新master.info,二进制日志位置更新为新的位置信息。
6 从库IO线程会将TCP/IP缓存中的日志,存储到relay-log中继日志文件中。
7 从库SQL线程,读取relay-log.info,获取到上次执行到的relaylog日志位置,以这个位置信息作为起点,往后继续执行中继日志。
8 SQL线程执行完成所有relaylog之后,会更新relay-log.info信息为新位置信息。

到此为止,一次完整的复制过程就完成了。

第一次主从复制

1.change master to 时,master端ip、port、user、password、binlog、position写入到master.info进行记录
2. start slave 时,从库会启动IO线程和SQL线程
3.IO_T,读取master.info信息,获取主库信息连接主库
4. 主库会生成一个准备binlog DUMP线程,来响应从库
5. IO_T根据master.info记录的binlog文件名和position号,请求主库DUMP最新日志
6. DUMP线程检查主库的binlog日志,如果有新的,TP(传送)给从从库的IO_T
7. IO_T将收到的日志存储到了TCP/IP 缓存,立即返回ACK给主库 ,主库工作完成
8.IO_T将缓存中的数据,存储到relay-log日志文件,更新master.info文件binlog 文件名和postion,IO_T工作完成
9.SQL_T读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点,回放relay-log
10.SQL_T回放完成之后,会更新relay-log.info文件。
11. relay-log会有自动清理的功能。
细节:
1.主库一旦有新的日志生成,会发送“信号”给binlog dump ,IO线程再请求

 

posted @ 2020-12-03 11:31  yaowx  阅读(261)  评论(0编辑  收藏  举报