MySQL主从复制(12)从库扩展与架构调整
当单节点MySQL或者主从架构下读压力较大的场景中,可能需要将复制拓扑扩展为一主多从的架构来缓解单个从库的读访问压力。甚至为了提高复制性能,除了单纯的对从库进行扩展以外,还可以增加一个中间库,将架构变为主-主-从*N的级联复制。使用级联复制的架构可以减轻主库的压力,让主从仅仅负责一个从库的同步请求,更多的从节点都是通过中间的主库来完成同步。
一、单节点MySQL扩展为主从架构步骤
1、主服务器需要保证binlog开启,具体配置可参考《MySQL主从复制(1)基于binlog的传统主从复制》文章中binlog相关设置部分。
2、通过mysqldump或者xtrabackup导出主库当前数据
mysqldump -u root --master-data=2 --single-transaction --databases database1 database2 >/mysqldata.sql # 如果非innodb引擎,先开启一个会话进行锁表再执行导出操作,防止导出数据中途插入了新内容(该终端不要退出,否则锁表会中止) # flush tables with read lock;
3、在Slave服务器上导入Master的备份数据
mysql -u root < /mysqldata.sql
4、在Master服务器上做授权操作
grant replication slave on *.* to 'repuser'@'192.168.1.110' identified by '123456' flush privileges
5、在Slave节点配置同步信息,binlog的position信息根据备份方法不同,查询方法也不同
· 基于binlog的主从复制
change master to master_host='192.168.1.100',master_user='repl',master_password='123456',master_binlog_file='xxxxx',master_position=xxxxxxxx;
· 基于GTID的主从复制
reset master #清空当前从节点自己的binlog,避免导入备份的时候因为存在GTID信息而导入失败 set global GTID_PURGED='GTID........' #该信息通过xtrabackup_slave_info可以查到 change master to master_host='192.168.1.100',master_user='repl',master_password='123456',master_auto_position=1;
6、从服务器上执行SQL语句,如果Slave_IO_Running和Slave_SQL_Running两项的工作状态为yes就代表成功了
mysql > start slave mysql > show slave status\G
二、传统一主多从并行复制调整为级联串行复制(主-主-从*N的架构,减轻主库压力)
架构从主库1-->从库1,主库1-->从库2的架构调整为主库1-->从库1-->从库2
1、在2个从库建立同名库如testdb,然后在主库也建立该库,故意让从库故障,保证2个从库都执行到主库同一个事务,数据一致
set sql_log_bin=0; #从库先关闭binlog create database testdb;
2、在从库1查看binlog信息,该库需要保证开启了log_slave_update,这样主库的事务才会同步到从库的binlog中,然后作为级联复制的中间库
show master status \G
3、在从库2重新配置主从信息,将主库指向从库1
stop slave; reset slave all; change master to master='从库1IP',......master_log_file='xxxxxx.00000x',msater_log_pos=xxxxxxxx; start slave;
4、在从库1和从库2删除掉那个测试数据库
set sql_log_bin=0; #从库先关闭binlog drop database testdb
5、从库1启动复制线程,这个时候由于导致之前复制冲突的数据库已经被删除了,所以主库的建库语句能正常执行,从库1也恢复正常,从库2也恢复正常
三、GTID一主多从并行复制调整为级联串行复制
架构从主库1-->从库1,主库1-->从库2的架构调整为主库1-->从库1-->从库2
1、停止从库2,并指向从库1为主库,由于GTID特性,可以少去很多手动配置的步骤,非常简单
stop slave; reset slave all; change master to master_host='从库1',master_user='xxx',master_auto_position=1; start slave;
评论