十七、Mysql的主从(一)--主从原理
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线程再请求
I have a dream so I study hard!!!