1600 字
8 分钟

MySQL主从复制(一主多从)+LVS RD负载均衡

2026-01-20
浏览量 加载中...

🌟 前言#

MySQL 主从复制是一种数据库复制技术,用于在主数据库 (Master) 和一个或多个从数据库 (Slave) 之间同步数据。
这种技术允许数据从主数据库复制到从数据库,实现数据的冗余存储和读写分离,从而提高数据库的可用性和扩展性。

🧱 环境准备#

1. 主机信息#

主机名IP 地址角色
mysql-master192.168.25.252control-plane
192.168.25.252Manager-IP
192.168.25.100VIP
mysql-Slave01192.168.25.253Slave
mysql-Slave02192.168.25.254Slave

应用程序连接方式: 应用程序连接到 LVS 负载均衡器的 VIP 地址,由负载均衡器将请求分发到 MySQL 主从复制集群中的一个节 点。

  • 写操作: 192.168.25.253:3306 (直连主库的管理IP)
  • 读操作: 192.168.25.100:3306 (连接VIP,由主库上的LVS进行负载均衡到从库)

🔧 第一步: 所有节点通用配置(master + slave)#

1. 关闭防火墙(或放行必要端口)#

Terminal window
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl is-active firewalld
systemctl status firewalld

2. 关闭SELinux#

Terminal window
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

3. 配置主机名和hosts#

Terminal window
# 在 master 上
hostnamectl set-hostname mysql-master
# 在 node1 上
hostnamectl set-hostname mysql-slave01
# 在 node2 上
hostnamectl set-hostname mysql-slave02

然后在 所有节点/etc/hosts 中添加以下内容:

Terminal window
cat >> /etc/hosts <<EOF
192.168.25.252 mysql-master
192.168.25.253 mysql-slave01
192.168.25.254 mysql-slave02
EOF

4. 各节点免密配置#

Terminal window
# 在每个节点上先执行以下命令,创建 SSH 密钥对
ssh-keygen -t rsa
/root/authorized.sh
# 编写一键配置脚本
#!/bin/bash
NODES=("192.168.25.252" "192.168.25.253" "192.168.25.254")
ME=$(hostname -I | awk '{print $1}')
[ ! -f ~/.ssh/id_rsa ] && ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
mkdir -p ~/.ssh
chmod 700 ~/.ssh
> /tmp/cluster_keys
for ip in "${NODES[@]}"; do
if [[ "$ip" == "$ME" ]]; then
cat ~/.ssh/id_rsa.pub >> /tmp/cluster_keys
else
ssh -o StrictHostKeyChecking=no root@$ip 'cat ~/.ssh/id_rsa.pub' >> /tmp/cluster_keys 2>/dev/null || \
(echo "请先在 $ip 上运行 ssh-keygen" && exit 1)
fi
done
sort -u /tmp/cluster_keys -o /tmp/cluster_keys
for ip in "${NODES[@]}"; do
scp /tmp/cluster_keys root@$ip:/root/.ssh/authorized_keys
ssh root@$ip "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && restorecon -R ~/.ssh"
done
echo "✅ 免密互信配置完成!"

5. 添加 MySQL 仓库#

TIP

可以从这个网站选择对应的版本 https://repo.mysql.com/

Terminal window
wget https://repo.mysql.com/mysql-community-release-el7-7.noarch.rpm
rpm -ivh mysql-community-release-el7-7.noarch.rpm

执行完毕后可以查看yum源文件 /etc/yum.repos.d/
会多出两个 MySQL 开头的 repo

Terminal window
# 同步 mysql80.repo 到所有节点
for ip in 192.168.25.25{2..4};do
scp /etc/yum.repos.d/mysql-*.repo root@$ip:/etc/yum.repos.d/
done
# 每个节点都执行,刷新yum源
yum repolist

🐳 第二步: 安装MySQL并配置主从复制(master和slave都执行)#

1. 安装MySQL#

Terminal window
yum install mysql-community-server

2. 编辑MySQL配置文件(master节点)#

Terminal window
mkdir -p /opt/mysql_log
chowm -R mysql.mysql /opt/mysql_log
/etc/my.cnf
[mysqld]
server_id = 1
log_bin = /opt/mysql_log/master
gtid_mode = on
enforce_gtid_consistency = on
Terminal window
systemctl enable --now mysqld
grep -i password /var/log/mysqld.log # 查询初始密码
mysql -uroot -p # 登陆MySQL
alter user 'root'@'localhost' identified by 'WWW.1.com';
CREATE USER 'repl'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD IDENTIFIED BY 'WWW.1.com';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
flush privileges;

3. 编辑MySQL配置文件(slave01 && slave02节点)#

