Solo  当前访客:0 开始使用

今天大晴天

记录精彩的程序人生

高可用服务之keepalived

2025-06-12 21:58:42 jing123456
0  评论    0  浏览

Keepalived 详解

一、Keepalived 概述

Keepalived 主要用于实现高可用性(High Availability)和负载均衡。它最初是为 LVS (Linux Virtual Server)设计的

二、核心工作原理

Keepalived 的核心是基于 VRRP (Virtual Router Redundancy Protocol) 协议:

  1. VRRP 协议:VRRP虚拟路由器冗余协议,最开始是给网络设备实现高可用.目前keepalive实现vrrp协议,通过vrrp实现高可用
  2. 主备选举:一般是2个节点.主备之间通过vrrp协议发送数据包沟通,
  3. 状态切换:主给备定期发送数据包,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备胎转正了,接管用户请求流量.

三、快速上手

1,环境准备

高可用服务器部署服务
kp01nginx+keepalived
kp02nginx+keepalived

2. 安装

在基于 RPM(centos)的系统上

yum install keepalived -y

在基于 Debian(ubuntu) 的系统上

apt-get install keepalived -y

3. 配置文件结构

主配置文件通常位于 /etc/keepalived/keepalived.conf,包含三个主要部分:

! Configuration File for keepalived

global_defs {       ##现在用的主要配置1
    # 全局配置
}

vrrp_instance VI_1 {   ####现在用的主要配置2
    # VRRP 实例配置
}

virtual_server 192.168.200.100 80 {
    # 虚拟服务器配置(用于负载均衡)
}
#全局定义部分
global_defs {
   router_id kp01  #每一个keepalived的名字,当前网络中唯一.
 }

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

四、配置示例

1. kp01基础主配置

Master 节点配置

global_defs {
   router_id kp01
 }
 vrrp_instance vip_3 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3 dev eth0 label eth0:0
    }
 }

2.kp02基础备配置

backup 节点配置

global_defs {
   router_id kp02
 }
 vrrp_instance vip_3 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3 dev eth0 label eth0:0
    }
 }

五,案例:keepalived基于主机高可用软件

问题:

keepalived只会在主机挂了,网络断开后,才会进行主备切换,默认情况下keepalived不会监控某个服务

实现目标:

1️⃣某个服务关闭了,keepalived就进行主备切换

情景:kp01和kp02做了web平台的访问入口。假如kp01的nginx挂了则使用kp02的nginx访问

实现方式:通过脚本监控nginx的80端口

脚本:

#!/bin/bash
#vars
port=80
port_count=`ss -lntup |grep -w "$port"|wc -l`

if [$port_count -eq 0 ];then
    systemctl stop keepalived
fi
  • 脚本执行的配置文件
 cat  /etc/keepalived/keepalived.conf
global_defs {
   router_id kp01
 }
 #定义监控脚本
vrrp_script keep_lb.sh {                  ###定义名及字脚本
   script /server/scripts/keep_lb.sh      #脚本路径
   interval 2      #权重
   weight  1
   user root        #执行用户 
}
 vrrp_instance vip_3 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3 dev eth0 label eth0:0
    }  
    #这个vrrp实例使用 keep_lb.sh 脚本.
    track_script  {             ##引用脚本
      keep_lb.sh 
    }
 }

六,脑裂故障处理

现象: 主备都有vip

原因

  • 备认为主挂了,接管资源生成VIP.实际上主并没有挂,仍有VIP

  • 有很多原因可以导致脑裂,开火墙 ,selinux,keepalived ,物理线路(网络介质)

解决方法

  • 1,监控(备节点监控),只要备节点有vip就告警
  • 2.监控备节点只要有vip,远程控制主节点,只要备节点认为主挂了,那就让他真的挂了

七,非抢占模式

  • keepalived 主备默认是抢占式,主挂了,备接管.主恢复,不希望主重新抢回资源
  • 配置非抢占式模式即可

1、2个节点状态是备

2、配置nopreempt选项

配置方法:两台都配成bacup,以及配置上nopreempt

image.png

八、双主模式

1.基本架构

  • 服务器A:作为VIP1的主节点,VIP2的备份节点
  • 服务器B:作为VIP2的主节点,VIP1的备份节点

image.png

2.环境准备

假设有两台服务器:

  • 服务器A:192.168.1.101(优先级100)
  • 服务器B:192.168.1.102(优先级90)
  • 虚拟IP1(VIP1):192.168.1.100(用于Web服务)
  • 虚拟IP2(VIP2):192.168.1.200(用于数据库服务)

3.服务器A配置 (/etc/keepalived/keepalived.conf)

global_defs {
    router_id LVS_DEVEL_A
}

vrrp_instance VI_1 {          # 第一个VRRP实例 - VIP1
    state MASTER
    interface eth0
    virtual_router_id 51      # 必须与服务器B的VIP1配置相同
    priority 100              # 比服务器B高
  
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
  
    virtual_ipaddress {
        192.168.1.100/24
    }
}

vrrp_instance VI_2 {          # 第二个VRRP实例 - VIP2
    state BACKUP
    interface eth0
    virtual_router_id 52      # 必须与服务器B的VIP2配置相同
    priority 90               # 比服务器B低
  
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222        # 可以与第一个实例不同
    }
  
    virtual_ipaddress {
        192.168.1.200/24
    }
}

4.服务器B配置 (/etc/keepalived/keepalived.conf)

global_defs {
    router_id LVS_DEVEL_B
}

vrrp_instance VI_1 {          # 第一个VRRP实例 - VIP1
    state BACKUP
    interface eth0
    virtual_router_id 51      # 必须与服务器A的VIP1配置相同
    priority 90               # 比服务器A低
  
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
  
    virtual_ipaddress {
        192.168.1.100/24
    }
}

vrrp_instance VI_2 {          # 第二个VRRP实例 - VIP2
    state MASTER
    interface eth0
    virtual_router_id 52      # 必须与服务器A的VIP2配置相同
    priority 100              # 比服务器A高
  
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
  
    virtual_ipaddress {
        192.168.1.200/24
    }
}
,



目录

TOP