由于阿里云云数据库RDS只读实例采用MySQL原生的基于Binlog的复制技术(异步复制或半异步复制),必然会有同步延迟。延迟会导致只读实例与主实例的数据出现不一致,从而导致业务出现问题。另外延迟也有可能引起Binlog堆积,导致只读实例空间被迅速消耗。本文介绍常见的导致延迟时间变长的场景。
说明:若主实例正产生大量的Binlog,这种情况下有可能会使只读实例被锁定。
常见的几种导致延迟时间变长的问题原因如下:
主实例执行一个涉及数据量非常大的update、delete、insert…select、replace…select等事务操作时,会生成大量的Binlog数据并同步到只读实例。只读实例需要花费与主实例相同的时间来完成该事务,因此会导致只读实例同步延迟。例如在主实例上执行一个持续80秒的删除操作,只读实例进行相同操作时也需要花费很长时间,于是会出现延迟情况。
阿里云提醒您:
- 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
- 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
- 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
当只读实例出现延迟时,可以根据以下排查方法定位问题:
show slave status \G
命令,确定是否存在元数据锁。show engine innodb status\G
语句查看,或者执行show open tables
语句后,查看输出结果的in_use列的值为1的表。本节列出以下四种常见的解决方法,您可以根据排查方法定位的问题原因选择对应的解决方法:
建议您升级只读实例规格,使只读实例的配置大于或者等于主实例的配置,避免由于只读实例规格较小导致延迟,详情请参见变更配置。
确认主实例的TPS是否正常,如果TPS过高,则需要对业务进行优化或者拆分,保证主实例的TPS不会导致只读实例出现延迟。TPS相关数据可以通过自治服务的性能趋势页面查看,详情请参见性能趋势。
show processlist
语句定位具体的线程。 show slave status \G系统显示类似如下。
show processlist
语句,确认SQL线程的状态为“waiting for table metadata lock”。kill
命令终止只读实例上引起阻塞的会话,恢复只读实例和主实例的数据同步,详情请参见解决MDL锁导致无法操作数据库的问题。