如果我有两个互相指向的 mysql 主机:主机 A 和主机 B:
------> hostA(write co-master)
|
|
|
-----> hostB (read-only co-master)
当没有任何内容写入主机 B 时,为什么主机 A 会出现复制延迟?我偶尔会在指向只读从属服务器的写入主服务器上看到从属服务器延迟问题:
[root@db17 ~]# mysql -e "show slave status \G" | egrep "(Exec_Master_Log_Pos|Master_Log_File|Read_Master_Log_Pos|Seconds)"
Master_Log_File: binary.108913
Read_Master_Log_Pos: 137400187
Relay_Master_Log_File: binary.108913
Exec_Master_Log_Pos: 137400187
Seconds_Behind_Master: 0
[root@db17 ~]# mysql -e "show slave status \G" | egrep "(Exec_Master_Log_Pos|Master_Log_File|Read_Master_Log_Pos|Seconds)"
Master_Log_File: binary.108913
Read_Master_Log_Pos: 137960791
Relay_Master_Log_File: binary.108913
Exec_Master_Log_Pos: 137960616
Seconds_Behind_Master: 70
[root@db17 ~]# mysql -e "show slave status \G" | egrep "(Exec_Master_Log_Pos|Master_Log_File|Read_Master_Log_Pos|Seconds)"
Master_Log_File: binary.108913
Read_Master_Log_Pos: 138609398
Relay_Master_Log_File: binary.108913
Exec_Master_Log_Pos: 138609398
Seconds_Behind_Master: 0
https://gist.github.com/ethan-riskiq/11b88443450f3fc6e0f8003bda797824获得完整的从属状态输出。运行启用了 GTID 的 Percona mysql 5.7.25。
答案1
为什么当没有任何内容写入 hostB 时 hostA 会出现复制延迟
有点猜测:
数据写入主机A -> 复制到主机B(并且由于启用了日志从属更新) -> 复制到主机A。
hostA 看到事务有其服务器 ID,并知道它不需要应用它们。但是,它仍在将数据写入 Relay_Master_Log_File(服务器 ID 的检查在 sql 线程中完成)。
hostA 似乎存在 I/O 争用。为什么?
- Slave_IO_State:将主事件排队到中继日志
- Slave_SQL_Running_State:从属已读取所有中继日志;等待更多更新