keepalived互为主备实现mysqlrouter做高可用

high availability(HA) 高可用: 不会有单点故障,一个坏了,另外的能顶替,不影响工作,有备份。3个经典的HA软件:

  • heartbeat
  • keepalived 开源并且免费的软件           官方网站:Keepalived for Linux
  • HAproxy

Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡(4层)和高可用性功能

master角色的路由器(的接口)承担实际的数据流量转发任务,backup路由器侦听master路由器的状态,并在master路由器发生故障时,接替其工作,从而保证业务流量的平滑切换。

Keepalived 的2大核心功能:
  1. loadbalance 负载均衡 (LB):底层依赖 ipvs--》lvs软件在linux内核里已经安装,不需要单独安装
  2. high-availability 高可用 (HA) :底层依赖 vrrp协议

Keepalived 双主模式(互为主备)配置方案

在传统的 Keepalived 主备模式中,VIP(虚拟IP)仅在主节点生效,备节点处于待机状态。若需要实现 双主模式(互为主备),可通过 多VRRP实例 配置,使两台mysqlrouter服务器同时承载流量并互为备份。以下是具体实现步骤:


架构设计

mysqlrouter配置省略

  • 目标:两台mysqlrouter服务器(Node1和Node2)各自作为不同VRRP实例的主节点,绑定不同的VIP,实现流量分流与故障互备。
  • VIP分配
    • VIP1: 192.168.10.88(主节点:Node1,备节点:Node2)
    • VIP2: 192.168.10.99(主节点:Node2,备节点:Node1)
  • 流量分发:客户端或DNS轮询访问VIP1和VIP2,实现负载均衡。

Keepalived 配置

确保两个 VIP 地址是可用的,并且在同一子网中。没有看到vip是防火墙和selinux没关

#关闭firewalld防火墙服务,并且设置开机不要启动
service firewalld stop
systemctl  disable  firewalld

#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
不然后面ip a看不到vip

修改keepalived配置文件,其中有2个vrrp实例(互为主备),每个实例有两个不同点

state MASTER/BACKUP #keepalved是主还是备

priority 100/90 # 优先级(0-255),值越大优先级越高

1️⃣mysqlrouter1 配置(主VIP1,备VIP2)

vim/etc/keepalived/keepalived.conf 
# 定义健康检查脚本:用于检测服务状态并在异常时发送告警
vrrp_script check_service {
    # 脚本路径:实际执行检查和邮件告警的脚本
    script "/etc/keepalived/check_service.sh"
    interval 2                   # 检查频率:每2秒执行一次
    fall 2                       # 失败阈值:连续2次检查失败视为服务异常
    rise 1                       # 恢复阈值:1次检查成功视为服务恢复正常
    timeout 2                    # 超时时间:2秒内脚本未返回则视为检查失败
}

# 第一个VRRP实例(对应VIP 192.168.10.88)
vrrp_instance VI_1 {
    state MASTER                        # 初始状态:主节点(优先持有VIP)
    interface ens33                     # 绑定网卡:必须与实际物理网卡名称一致
    virtual_router_id 51                # 虚拟路由ID:主备节点必须相同(1-255范围)
    priority 100                        # 节点优先级:主节点需高于备节点(0-255)
    advert_int 1                        # 通告间隔:每秒发送一次VRRP状态通告
    authentication {
        auth_type PASS                 # 认证类型:密码认证(主备需一致)
        auth_pass 1234                  # 认证密码:主备节点必须相同
    }
    virtual_ipaddress {
        192.168.10.88/24               # 虚拟IP(VIP):服务对外提供的访问地址
    }
    track_script {
        check_service  # 关联健康检查:使用上面定义的check_service脚本监控服务
    }
  
}

# 第二个VRRP实例(对应VIP 192.168.10.99)
vrrp_instance VI_2 {
    state BACKUP                        # 初始状态:备节点(默认不持有VIP)
    interface ens33                     # 绑定网卡:与第一个实例保持一致
    virtual_router_id 52                # 虚拟路由ID:需与其他实例不同,避免冲突
    priority 90                         # 节点优先级:低于VI_1,实现负载分担
    advert_int 1                        # 通告间隔:与第一个实例保持一致
    authentication {
        auth_type PASS                 # 认证配置:与对端节点保持一致
        auth_pass 1234                  
    }
    virtual_ipaddress {
        192.168.10.99/24               # 第二个虚拟IP:实现多VIP负载分担
    }
    track_script {
        check_service  # 关联健康检查:复用同一套服务监控逻辑
    }
  
}

2️⃣mysqlrouter2 配置(主VIP2,备VIP1)

vim/etc/keepalived/keepalived.conf
# 定义健康检查脚本:用于检测服务状态并在异常时发送告警
vrrp_script check_service {
    # 脚本路径:实际执行检查和邮件告警的脚本
    script "/etc/keepalived/check_service.sh"
    interval 2                                 # 检查频率:每2秒执行一次
    fall 2                                     # 失败阈值:连续2次检查失败视为服务异常
    rise 1                                     # 恢复阈值:1次检查成功视为服务恢复正常
    timeout 2                                  # 超时时间:2秒内脚本未返回则视为检查失败
}

# 第一个VRRP实例(对应VIP 192.168.10.88)
vrrp_instance VI_1 {
    state BACKUP                       
    interface ens33                     # 绑定网卡:必须与实际物理网卡名称一致
    virtual_router_id 51                # 虚拟路由ID:主备节点必须相同(1-255范围)
    priority 90                        
    advert_int 1                        # 通告间隔:每秒发送一次VRRP状态通告
    authentication {
        auth_type PASS                 # 认证类型:密码认证(主备需一致)
        auth_pass 1234                  # 认证密码:主备节点必须相同
    }
    virtual_ipaddress {
        192.168.10.88/24               # 虚拟IP(VIP):服务对外提供的访问地址
    }
    track_script {
        check_service  # 关联健康检查:使用上面定义的check_service脚本监控服务
    }
  
}

