MySQL中延迟复制的实现
作者:妍妍的宝贝
1 MySQL 延迟复制介绍
MySQL 5.7 支持延迟复制,使得 副本服务器故意滞后于源服务器至少一个 指定的时间量。默认延迟为 0 秒。使用 CHANGE MASTER TO 选项设置延迟 到 N
秒:MASTER_DELAY
1.1 延迟复制语法:
CHANGE MASTER TO MASTER_DELAY = N;
1.2 延迟复制可用于多种用途:
为了防止用户在MASTER头上出现错误。DBA 可以滚动 将延迟的SLAVE返回到灾难发生前的时间。
检查数据库很久以前的样子,没有必须重新加载备份。例如,如果延迟为 1 周,DBA 需要查看数据库的外观 在最近几天的发展之前,耽误了可以检查SLAVE。
1.3 延迟复制的有关的参数
SHOW SLAVE STATUS 有三个字段 提供有关延迟的信息:
SQL_Delay
:一个非负整数,表示 副本必须滞后于源的秒数。SQL_Remaining_Delay
:此字段包含一个整数,表示 延迟的剩余秒数。Slave_SQL_Running_State
:一个字符串 指示 SQL 线程的状态(类似于 )。该值等于 将 SQL 线程的值为 由SHOW PROCESSLIST
显示。Slave_IO_State
State
1.4 延迟复制的操作
延迟复制在哪台机子上做呢?是由哪个线程来完成
- 延迟复制时用来控制sql线程的,和i/o线程无关
- 这个延迟复制不是i/o线程过段时间来复制,i/o是正常工作的
- 是日志已经保存在slave端了,那个sql要等多久进行回放
2 MySQL 延迟复制 实操
2.1 实验环境
MASTER/SLAVE | 服务器名称 | IP地址 | server-id |
MASTER | MySQL-01 | 192.168.239.210 | 10 |
SLAVE-1 | MySQL-02 | 192.168.239.220 | 20 |
SLAVE-2 | MySQL-03 | 192.168.239.230 | 30 |
2.2 对 SLAVE --MySQL-3 进行延迟复制操作
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.239.210 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000007 Read_Master_Log_Pos: 194 Relay_Log_File: mysql-3-relay-bin.000007 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000007 Slave_IO_Running: Yes Slave_SQL_Running: Yes Exec_Master_Log_Pos: 194 Relay_Log_Space: 742 Master_Server_Id: 10 Master_UUID: cd27e5ae-5fe3-11ef-a5d8-000c29a51779 Master_Info_File: /data/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL
# 停止 SQL_thread 进程,停止本地回放 mysql> stop slave sql_thread; Query OK, 0 rows affected (0.00 sec) # 改变 本地回放的延迟时间 mysql> change master to master_delay=60; Query OK, 0 rows affected (0.00 sec) # 打开本地回放 sql_thread 进程 mysql> start slave sql_thread; Query OK, 0 rows affected (0.00 sec)
2.3 停止相关进程的原因
为什么要停止本地 sql_thread 进程而不是停止IO_thread呢?
这是由于停止sql_thread 只是 停止的是本地的回放,而不是停止IO_thread的复制。即使停掉本地的回放,IO_thread 进程仍然会对MASTER 的bin-log 进行接收并写入本地的 Relay log,而不是停止写入本地 Relay log 。等待sql_thread进程再次启动进程就会去读取本地Realy log 并 将本地的 Relay log 回放到数据库中。这样子做 能在保证成功修改SLAVE参数的同时也能保持MASTER与SLAVE的数据一致性。
2.4 实验测试
MASTER 上操作
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | ZUCONG | | mysql | | performance_schema | | shuyan | | sys | +--------------------+ 6 rows in set (0.03 sec) mysql> use shuyan; mysql> show tables; +------------------+ | Tables_in_shuyan | +------------------+ | wawa | +------------------+ mysql> select * from wawa; +----+------+ | id | name | +----+------+ | 1 | wawa | +----+------+ mysql> insert into wawa(id,name) values(2,'shuyan');
SLAVE 上 查看
MySQL-02 并没有做延迟复制
mysql> select * from shuyan.wawa; +----+--------+ | id | name | +----+--------+ | 1 | wawa | | 2 | shuyan | +----+--------+
MySQL-03 做了60秒的延迟复制
mysql> select * from shuyan.wawa; +----+------+ | id | name | +----+------+ | 1 | wawa | +----+------+
2.5 动图演示全过程
接下来是一个动图的演示 修改 master_delay 参数并增加master 数据 观察slave延迟复制的过程
到此这篇关于MySQL中延迟复制的实现的文章就介绍到这了,更多相关MySQL 延迟复制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!