下个月就过年了,给大家拜个早年哈,小编也争取过年前多更新几期
在生产环境,我们可能会有一主多从(如下图左边的这种场景)的情况,多个从库提供查询。
有时候,可能会调整架构,比如把一主两从改成主从从。
主从从这种架构我们称为级联(如下图右边的这种场景):
我们来简单过一下原理,可能有点绕,如果看不懂没事,可结合下方视频理解,包括了实验(是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 to
master_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模式,很多时候维护会方便很多。