# 第二个VRRP实例(对应VIP 192.168.10.99)
vrrp_instance VI_2 {
    state MASTER                        
    interface ens33                     # 绑定网卡:与第一个实例保持一致
    virtual_router_id 52                # 虚拟路由ID:需与其他实例不同,避免冲突
    priority 100                         
    advert_int 1                        # 通告间隔:与第一个实例保持一致
    authentication {
        auth_type PASS                 # 认证配置:与对端节点保持一致
        auth_pass 1234                  
    }
    virtual_ipaddress {
        192.168.10.99/24               # 第二个虚拟IP:实现多VIP负载分担
    }
    track_script {
        check_service  # 关联健康检查:复用同一套服务监控逻辑
    }
}

健康检查失败后,Keepalived 会当前节点所有vrrp实例的优先级临时降低(默认降低 20 ,可通过 weight 参数自定义)。

健康检查脚本,某一台mysqlrouter挂了降低优先级并发邮件告警

vim /etc/keepalived/check_service.sh
chmod +x /etc/keepalived/check_service.sh


------------------------------------------------
#!/bin/bash
# 服务健康检查脚本:检测目标服务状态,异常时发送告警邮件

# 定义要监控的服务名称(根据实际情况修改,如mysql、httpd等)
SERVICE="mysqlrouter"
# 定义接收告警的邮箱地址
ALERT_EMAIL="xxxxxxxxxx@qq.com"

# 检查服务是否运行(systemctl is-active返回0表示服务正常)
if systemctl is-active --quiet $SERVICE; then
    # 服务正常:返回0(keepalived不会调整优先级)
    exit 0
else
    # 服务异常:发送告警邮件并返回1(触发优先级降低)
    # 邮件内容包含时间、服务器主机名和异常服务名
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服务器$(hostname)的$SERVICE服务异常!可能需要主备切换。" | 
    mail -s "【紧急】$SERVICE服务故障告警" $ALERT_EMAIL
    
    # 返回非0值:告知keepalived检查失败
    exit 1
fi
  • check_service.sh 脚本连续 fall 2 次返回非 0 退出码(表示检查失败),或脚本执行超时(timeout 2 秒未返回),Keepalived 会判定 “服务异常”。
  • 执行改脚本会报错,未收到邮件的原因是 系统中缺少 mail 命令(报错 “mail: 未找到命令”),导致脚本执行到发送邮件的步骤时失败。
  • mail 命令并非系统默认自带,它需要通过安装 mailx 包获取;同时,还需要安装 postfix(邮件传输代理服务),否则即使有 mail 命令,也无法实际发送邮件。

# 1. 安装 mailx(提供 mail 命令)和 postfix(邮件传输服务)
yum install -y mailx postfix

# 2. 启动 postfix 服务,并设置开机自启(确保重启后仍能使用)
systemctl start postfix
systemctl enable postfix
验证双主

mysqlrouter1mysqlrouter2 节点上分别启动 Keepalived 服务,使新配置生效:

systemctl start keepalived

停止一台mysqlrouter服务

[root@mysqlrouter2 keepalived]# systemctl stop mysqlrouter

vip漂移到mysqlrouter1了

故障切换逻辑

  • 场景1:Node1宕机
    • VIP1(192.168.10.88)漂移到Node2。
    • VIP2(192.168.10.99)仍由Node2主控。
    • 所有流量由Node2处理。
  • 场景2:Node2宕机
    • VIP2(192.168.10.99)漂移到Node1。
    • VIP1(192.168.10.88)仍由Node1主控。
    • 所有流量由Node1处理。
  • 配置文件核心逻辑
    • 两个 VRRP 实例分别管理不同 VIP通过初始状态和优先级实现负载分担
    • 健康检查脚本实时监控服务,异常时自动降低节点优先级触发切换
    • vrrp_script:用于监控mysqlrouter服务是否正常运行,负责mysqlrouter服务异常时的告警(周期性检查),并进行优先级的升降,使vip漂移

vrrp_script 是 Keepalived 配置中的一个核心指令块

  • 用于定义外部检测脚本,其目的是扩展 VRRP 协议 beyond 仅能检测网络和对方节点存活的基础功能,实现对应用层服务状态的高可用性管理。

track_script 的作用是:

  • 在一个 vrrp_instance(VRRP实例)中,关联并启用一个或多个事先定义好的 vrrp_script(健康检测脚本)。它是连接VRRP状态机外部健康检查机制的桥梁。

流量分发策略
  1. DNS轮询:将域名解析到VIP1和VIP2,客户端随机访问两台Nginx。
  2. 负载均衡器:在前端部署硬件负载均衡器(如F5)或软件LB(如HAProxy),将流量分发给VIP1和VIP2。
  3. 客户端直连:客户端代码直接轮询使用两个V

通过配置 多VRRP实例,实现了mysqlrouter的双主互备架构,提升资源利用率与系统吞吐量。此方案适用于需要高可用且期望最大化利用硬件资源的场景,同时需注意避免网络脑裂(可通过优先级差和健康检查增强稳定性)。

脑裂现象

什么是脑裂?

多台机器出现相同vip

为什么会出现脑裂

网络通信问题是指互相联系不上都以为对方挂了,优先级就提高,切为master,vip漂移过来

脑裂有没有危害?如果有危害对业务有什么影响?

没有危害,能正常访问,反而还有负载均衡的作用,两台机器都有相同的ip地址,域名访问哪一台不可控,不是管理人员想看到的

脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值