环境设定
假设有3台MySQL服务器,分别为Master
,Standby
,Slave
.
其实Standby
也是一个Slave,只是叫法不一样而已.
切换Master原理
切换Master的一个基本思路就是:Slave和Standby在完全相同的位置停止运行,然后把Slave重定向到Standby.
模拟真实场景
场景准备
当数据量大时,Standby
和Slave
的数据可能不一样
(如其中一个快的把Master
的完全同步好,另外一个同步进度稍微落后)
即Slave和Standby不在完全相同的位置停止运行.
现假定Slave
稍微落后,连上Slave
,执行
stop slave;
show slave status\G
确认slave已经停掉
Slave_IO_Running: No
Slave_SQL_Running: No
在Master
上执行一些sql操作
Master >insert into init.test (id) values(1),(2),(3);
分别在Standby
和Slave
查看是否有数据改变
结果如下
Slave > select * from init.test;
Empty set (0.02 sec)
Standby > select * from init.test;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
此时,Standby
和Slave
的同步进度就不一样.
Standby > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 454
...
Slave > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 210
...
Standby
执行到454,Slave
执行到210,Standby
超前于Slave
.
切换Master
停掉Standby的slave
Standby > stop slave;
使Standby
和Slave
停在完全相同的位置上.根据前面的场景准备得到它们的位置.
然后执行
Slave > start slave until
-> master_log_file = 'master-bin.000001',
-> master_log_pos = 454;
Slave > select master_pos_wait('master-bin.000001',454);
Slave > stop slave;
此时再查看Slave
的slave状态,应该与Standby
一样了.
Slave > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 454
...
现在把Standby
切换成新的主服务器.
把Slave
连接到Standby
并重启slave.
因为Master
在停止运行点记录的文件和位置与Standby
在同一点记录的文件和位置是完全不同的,有必要获取当Master
记录更改时Standby
记录的位置.
为此,在Standby
上运行
Standby > show master status\G
*************************** 1. row ***************************
File: master-bin.000006
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
获得位置信息后
在Slave
上执行
Slave > CHANGE MASTER TO
-> MASTER_HOST = '127.0.0.1',
-> MASTER_PORT = 3309,
-> MASTER_USER = 'repl_user',
-> MASTER_PASSWORD = 'root',
-> MASTER_LOG_FILE='master-bin.000006',
-> MASTER_LOG_POS=107;
Query OK, 0 rows affected (0.16 sec)
Slave > start slave;
现在Standby
就可以作为Master使用了.
还不快抢沙发