我们正在进行长距离和有限带宽的异地 mysql 复制 - 延迟约为 200ms、约 70KB/s(最大)。
复制工作偶尔进行,传输几十千字节然后重新连接。
我已将问题追溯到客户端上的 mysqld 守护进程的不良 tcp/ip 行为 - 当单个 tcp/ip 数据包丢失时,整个 ACK/重传序列无法恢复连接,并且服务器在某些时候会发出 FIN。
值得注意的是,来自同一服务器的 scp 可以正常工作(即使偶尔会发生数据包丢失)。
从客户端机器到服务器的 Mysql 客户端也正常工作并且偶尔的数据包丢失不会中断连接。
服务器和客户端都具有相同版本的mysql服务器:
mysql> SHOW VARIABLES LIKE '%version%';
+-------------------------+---------------------+
| Variable_name | Value |
+-------------------------+---------------------+
| protocol_version | 10 |
| version | 5.0.67-0ubuntu6-log |
| version_comment | (Ubuntu) |
| version_compile_machine | x86_64 |
| version_compile_os | debian-linux-gnu |
+-------------------------+---------------------+
5rows in set (0.21 sec)
这可能是由于 TCP/IP 尝试将 TCP/IP 窗口提高到连接允许的范围之外时发生的数据包丢失造成的吗?
答案1
我最终使用了 ssh 隧道(并稍微调整了复制设置)——效果很好:
ssh -L 3307:localhost:3307 root@the-replication-master-server
额外的好处是复制流是加密的。