哲风壁纸 - 抹茶大饼
1600 字
8 分钟
MySQL主从复制(一主多从)+LVS RD负载均衡
🌟 前言
MySQL 主从复制是一种数据库复制技术,用于在主数据库 (Master) 和一个或多个从数据库 (Slave) 之间同步数据。
这种技术允许数据从主数据库复制到从数据库,实现数据的冗余存储和读写分离,从而提高数据库的可用性和扩展性。
🧱 环境准备
1. 主机信息
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| mysql-master | 192.168.25.252 | control-plane |
| 192.168.25.252 | Manager-IP | |
| 192.168.25.100 | VIP | |
| mysql-Slave01 | 192.168.25.253 | Slave |
| mysql-Slave02 | 192.168.25.254 | Slave |
应用程序连接方式: 应用程序连接到 LVS 负载均衡器的 VIP 地址,由负载均衡器将请求分发到 MySQL 主从复制集群中的一个节 点。
- 写操作: 192.168.25.253:3306 (直连主库的管理IP)
- 读操作: 192.168.25.100:3306 (连接VIP,由主库上的LVS进行负载均衡到从库)
🔧 第一步: 所有节点通用配置(master + slave)
1. 关闭防火墙(或放行必要端口)
systemctl stop firewalldsystemctl disable firewalldsystemctl mask firewalld
systemctl is-active firewalldsystemctl status firewalld2. 关闭SELinux
setenforce 0sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config3. 配置主机名和hosts
# 在 master 上hostnamectl set-hostname mysql-master
# 在 node1 上hostnamectl set-hostname mysql-slave01
# 在 node2 上hostnamectl set-hostname mysql-slave02然后在 所有节点 的 /etc/hosts 中添加以下内容:
cat >> /etc/hosts <<EOF192.168.25.252 mysql-master192.168.25.253 mysql-slave01192.168.25.254 mysql-slave02EOF4. 各节点免密配置
# 在每个节点上先执行以下命令,创建 SSH 密钥对ssh-keygen -t rsa# 编写一键配置脚本#!/bin/bashNODES=("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 ~/.sshchmod 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) fidone
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/
wget https://repo.mysql.com/mysql-community-release-el7-7.noarch.rpmrpm -ivh mysql-community-release-el7-7.noarch.rpm执行完毕后可以查看yum源文件 /etc/yum.repos.d/
会多出两个 MySQL 开头的 repo 源
# 同步 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
yum install mysql-community-server2. 编辑MySQL配置文件(master节点)
mkdir -p /opt/mysql_logchowm -R mysql.mysql /opt/mysql_log[mysqld]server_id = 1log_bin = /opt/mysql_log/mastergtid_mode = onenforce_gtid_consistency = onsystemctl enable --now mysqld
grep -i password /var/log/mysqld.log # 查询初始密码
mysql -uroot -p # 登陆MySQLalter 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节点)
mkdir -p /opt/mysql_logchown -R mysql.mysql /opt/mysql_log[mysqld]server_id = 2 # 每个节点的server_id必须不同log_bin = /opt/mysql_log/slavegtid_mode = onread_only = onenforce_gtid_consistency = onsystemctl enable --now mysqld
grep -i password /var/log/mysqld.log # 查询初始密码
mysql -uroot -p # 登陆MySQLalter user 'root'@'localhost' identified by 'WWW.1.com';
CHANGE MASTER TOMASTER_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:
Yes和 Slave_SQL_Running:Yes
🧩 第三步: 配置 LVS-DR 模式
1. 在主库上安装LVS
yum install ipvsadm2. 配置LVS-DR模式
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 forever3. 配置LVS规则
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 -gipvsadm -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 04. 配置LVS Real Server
TIP在两台
slave上配置 ARP 抑制:/etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2
执行 sysctl -p 生效
5. 添加VIP到环回接口
两个 slave 节点都执行
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
mysql -h 192.168.25.100 -uroot -pWWW.1.com -e "SELECT @@server_id;"多次执行会看到返回的 server_id 在 2 和 3 之间切换,说明请求被均衡分发到了两个从库上。
🔍 遇到的报错及解决方案
- 报错:
ERROR 1236 (HY000): Could not find first log file name in binary log index file- 解决方案: 确保主库上的二进制日志文件存在且从库配置正确。可以尝试重新配置主从复制。
- 报错: 如果遇到
SQL线程或IO线程报错,检查主从复制配置是否正确,确保主库和从库的server_id不同。- 解决方案: 可以尝试重新配置主从的连接,使用
reset master和reset slave重置主从复制的状态,然后使用CHANGE MASTER TO重新配置主从复制的连接。
- 解决方案: 可以尝试重新配置主从的连接,使用
🔒 补充:
- MySQL 主从复制适用于读写分离的场景,可以有效提升数据库的读性能。
- 主从复制配置中,
server_id必须唯一,不能与其他节点重复。 - 主从复制配置中,
log-bin必须开启,且在my.cnf中配置正确。
📋 总结
✅ 验证清单
- 主从复制配置正确
- LVS-DR 模式配置正确
- VIP 能够正常访问主从库
- 从库能够正常接收主库的 binlog 并应用
- 负载均衡生效,请求被均衡分发到两个从库上
🔒 安全建议(生产环境)
- 配置防火墙规则,限制访问 MySQL 端口的 IP 地址范围。
- 为 MySQL 主从复制配置 SSL 加密,防止敏感数据在传输过程中被窃取。
- 为 MySQL 主从复制配置
binlog_do_db和binlog_ignore_db,只同步需要的数据库。 - 为 MySQL 主从复制配置
binlog_row_image = full,确保从库能够完整地应用主库的操作。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
MySQL主从复制(一主多从)+LVS RD负载均衡
https://exercisehx.top/posts/Master-Slave-Replication/
🌈Hang🎉
冀ICP备2025113765号-1