MySQL一主两从和级联架构要怎样切换?

科技   2024-12-03 12:30   上海  

下个月就过年了,给大家拜个早年哈,小编也争取过年前多更新几期

在生产环境,我们可能会有一主多从(如下图左边的这种场景)的情况,多个从库提供查询。

有时候,可能会调整架构,比如把一主两从改成主从从。

主从从这种架构我们称为级联(如下图右边的这种场景):

我们来简单过一下原理,可能有点绕,如果看不懂没事,可结合下方视频理解,包括了实验(是DBA体系课的复制部分,整章是开放免费试看的)。

https://www.imooc.com/learn/1397


1 位点复制:一主两从架构切换成级联架构

如果我们要把左边的一主两从架构切换成右边的级联架构。

可以先停掉S2的复制;

再停S1的复制,这时候记录S1的位点以及对应主库M的位点;

说明S1这个时候的数据,跟对应主库的那个位点的数据,是一样的;

这个时候就可以启动S1的复制了;

再开启S2的同步,通过start slave UNTIL,同步到S1刚才记录的主库位点,命令举例:

start slave UNTIL MASTER_LOG_FILE ="mysql-bin.000049",  MASTER_LOG_POS=1277;


在停掉S2的同步;

把复制直接挂到S1上,位点就是刚才S1停掉复制的时候,本身记录的位点信息,然后启动复制。命令举例:

stop slave;
change master to master_host='192.168.152.30',MASTER_USER='repl',MASTER_PASSWORD='xxxxxx',master_log_file='mysql-bin.000050',master_log_pos=1281;
start slave;


其实还有一个方法,就是同时(比如xshell多端口执行命令)在S1和S2执行stop slave;

如果对应主库位点都一致,那直接查看S1自己的位点,然后S2接到S1上就行。


2 位点复制:级联架构改成一主两从架构

如果要把右边的级联架构改成左边的一主两从架构。

S1先停掉复制;

再查看S1当前位点以及对应主库的位点信息,此时因为复制已经停掉的,所以位点信息也一直是静态的;

在S2中,执行:

show slave status\G


查看此时对应S1的位点;

如果这里看到的S1位点信息和刚才S1自己看到的位点信息一致;

就说明S2已经追到S1停止复制的那个位点了;

就可以停止S2的复制;

再启动S1的复制;

再把S2的复制接到M上;

接的位点,就是刚才S1看到主库M上对应的位点信息。

命令如下:

change master to master_host='192.168.152.70',MASTER_USER='repl',MASTER_PASSWORD='xxxxxx',master_log_file='mysql-bin.000049',master_log_pos=1277;
start slave;



3 GTID复制:架构调整

从库直接change master到新的主库就行,不需要自己去找位点,命令如下:

stop slave;
change master tomaster_host='192.168.152.70',master_user='repl',master_password='xxxxxx',MASTER_AUTO_POSITION=1;
start slave;


4 一个实战问题

前几天,社群一个朋友问:

A->B->C级联复制,B库崩溃,怎么设置A->C的主从复制?


这个问题,要分是不是GTID。

如果是GTID,其实change master就行。

如果是基于位点的复制,那需要想办法找到C实例最后一个写入事务对应A的位点。

这个可以解析奔溃前后A的Binlog,找到对应的事务,具体怎么判断,可以看事务内容,也可以对比事务的时间戳。

找到位点之后,就 change master 主库A 下一个事务位点。


5 总结

当然,如果有一些自动化管理工具,可能更方便,比如Orch,直接页面拖拽就可以把级联切换成一主多从。

如果没有管理工具,还是建议换成GTID模式,很多时候维护会方便很多。


MySQL数据库联盟
关注后,回复“高可用”,可获取8篇MySQL高可用文章
 最新文章