对于个人站长或小型项目来说,使用两台或多台 VPS 搭建数据库主从同步(例如 MySQL/MariaDB Replication)是提高数据高可用性和读写分离性能的常见做法。此时,一个核心技术决策是:同步流量应该走内网 IP还是外网 IP?
性能对比:内网 IP 遥遥领先
答案非常明确:在同一公有云或同一区域(Region)内的 VPS 之间进行同步,性能最好且最推荐的方式是使用内网 IP (Private IP)。
1. 延迟与带宽
| 特性 | 内网 IP (Private IP) | 外网 IP (Public IP) |
|---|---|---|
| 传输路径 | 云服务商内部高速网络(通常是局域网) | 互联网,需要经过多级路由和运营商网络 |
| 延迟 (Latency) | 极低(通常在 0.1ms ~ 2ms 范围内) | 较高,不稳定(通常 5ms ~ 50ms+) |
| 带宽 (Bandwidth) | 极高(通常 1Gbps, 10Gbps 或更高) | 依赖于你的公网带宽上限,易受限 |
| 费用 | 通常免费(不计流量) | 计费(通常计算出站流量) |
使用内网 IP,数据包无需离开数据中心,享受的是云服务商提供的专属高带宽低延迟网络。这对于依赖实时同步的数据库复制至关重要,能显著降低复制延迟(Replication Lag)。
2. 安全性
使用内网 IP 进行同步,可以将数据库服务(如 MySQL 的 3306 端口)完全不对外网暴露。你只需要在主库上允许来自从库内网 IP 的连接即可,大大降低了被恶意扫描和攻击的风险。
实施步骤:如何配置基于内网 IP 的主从同步
以下配置假设两台 VPS 位于同一地域且具有可互通的内网 IP 地址。主库内网 IP 假设为 192.168.1.10,从库内网 IP 假设为 192.168.1.11。
步骤 1:主库配置绑定内网 IP
编辑主库的 MySQL/MariaDB 配置文件(通常是 /etc/mysql/my.cnf 或 /etc/my.cnf),确保服务绑定到内网 IP 或 0.0.0.0 (如果防火墙配置足够严格)。为了安全性,推荐绑定到内网 IP。
# /etc/my.cnf 或 my.cnf.d/server.cnf
[mysqld]
# 绑定到主库的内网IP
bind-address = 192.168.1.10
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
# ... 其他配置
重启 MySQL 服务使配置生效。
2:创建复制用户并授权(指定从库内网 IP)
登录主库 MySQL,创建专门用于复制的用户,并严格限定该用户只能通过从库的内网 IP 连接。
-- 登录主库 MySQL
CREATE USER 'repl'@'192.68.1.11' IDENTIFIED BY 'your_strong_replication_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';
FLUSH PRIVILEGES;
3:配置防火墙,仅允许内网连接
这是最关键的安全步骤。使用防火墙(如 UFW 或 Firewalld)确保 3306 端口对公网是关闭的,仅对从库的内网 IP 开放。
使用 UFW (Ubuntu/Debian 常用):
# 在主库 VPS (192.168.1.10) 上执行
# 拒绝所有来自外网的 3306 端口连接(如果公网 IP 未被明确拒绝)
# 如果云服务商在安全组层面已拒绝外网,此步骤可跳过
# 仅允许来自从库内网 IP (192.168.1.11) 的 3306 端口连接
sudo ufw allow proto tcp from 192.168.1.11 to any port 3306
sudo ufw enable
4:从库配置连接主库(使用内网 IP)
在从库上启动复制时,CHANGE MASTER TO 命令中的 MASTER_HOST 参数必须指定主库的内网 IP。
-- 登录从库 MySQL
CHANGE MASTER TO
MASTER_HOST='192.168.1.10', -- 使用主库的内网 IP
MASTER_USER='repl',
MASTER_PASSWORD='your_strong_replication_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 替换为实际日志文件
MASTER_LOG_POS=4; -- 替换为实际日志位置
START SLAVE;
SHOW SLAVE STATUS\G
通过上述配置,你的数据库同步将完全运行在高速、安全的内网环境中,从而获得最佳的性能和最低的复制延迟。
汤不热吧