使用autossh隧道实现mysql的同步
一、准备知识
1.1 什么是 autossh?
假设有两台主机: A 主机为外网,B 主机为内网
通常来说外网主机 A 是无法直接连接到内网主机 B 的,这时如果要实现 A 主机通过 ssh 连接 B 主机,通常来说有两种方法:
- 端口映射: 将 B 主机的 ssh 端口映射到 B 的外网 ip,当然这要通过设置防火墙来实现
- ssh 的反向连接: B 主机通过 ssh 连接到 A 主机,并在 A 主机上打开一个端口进行监听。这时如果 A 主机连接本机的这个端口就可以实现控制 B 主机
ssh -NfR 1111:localhost:2222 user1@外网主机A -p22
2222 为 A 主机在 B 打开的监听端口,1111 为 A 主机本地的端口,这时访问 B 主机的 2222 端口就映射在 A 主机的 1111 端口了。这个也叫远程端口映射。
这种反向连接很有用,但是很不稳定,经常断开。每次断开都要重新执行上面的命令,如果想要断开时自动执行这个命令,这就需要 Autossh 来完成了。
1.2 为什么要使用 ssh 来完成 mysql 的主从同步?
和上面的情况一样,一台内网主机要和一台外网主机做主从同步
二、实现步骤
2.1 生成密钥
登陆内网主机 B 上执行下面的命令来生成 ssh 密钥,一路回车就可以
ssh-keygen -t rsa
2.2 上传密钥
将内网主机 B 生成的 pub 文件上传到 A 主机
ssh-copy-id -i .ssh/id_rsa.pub user@外网主机A
或者将 id_rsa.pud 文件 scp 过去,执行
cat id_rsa.pub >> ~/.ssh/authorized_keys
2.3 启用证书
编辑 A 主机上的 /etc/ssh/sshd_config, 去掉以下三行的注释:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
2.4 测试登陆
这时 B 主机 ssh 到外网 A 主机就使用证书登陆了,不用输入密码了
2.5 安装软件
这里就用到了上面的 autossh,内网主机 B 需要安装 autossh,A 主机不需要
wget http://www.harding.motd.ca/autossh/autossh-1.4c.tgz
tar -xf autossh-1.4c.tgz
cd autossh-1.4c
./configure
make install
2.6 端口映射
在内网主机 B 上使用 autossh 将本机的 13306 端口映射到外网主机 A 的 3306 端口
autossh -M 20522 -f -N -L 13306:localhost:3306 user@外网主机A
2.7 mysql 同步
这时就可以使用本机的 13306 端口进行 MySQL 服务器的同步了
MySQL 服务器如何配置主从同步请参见:
http://www.nixops.me/mysql-server-replication-config.html
参考文档
http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html
autossh -M 20522 -f -N -L 13306:localhost:3306 user@外网主机A
我在进行这一步的时候及其没有任何反应,去外网试着登录返回No route to host,博主可以给点建议么?
No route to host 是网络层 不通
最后在内网主机上使用autossh是用内网本机的3306端口映射到外网的13306端口吧?这条命令autossh -M 20522 -f -N -L 13306:localhost:3306 user@外网主机A 不是在内网服务器上运行的么?那么localhost后面的端口号难道不是内网服务器的?
... 使用autossh隧道实现mysql的同步[...]