Tac say

只想做个程序演奏家

实验:Mysql Master-slave-standby将source从master切换到standby

尝试了<Mysql High Availability>第四章热备份一节的实验,记录步骤.

先统一原语,master/slave/standby表示三台机器名,source/target代表replication关系的两端(不适用master/slave用以和机器名区分).”master(3)”表示master机器的db里有三条数据1,2,3.

实验开始.

  1. 初始状态是存在master->slave, master->standby的replication
  2. standby在切换成source时,需要有bin-log和replication user. 在此重新设置master->standby的replication, 让standby满足要求.

忽略replication user的部分.

bin-log的部分在my.cnf里要设置log-bin和log-slave-updates(默认情况下,master->standby的replication不会写standby的bin-log,需开始standby的log-slave-updates才会写).

1
2
3
4
5
6
server-id               = 3
log_bin                 = /var/log/mysql/mysql-bin.log
...
relay-log-index         = /var/log/mysql/slave-relay-bin.index
relay-log               = /var/log/mysql/slave-relay-bin
log-slave-updates
  1. 测试一下standby binlog设置成功。可以在master插入一条数据,在standby查看
1
2
3
4
5
6
7
8
9
standby> show binlog events;
+------------------+------+-------------+-----------+-------------+------------------------------------------------------------------------+
| Log_name         | Pos  | Event_type  | Server_id | End_log_pos | Info                                                                   |
+------------------+------+-------------+-----------+-------------+------------------------------------------------------------------------+
| mysql-bin.000001 |    4 | Format_desc |         3 |         107 | Server ver: 5.5.31-0ubuntu0.12.04.1-log, Binlog ver: 4                 |
| mysql-bin.000001 |  107 | Query       |         1 |         166 | BEGIN                                                                  |
| mysql-bin.000001 |  166 | Query       |         1 |         257 | use `tac`; insert into test values(8889)                               |
| mysql-bin.000001 |  257 | Xid         |         1 |         284 | COMMIT /* xid=111 */    
...
  1. 将replication调整至状态master(3),standby(2),slave(1). 人工造成各db的状态不一致
1
2
3
4
5
master> insert into test values(1);
slave> stop slave;
master> insert into test values(2);
standby> stop slave;
master> insert into test values(3);
  1. 想象此时master挂掉,开始将source从master切换成standby

  2. 在建立standby->slave的replication之前,需要将standby和slave数据同步(此时slave落后于standby)。

1
2
3
4
5
6
7
8
9
10
-- 先查看standby从master拿了多少数据
standby> show slave status \G
*************************** 1. row ***************************
...
        Master_Log_File: master-bin.000023
...
        Exec_Master_Log_Pos: 1391
        
-- 让slave从master上同步到跟standby同样的位置
slave> start slave until master_log_file = 'master-bin.000023', master_log_pos = 1391;

有意思的是此处用了master(其实我们假设master已经坏了…)。

  1. 此时可以讲slave的source从master切换到standby. 一个问题就是standby->slave的开始位置可能是和master->slave不同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 查看standby binlog的当前位置
mysql> show master status \G
*************************** 1. row ***************************
    File: mysql-bin.000001 
    Position: 796
    Binlog_Do_DB:
  Binlog_Ignore_DB:
-- 注意与master上的文件名和位置都不同

-- 切换slave的source
slave> change master to 
            master_host = '192.168.50.4', 
            master_port = 3306, 
            master_user = 'repl', 
            master_password = 'repl', 
            master_log_file = 'mysql-bin.000001', 
            master_log_pos = 796;
  1. 测试一下standby->slave replication.

总的思路就是讲master(3),standby(2),slave(1)同步成master(3),standby(2),slave(2),然后将master->slave切换成standby->slave.

遗留了两个问题,其一是slave和standby同步时使用了”坏掉”的master;其二是master超前了standby和slave, 也就是standby->slave丢失了master的超前数据。留待慢慢学习。

Comments