day043-负载均衡算法与高可用keepalived

发布于:2025-06-28 ⋅ 阅读:(19) ⋅ 点赞:(0)

0. 老男孩思想-运维能为公司创造的价值

省钱:

  • 服务器设备、机房带宽、云主机云服务
  • 减少CDN流量
  • 优化、架构改造,当流量增加时,能不能不增加机器也能实现业务
  • 运维自动化-平台化-智能化,节约人力成本、时间成本

1. 负载均衡轮询算法

算法 应用
轮询 nginx默认算法
加权轮询 根据权重访问web服务器
ip哈希 对客户端ip地址进行hash计算,ip地址相同的流量会交给同一个web处理;
可以解决会话保持登录问题,但容易导致负载不均
url哈希 对客户端请求的url进行哈希计算,相同的url会访问同一个web节点;可作为缓存服务器
最小连接数 动态算法,根据连接情况转发
最小连接时间 动态算法,根据连接情况转发
一致性哈希算法 ip_hash的加强版,智能版本

1.1 加权轮询

upstream lb_pools {
	server 10.0.0.7:80 weight=1;
	server 10.0.0.8:80 weight=3;
}

1.2 ip哈希

upstream lb_pools {
	ip_hash;
	server 10.0.0.7:80 weight=1;
	server 10.0.0.8:80 weight=3;
}

1.3 url哈希

upstream lb_pools {
	hash $request_uri;
	server 10.0.0.7:80 weight=1;
	server 10.0.0.8:80 weight=3;
}

2. 负载均衡模块指令补充

upstream的server命令参数 说明
weight 权重
max_fails 设置允许的连续失败次数阈值,超过该阈值后,Nginx 会临时将服务器标记为不可用(进入 fail_timeout 惩罚期)
fail_timeout 默认是10秒,失败后10s后再次测试
backup 备用节点,其他所有节点挂了才会启动
  • 雪崩(Avalanche Effect) 指系统中某个组件的故障引发连锁反应,最终导致整个系统崩溃的现象。其核心特点是 局部故障被放大为全局瘫痪

3. 高可用

高可用(High Availability, HA) 指系统或服务能够持续稳定运行,即使出现硬件故障、软件错误或人为操作失误时,仍能保持可接受的服务水平(如低延迟、有限中断)。其核心目标是最小化停机时间,通常用百分比(如99.9%、99.99%)或年故障时间衡量。

  • 99.9%可用性:年停机时间 ≤ 8.76小时(“三个九”)。
  • 99.99%可用性:年停机时间 ≤ 52.6分钟(“四个九”)。
  • 99.999%可用性:年停机时间 ≤ 5.26分钟(“五个九”,常见于金融系统)。
高可用服务软件 说明
keepalived 泛应用于Web 服务、数据库、Nginx/HAProxy 负载均衡器 等场景,
确保服务在单点故障时仍能正常运行。
heartbeat 高可用软件,设计数据库,存储数据相关可用
商业高可用软件 RoseHA……

4. keepalived

Keepalived 是一个基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 协议的高可用解决方案,主要用于 IP 故障转移(Failover)负载均衡健康检查。它广泛应用于 Web 服务、数据库、Nginx/HAProxy 负载均衡器 等场景,确保服务在单点故障时仍能正常运行。

  • 通过 VRRP 协议实现 虚拟 IP(VIP) 在主备节点间的自动切换。
  • 当主节点(Master)故障时,备用节点(Backup)自动接管 VIP,用户无感知。
    • 主节点定期给备用节点发送数据包,如果备用节点无法收到数据包表示主节点已经宕机,备用节点转为主节点,实现主节点服务处理
    • 发送数据包时使用vrrp的组别地址:224.0.0.18
  • 适用于高并发场景,如 Web 服务器集群。

4.1 部署keepalived服务

  • 下载软件
yum install -y keepalived
  • 修改配置文件-主节点
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 

#全局定义部分
global_defs {
#每一个keepalived的名字,当前网络中唯一.
   router_id lb01  
}
#vrrp实例配置部分 用于配置VIP 设置主备 virtual_ipaddress
#vrrp设置名字.
#vrrp实例名字 在同1对主备之间要一致. 在当前keepalived软件中唯一.
vrrp_instance vip_3 {  
    #主/备  MASTER主  BACKUP备     大写            
    state MASTER  
    #指定网卡网卡 
    interface ens33
    #同1对主备之间这个id要一致.
    virtual_router_id 51 
    #优先级 数字越大优先级越高  设置建议: 主>备 100 50 相差50
    priority 100  
    #心跳间隔 多久发送一次vrrp数据包
    advert_int 1  
    #授权与认证,保持默认即可. 对数据包加密.
    authentication {   
        #简单认证
        auth_type PASS
         #1111 
        auth_pass 1111  
    }
    #设置vip※※※※
    virtual_ipaddress { 
    #label 设置了别名
        10.0.0.3 dev ens33 label ens33:0  
    }
}
  • 配置文件-备用节点
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
#全局定义部分
global_defs {
#每一个keepalived的名字,当前网络中唯一.
   router_id lb02  
}

