读写分离之同步延迟测试

背景

读写分离是快速提高数据库性能的手段,主库只负责写入,从库负责查询。但在性能得到提升的同时,编程的复杂度就会提升。由其碰到主从同步延迟的情况,在数据写入后,在从库无法读取到最新数据,会对业务逻辑造成很大的影响。那么,我们如何发现主从延迟对业务有什么延续呢,那就需要人为的制造延迟,将问题暴露出来。

制造主从延迟

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也能达到一样的效果。

参考