如何将mysql数据库流量镜像到另一台服务器

时间:2019-01-12 06:11:33

标签: mysql iptables

我在Cent OS 7中有两个服务器Mysql数据库。服务器A(192.168.0.1)是实时服务器,服务器B(192.168.0.2)是测试服务器。我想将流量从服务器A镜像到服务器B。我使用了以下命令:

Server A) iptables -A PREROUTING -t mangle -p tcp --dport 3306  -j TEE --gateway 192.168.0.2
Server A) iptables -A POSTROUTING -t mangle -p tcp --dport 3306  -j TEE --gateway 192.168.0.2

Server B) iptables -t nat -A PREROUTING -p tcp -d 192.168.0.1 --dport 3306 -j DNAT --to 192.168.0.2

我的问题出现在服务器B中。在服务器B中,当我在端口3306上看到tcpdump时,我在服务器A上看到了相同的数据包。换句话说,tcpdump的结果在两个服务器上都相同。

我在网上搜索了几天,并尝试了几种解决方案。解决方案之一是lo接口上服务器B中服务器A的define地址IP。我做到了,但是没用。服务器B中的MySQL未命中数据包,并且我看不到任何已建立的连接。

我看到this页并使用了它,但是此解决方案在服务器A上有开销,并且连接数是3倍。

我的问题有解决方案吗?

3 个答案:

答案 0 :(得分:1)

如果您只是想使两个服务器的数据库保持同步,那为什么不只使用MySQL复制并使Server B成为Server A的副本/从属服务器呢?

至少在那种情况下,如果连接故障并且复制被停止(或暂时滞后),则可以对其进行修复,并且可以启动副本以与主数据库同步。如果您丢失了服务器A和服务器B之间的网络连接,而只是使用来自服务器A的重复网络流量“喷雾”了服务器B,则无法保证您的数据集将真正保持同步。

检查文档以配置两台服务器之间的复制: https://dev.mysql.com/doc/refman/8.0/en/replication.html

答案 1 :(得分:0)

您根本无法通过镜像TCP流来做到这一点。

您需要一个额外的“外部”工具,或者是为此目的而设计的代理(如果有这样的事情-我对此策略表示怀疑,因为这样的方法不必要地会使生产环境复杂化,但是它可能Percona Query Playback¹之类的东西使用MySQL慢查询日志,以便在活动服务器完成后立即从活动服务器中捕获每个查询,然后在辅助服务器上重播它。

使用Slow Query Log(我怀疑)是因为它比General Query Log更加干净,易于解析,因为它很难机器解析并且不能提供很多有用的信息。

(@) My first example will be numbered (1). (@) My second example will be numbered (2). Explanation of examples. (@) My third example will be numbered (3). 设置为@@long_query_time可以说服MySQL Server考虑将所有所有查询视为满足“慢”条件的条件,因此有资格写入慢日志中。

>

您还可以使用相同的策略来设计自己的实用程序,以实现完全相同的目的-通过拖尾该文件来读取日志,并使用客户端线程池(在适当的情况下)提交查询以在辅助服务器上执行并行性)。


¹ Percona查询播放仅作为示例,而不是认可。我已经阅读了有关此实用程序的信息,但不记得我过去是否实际使用过。

答案 2 :(得分:0)

我得出结论,使用iptables不能做到这一点,因为我需要在测试服务器和客户端计算机之间创建会话。

我决定使用proxysql,因为该实用程序具有镜像流量工具。

谢谢