双主模式实现HTTP与MySQL高可用

双主模式代理不同业务实现高可用

目的

在两台 Keepalived/LVS 节点上,通过配置不同的 VIP(虚拟 IP),分别代理不同业务(HTTP 与 MySQL),实现"双主模式"下不同业务的高可用与流量分发。

拓扑示意

  • RS1 (172.25.254.10) --- 后端节点(Web + MySQL)
  • RS2 (172.25.254.20) --- 后端节点(Web + MySQL)
  • KA1 / KA2 --- 两台 Keepalived/LVS 节点,负责 VIP 漂移与 L4 转发
    • VIP 172.25.254.100:80 → Web(HTTP)
    • VIP 172.25.254.200:3306 → 数据库(MySQL)

环境准备(后端 RS 节点)

复制代码
[root@RS1和RS2 ~] vim /etc/NetworkManager/system-connections/lo.nmconnection

[connection]
id=lo
type=loopback
interface-name=lo


[ipv4]
method=manual
address1=127.0.0.1/8
address2=172.25.254.100/32
address3=172.25.254.200/32

示例以 CentOS/RHEL(dnf)安装 MariaDB:

bash 复制代码
# 在 RS1/RS2 上安装并启动 MariaDB
dnf install mariadb-server -y
systemctl enable --now mariadb

创建数据库用户并授权(允许远程访问):

sql 复制代码
-- 在 mysql 控制台中执行
CREATE USER 'swp'@'%' IDENTIFIED BY 'swp';
GRANT ALL ON *.* TO 'swp'@'%';
FLUSH PRIVILEGES;

测试从一台后端访问另一台后端的 MySQL(示例):

bash 复制代码
mysql -uswp -pswp -h172.25.254.20

Keepalived + LVS 配置(在 KA1 / KA2)

主配置文件 /etc/keepalived/keepalived.conf 引入两个业务配置文件:

conf 复制代码
include /etc/keepalived/conf.d/webserver.conf
include /etc/keepalived/conf.d/datebase.conf
  1. Web(HTTP)代理:/etc/keepalived/conf.d/webserver.conf
conf 复制代码
[root@KA1+2 ~]virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 172.25.254.10 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            retry 3
            delay_before_retry 1
        }
    }

    real_server 172.25.254.20 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

说明:

  • 对能返回 HTTP 200 的后端使用 HTTP_GET 健康检查更准确;
  • 也可全部使用 TCP_CHECK(仅检测端口连通性)视需求调整。
  1. 数据库(MySQL)代理:/etc/keepalived/conf.d/datebase.conf
conf 复制代码
[root@KA1+2 ~]virtual_server 172.25.254.200 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP

    real_server 172.25.254.10 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }

    real_server 172.25.254.20 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 5
            retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

重启 keepalived 生效:

bash 复制代码
[root@KA1+2 ~]systemctl restart keepalived.service

验证与测试

  1. 验证数据库 VIP(从任意客户端)���
bash 复制代码
mysql -u<user> -p<pass> -h172.25.254.200

示例:成功进入 MariaDB monitor 表示代理成功。

  1. 验证 Web VIP(HTTP):
bash 复制代码
curl 172.25.254.100

示例返回(轮询不同后端):

  • RS1 返回:RS1 - 172.25.254.10
  • RS2 返回:RS2 - 172.25.254.20

故障切换测试建议

  1. 停止某后端 Web 服务(或屏蔽 80 端口),多次 curl VIP,观察请求是否切换到健康节点。
  2. 停止某后端 MySQL 服务,尝试连接 172.25.254.200,观察是否切换到另一台后端。
  3. 停止 KA1 的 keepalived,观察 VIP 是否漂移到 KA2(VRRP 切换)。

查看日志以确认事件:

bash 复制代码
journalctl -u keepalived
# 或查看 /var/log/messages (取决于系统配置)

服务,尝试连接 172.25.254.200,观察是否切换到另一台后端。

  1. 停止 KA1 的 keepalived,观察 VIP 是否漂移到 KA2(VRRP 切换)。

查看日志以确认事件:

bash 复制代码
journalctl -u keepalived
# 或查看 /var/log/messages (取决于系统配置)
相关推荐
半桔3 小时前
【MySQL数据库】SQL 查询封神之路:步步拆解核心操作,手把手帮你解锁高阶玩法
linux·数据库·sql·mysql·adb·oracle
猫头虎3 小时前
[精选] 2025最新MySQL和PostgreSQL区别、迁移、安全、适用场景全解析
运维·数据库·mysql·安全·postgresql·云原生·容器
No8g攻城狮3 小时前
【SQL】MySQL中空值处理COALESCE函数
数据库·sql·mysql·postgresql·sqlserver
Remember_9933 小时前
一文吃透Java WebSocket:原理、实现与核心特性解析
java·开发语言·网络·websocket·网络协议·http·p2p
王码码20353 小时前
Flutter for OpenHarmony:stomp_dart_client 打造实时消息引擎(企业级 WebSocket 通信标准) 深度解析与鸿蒙适配指南
网络·websocket·网络协议·flutter·ui·华为·harmonyos
王码码20353 小时前
Flutter for OpenHarmony:web_socket 纯 Dart 标准 WebSocket 客户端(跨平台兼容性之王) 深度解析与鸿蒙
android·前端·websocket·网络协议·flutter·华为·harmonyos
中北萌新程序员4 小时前
WebSocket(看这一篇就够了)
网络·websocket·网络协议
小李独爱秋4 小时前
模拟面试:说一下数据库主从不同步的原因。
运维·服务器·mysql·面试·职场和发展·性能优化
keyborad pianist4 小时前
MySQL篇 Day1
数据库·mysql
zhangyueping83856 小时前
5、MYSQL-DQL-多表关系
数据库·mysql