我们在 EC2 上使用 Percona mysql,并为 HA 设置了主/从设置。我们观察到,随着我们不断地在主服务器中写入数据,到从服务器的复制总是在数小时甚至数天后落后,因为这是我们应用程序的本质。
这里可能有什么问题?
我们在 EC2 上使用 Percona mysql,并为 HA 设置了主/从设置。我们观察到,随着我们不断地在主服务器中写入数据,到从服务器的复制总是在数小时甚至数天后落后,因为这是我们应用程序的本质。
这里可能有什么问题?
首先,想想 MySQL Replication 是如何组织的
Slave IO Thread:它负责保持与 Master 的持续连接。它准备好从 Master 的 binlogs 接收 binlogs 事件,并在 Slave 的中继日志中以FIFO样式收集它们。
Slave SQL Thread:负责读取存储在中继日志中的binlog事件。事件(DML、DDL 等)在此内部线程上执行。
Seconds_Behind_Master
:每个binlog事件都有事件的时间戳(DML、DDL等)。Seconds_Behind_Master
只是从服务器的NOW()减去事件的时间戳。Seconds_Behind_Master
显示在 中SHOW SLAVE STATUS\G
。
如果Seconds_Behind_Master
一直在增加,请考虑以下几点: MySQL Replication 的 binlog 事件的单线程执行路径无非是在 Master 上并行执行的所有 SQL 命令的序列化。想象一下:如果在 Master 上并行执行 10 个 UPDATE 命令并且每个需要 1 秒来处理,它们将被放置在中继日志中并执行FIFO样式。所有更新都具有相同的时间戳。减去 Slave 上处理的每个 UPDATE 的时间戳会产生 1 秒的Seconds_Behind_Master
. 乘以 10,您将获得 10 秒的复制延迟。这揭示了 SQL 线程是一个瓶颈。