通过SSH隧道进行MySQL复制

时间:2019-10-16 16:16:02

标签: mysql ssh replication

我有一个特殊的情况,我无法在线找到任何资源来解决它,所以去吧。

我有一个给定的服务器A(mysql id = 1)和一个远程mysql服务器B(mysql id = 2)

我有一个从服务器A->服务器B建立的SSH隧道,并且在该隧道中,我将服务器B 3306转发到本地端口(例如1234)

我也没有反向映射的能力,所以我的ssh命令看起来像

ssh -L 1234:远程服务器_b:3306 user @ gateway -i my_key.pem

所以在服务器A上,要连接到服务器B上的mysql,我使用mysql -h127.0.0.1 -P1234,并且我可以无问题地访问mysql服务器B。

现在,我要设置从A(主)到B(从)的复制。但是,我无法从服务器B访问服务器A,只能通过SSH隧道从A-> B访问服务器A。

在所有mysql复制文档中,我需要从从服务器(而不是我的设置中的主服务器)建立SSH隧道

有人知道该怎么做,还是给我一些有关正确方法的文档?

1 个答案:

答案 0 :(得分:1)

要复制数据库,您必须:

  • 完整复制数据库
  • 在从属服务器上将mysql复制流配置为与主服务器和从属服务器连接,并将提取二进制日志。

实施记录在这里。

https://dev.mysql.com/doc/refman/5.6/en/replication-implementation.html

您可以使用SSH到隧道或反向隧道。

ssh中的

隧道可以同时使用,因此您可以将远程端口映射到本地端口,或将远程端口映射到本地端口。

在服务器A上,此命令将建立双隧道。

ssh -R 6464:127.0.0.1:3306 -L 6565:127.0.0.1:3306  serveurB 

ssh的手册页中提取

 -L [bind_address:]port:host:hostport
 Specifies that the given port on the local (client) host is to be 
 forwarded to the given host and port on the remote side.

 -R [bind_address:]port:host:hostport
 Specifies that the given port on the remote (server) host is to be 
 forwarded to the given host and port on the local side.

另一种解决方案是使用功能强大的socat网络工具,因此必须将其安装在服务器B上,并且可以执行此操作

 while ( true ) ; 
 do 
      socat EXEC:"ssh SERVER_B 'socat - TCP4-LISTEN:6464,reuseaddr'"    \
                                                       TCP4:localhost:3306 ;
 done