Terminal window
mkdir -p /opt/mysql_log
chown -R mysql.mysql /opt/mysql_log
/etc/my.cnf
[mysqld]
server_id = 2 # 每个节点的server_id必须不同
log_bin = /opt/mysql_log/slave
gtid_mode = on
read_only = on
enforce_gtid_consistency = on
Terminal window
systemctl enable --now mysqld
grep -i password /var/log/mysqld.log # 查询初始密码
mysql -uroot -p # 登陆MySQL
alter user 'root'@'localhost' identified by 'WWW.1.com';
CHANGE MASTER TO
MASTER_HOST='192.168.25.252',
MASTER_USER='repl',
MASTER_PASSWORD='WWW.1.com',
MASTER_AUTO_POSITION=1;
start slave;
show slave status\G;

查看 Slave_IO_Running: YesSlave_SQL_Running: Yes

🧩 第三步: 配置 LVS-DR 模式#

1. 在主库上安装LVS#

Terminal window
yum install ipvsadm

2. 配置LVS-DR模式#

Terminal window
ip addr add dev ens33 192.168.25.100/24 # 在ens33接口添加VIP
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:09:ba:a4 brd ff:ff:ff:ff:ff:ff
inet 192.168.25.252/24 brd 192.168.25.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.25.100/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::4077:310e:aefe:5531/64 scope link noprefixroute
valid_lft forever preferred_lft forever

3. 配置LVS规则#

Terminal window
ipvsadm -C
ipvsadm -A -t 192.168.25.100:3306 -s rr
ipvsadm -a -t 192.168.25.100:3306 -r 192.168.25.253:3306 -g
ipvsadm -a -t 192.168.25.100:3306 -r 192.168.25.254:3306 -g
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.25.100:3306 rr
-> 192.168.25.253:3306 Route 1 0 0
-> 192.168.25.254:3306 Route 1 0 0

4. 配置LVS Real Server#

TIP

在两台 slave 上配置 ARP 抑制:

/etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

执行 sysctl -p 生效

5. 添加VIP到环回接口#

两个 slave 节点都执行

Terminal window
ip addr add dev lo 192.168.25.100/32
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.25.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:7c:90:84 brd ff:ff:ff:ff:ff:ff
inet 192.168.25.253/24 brd 192.168.25.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::822b:1e68:7fd:3c1b/64 scope link noprefixroute
valid_lft forever preferred_lft forever

🌐 第四步: 测试MySQL主从复制和LVS负载均衡#

1. 验证MySQL主从复制#

在主库上执行

CREATE DATABASE lvs_test;
use lvs_test;
CREATE TABLE test(id PRIMARY KEY, data VARCHAR(100));
INSERT INTO test VALUES(1, "Test from Master");
CREATE USER 'root'@'%' IDENTIFIED BY 'WWW.1.com';
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;

在从库上验证

select * from lvs_test.test;
+----+------------------+
| id | data |
+----+------------------+
| 1 | Test from MAster |
+----+------------------+
1 row in set (0.00 sec)

2. 验证LVS负载均衡#

新开一台机器或用Windows的 Navicat工具 连接VIP 192.168.25.100:3306

Terminal window
mysql -h 192.168.25.100 -uroot -pWWW.1.com -e "SELECT @@server_id;"

多次执行会看到返回的 server_id23 之间切换,说明请求被均衡分发到了两个从库上。

🔍 遇到的报错及解决方案#

  1. 报错: ERROR 1236 (HY000): Could not find first log file name in binary log index file
    • 解决方案: 确保主库上的二进制日志文件存在且从库配置正确。可以尝试重新配置主从复制。
  2. 报错: 如果遇到SQL线程IO线程报错,检查主从复制配置是否正确,确保主库和从库的 server_id 不同。
    • 解决方案: 可以尝试重新配置主从的连接,使用 reset masterreset slave 重置主从复制的状态,然后使用 CHANGE MASTER TO 重新配置主从复制的连接。

🔒 补充:#

  • MySQL 主从复制适用于读写分离的场景,可以有效提升数据库的读性能。
  • 主从复制配置中,server_id 必须唯一,不能与其他节点重复。
  • 主从复制配置中,log-bin 必须开启,且在 my.cnf 中配置正确。

📋 总结#

✅ 验证清单#

  • 主从复制配置正确
  • LVS-DR 模式配置正确
  • VIP 能够正常访问主从库
  • 从库能够正常接收主库的 binlog 并应用
  • 负载均衡生效,请求被均衡分发到两个从库上

🔒 安全建议(生产环境)#

  • 配置防火墙规则,限制访问 MySQL 端口的 IP 地址范围。
  • 为 MySQL 主从复制配置 SSL 加密,防止敏感数据在传输过程中被窃取。
  • 为 MySQL 主从复制配置 binlog_do_dbbinlog_ignore_db,只同步需要的数据库。
  • 为 MySQL 主从复制配置 binlog_row_image = full,确保从库能够完整地应用主库的操作。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
MySQL主从复制(一主多从)+LVS RD负载均衡
https://exercisehx.top/posts/Master-Slave-Replication/
作者
航.
发布于
2026-01-20
许可协议
CC BY-NC-SA 4.0

评论区

目录