背景
读写分离是快速提高数据库性能的手段,主库只负责写入,从库负责查询。但在性能得到提升的同时,编程的复杂度就会提升。由其碰到主从同步延迟的情况,在数据写入后,在从库无法读取到最新数据,会对业务逻辑造成很大的影响。那么,我们如何发现主从延迟对业务有什么延续呢,那就需要人为的制造延迟,将问题暴露出来。
制造主从延迟
Mysql的主从配置支持设置主从延迟时间change replication source to source_delay = interval;
interval是以秒来计算。下面我们测试一下这个配置的效果。
服务器配置
Mysql 8.0.35
主库服务器:192.168.0.101
从库服务器:192.168.0.102
在从库上配置主库信息,并设置延迟时间为30秒,然后查看从库状态,就能看到同步已经就绪。
mysql> change replication source to master_host ='192.168.50.101',master_port =3306,master_user ='sync',master_password ='Abcd123!',master_log_file ='binlog.000002',master_log_pos =2266,source_delay = 30;
mysql> start slave;
mysql> show slave status\\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.50.101
Master_User: sync
**Slave_IO_Running: Yes
Slave_SQL_Running: Yes
SQL_Delay: 30**
在主库创建一个表,并插入一条数据。
mysql> create table t1 (id bigint);
mysql> insert into a values (2);
再查看从库状态,发现从库已经开始延迟了Seconds_Behind_Master表示延迟时间22秒,SQL_Remaining_Delay表示延迟同步还剩余9秒,Slave_SQL_Running_State表示线程状态在等待延迟结束。
mysql> show slave status\\G
*************************** 1. row ***************************
Seconds_Behind_Master: 22
SQL_Delay: 30
SQL_Remaining_Delay: 9
Slave_SQL_Running_State: Waiting until SOURCE_DELAY seconds after source executed event
通过这个方式,我们就能模拟出主从延迟的效果。
如果要修改延迟时间的话,要先停止同步,再修改配置,然后重新启动同步。
设置主从延迟为60秒
mysql> stop slave;
mysql> change master to source_delay = 10;
mysql> start slave;
注:
Mysql 8.0.23开始使用change replication source to替换change master to语句,如果是之前的版本要使用change master to MASTER_DELAY = interval也能达到一样的效果。
参考
-
change replication source to文档:MySQL :: MySQL 8.2 Reference Manual :: 13.4.2.3 CHANGE REPLICATION SOURCE TO Statement
change master to文档:MySQL :: MySQL 8.2 Reference Manual :: 13.4.2.1 CHANGE MASTER TO Statement