#vrrp实例配置部分 用于配置VIP 设置主备 virtual_ipaddress
#vrrp设置名字.
#vrrp实例名字 在同1对主备之间要一致. 在当前keepalived软件中唯一.
vrrp_instance vip_3 {  
    #主/备  MASTER主  BACKUP备     大写                      
    state BACKUP   
    #指定网卡网卡 
    interface ens33
    #同1对主备之间这个id要一致.
    virtual_router_id 51 
    #优先级 数字越大优先级越高  设置建议: 主>备 100 50 相差50
    priority 50  
    #心跳间隔 多久发送一次vrrp数据包
    advert_int 1    
    #授权与认证,保持默认即可. 对数据包加密.
    authentication {   
        #简单认证
        auth_type PASS
         #1111 
        auth_pass 1111  
    }
    #设置vip※※※※
    virtual_ipaddress { 
    #label 设置了别名
        10.0.0.3 dev ens33 label ens33:0  
    }
}

4.2 脑裂故障

脑裂(Split-Brain) 是指主备节点之间因网络隔离或通信故障,导致 两个节点同时认为自己是 Master,并都持有 VIP(虚拟 IP),从而引发 数据冲突、服务不可用 等问题。

4.2.1 脑裂故障常见原因

原因 说明
网络隔离 主备节点之间网络中断(如交换机故障、防火墙规则错误等)
vrrp报文丢失 由于网络拥塞或配置错误,vrrp组播/单播报文未能正常传输
节点负载过高 主节点cpu/io过高,无法及时发送/响应vrrp报文,导致备用节点抢占vip
防火强/安全组限制 云环境中安全组未放行vrrp协议的默认端口或组播流量
配置不一致 主备节点中id和权限等配置不一致或错误

4.2.2 脑裂故障解决方法

  • 只要备用节点有vip,那就直接关闭主节点的keepalived服务(直接让主节点宕机)
  • 以负载均衡服务器的nginx服务为例,编写检查脚本,避免脑裂故障
[root@lb01 /server/scripts]# cat check_lb.sh 
#!/bin/bash
##############################################################
# File Name:check_lb.sh
# Version:V1.0
# Author:SunKexu
# Organization:www.oldboyedu.com
# Desc:
##############################################################

cnt=`ps -ef |grep -E [n]ginx |wc -l`
if [ $cnt -eq 0 ];then
	systemctl stop keepalived.service
fi
  • 检查nginx服务是否存在,若发生故障,导致nginx服务停止,直接关闭keepalived服务,避免脑裂
  • 脚本要有执行权限
  • 脚本名字中不要包含服务名称
  • 书写keepalived配置文件:
[root@lb01 /server/scripts]# cat /etc/keepalived/keepalived.conf 

#全局定义部分
global_defs {
#每一个keepalived的名字,当前网络中唯一.
   router_id lb01  
}
#定义监控脚本
vrrp_script check_lb.sh {   
   script /server/scripts/check_lb.sh
   interval 2
   weight  1
   user root 
}

#vrrp实例配置部分 用于配置VIP 设置主备 virtual_ipaddress
#vrrp设置名字.
#vrrp实例名字 在同1对主备之间要一致. 在当前keepalived软件中唯一.
vrrp_instance vip_3 {  
    #主/备  MASTER主  BACKUP备     大写                  
    state MASTER  
    #指定网卡网卡 
    interface ens33
    #同1对主备之间这个id要一致.
    virtual_router_id 51 
    #优先级 数字越大优先级越高  设置建议: 主>备 100 50 相差50
    priority 100  
    #心跳间隔 多久发送一次vrrp数据包
    advert_int 1  
    #授权与认证,保持默认即可. 对数据包加密.
    authentication {   
        #简单认证
        auth_type PASS
         #1111 
        auth_pass 1111  
    }
    #设置vip※※※※
    virtual_ipaddress { 
    #label 设置了别名
        10.0.0.3 dev ens33 label ens33:0  
    }
#这个vrrp实例使用 keep_lb.sh 脚本.
    track_script  {
      check_lb.sh 
    }
}
  • 备用节点不用修改配置文件

5. 思维导图

https://kdocs.cn/join/gpuxq6r?f=101\r\n邀请你加入共享群「老男孩教育Linux运维99期-孙克旭」一起进行文档协作


网站公告

今日签到

点亮在社区的每一天
去签到