MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】

时间:2024-09-18 23:05:56

生产主主复制(A<--->B),和灾备主从复制(B--->C)。当生产出现问题时,数据写入切换到灾备数据库,待生产恢复后,将灾备回写到生产。步骤如下:

1、灾备与生产其中一台建立主主复制,这样生产的那台就成了多源复制

(A<--->B<--->C)

2、在业务闲时,停止web应用,使用户没有连接,或者锁表

3、将业务切回生产

主主复制架构的实现

主主复制架构,可以实现像主从服务器进行写操作,也就是说一个是另一个的主服务器,也是另一个的从服务器。
由于我们上边已经知道172.16.30.6为172.16.30.5的从服务器了,故我们只需知道172.16.30.5为172.16.30.6的从服务器即可。
172.16.30.5服务器的配置:
# vim /etc/my.cnf
在[mysqld]中添加:
auto-increment-increment = 2
auto-increment-offset = 1
如果想实现 主-从(主)-从 这样的链条式结构,需要设置:
log-slave-updates      只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器。
以下这步重启是为了是参数生效,MySQL5.7版本已支持在线修改参数,在线修改参数后需要在my.cnf中添加配置即可
重启服务
# service mysqld restart
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 |              |                  |
+------------------+----------+--------------+------------------+
172.16.30.6服务器的配置:
新建一个用于复制数据的用户:
mysql> grant replication client,replication slave on *.* to repl@'172.16.30.5' identified by '123456';
# vim /etc/my.cnf   
在[mysqld]中添加:
log-bin = mysql-bin
auto-increment-increment = 2
auto-increment-offset = 2
重启服务:
# service mysqld restart
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 |              |                  |
+------------------+----------+--------------+------------------+
主从服务器接下来指定对另一台服务器为自己的主服务器即可:
172.16.30.6服务器的指向:
mysql> stop slave;
mysql> change master to master_host='172.16.30.5',master_user='repl',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=107;
开启从服务进程:
mysql> start slave;
172.16.30.5服务器的指向:
mysql> change master to master_host='172.16.30.6',master_user='repl',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=107;
开启从服务进程:
mysql> start slave;
在172.16.30.6和172.16.30.5服务器上分别查看从服务进程的运行状态:
mysql> show slave status\G
如果出现如下两行,则说明工作正常:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果master status是变的,可以用以下锁表的方法
mysql> FLUSH TABLES WITH READ LOCK;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     4136 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3)执行主张同步操作
先在slave数据库上做同步master的设置。(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)
mysql> unlock tables;     //先解锁,将对方数据同步到自己的数据库中
mysql> slave stop;
mysql> change master to master_host='182.148.15.238',master_user='slave',master_password='slave@123',master_log_file='master-bin.000001',master_log_pos=1970;
mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 182.148.15.238
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1970
               Relay_Log_File: mysql-relay-bin.000003
                Relay_Log_Pos: 750
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ..................
这样就实现了slave->master的同步环境。
再在master数据库上做同步slave的设置。(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)
mysql> unlock tables;
mysql> slave stop;
mysql> change master to master_host='182.148.15.237',master_user='slave',master_password='slave@123',master_log_file='master-bin.000001',master_log_pos=4136;
mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 182.148.15.237
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 4136
               Relay_Log_File: mysql-relay-bin.000003
                Relay_Log_Pos: 750
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ..................
这样就实现了master->slave的同步环境。至此,主主双向同步环境已经实现!
参考:
mysql主从复制,半同步,主主复制架构的实现-佳-51CTO博客 http://blog.51cto.com/leejia/831772
Mysql主从同步(1)-主从/主主环境部署梳理 - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/6256603.html
异地灾备为主时,恢复时可以使用先将生产设置为灾备的从,搭建成多源复制
MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】
MySQL 5.7的多源复制 - GoogSQL - 博客园 https://www.cnblogs.com/xuanzhi201111/p/5151666.html