我正在尝试从外部 MySQL 主服务器复制到 RDS 实例。我并不想通过互联网以明文形式发送数据,因此我有一个 EC2 实例,并在其上设置了 ssh 隧道。该隧道在 EC2 实例上打开端口 3307,并连接到运行目标主 MySQL DB 的外部实例。从该 EC2 实例,我可以运行
mysql -u <user> -p -h 127.0.0.1 -P3307
并连接到目标远程数据库。一切顺利。此外,我可以毫无问题地从此实例连接到 RDS 数据库。
我遇到的问题是,当我在 RDS 实例上设置复制参数时,我无法连接到远程实例。我正在做一些类似的事情(从可以访问两个数据库的 EC2 实例):
mysql.rds_set_external_master('<host>', 3307, 'repl_user', '<repl_pass>', 'mysql-bin.000001', 107, 0);
...其中有 'localhost'、'127.0.0.1'、EC2 实例的私有 DNS 名称、私有 IP、公共 IP 和公共 DNS。每次尝试时,运行SHOW SLAVE STATUS\G
都会显示类似以下内容的错误:
Last_IO_Error: error connecting to master 'repl_user@<host>:3307'
我的问题是:运行 rds_set_external_master 调用时,主机是相对于发送调用的客户端还是相对于 RDS 实例?如果是后者,我该如何隧道连接到我的远程实例?
答案1
好的,让任何处于我这种境地的人都从中吸取教训。设置隧道时,如果您不指定机器的 IP(或 0.0.0.0),它将绑定到环回,因此对于生成它的实例而言是私有的。
做这个:
ssh -N -f -L *:3307:<external IP>:3306 user@remote