侧边栏壁纸
博主头像
J&S Blog

顺着一路星光,去往有你的嘉处

  • 累计撰写 14 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

keepalived详解

Administrator
2026-05-24 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

keepalived详解

Keepalive是一个用于实现高可用性(HA)解决方案的开源软件,主要用于在主备服务器之间管理和切换服务。它的主要功能是监控主服务器的状态,并在主服务器出现故障时自动将服务转移到备用服务器,从而确保系统的高可用性

特点:

  • 虚拟IP:Keepalive可以在主服务器和备份服务器之间管理虚拟IP地址,确保用户请求总是可以路由到可用的服务器。

  • 健康检查:它定期检查主服务器的健康状态,使用各种协议(如SSL、TCP连接等)来确认服务器是否正常工作。

  • 自动故障转移:当主服务器不可用时,Keepalive可以自动将流量切换到备份服务器,确保服务的持续可用性。

  • 负载均衡:在某些配置中,Keepalive还可以与负载均衡器结合使用,帮助分配流量到多个后端服务器。

  • 灵活配置:Keepalive支持多种配置选项,允许用户根据自己的需求调整监控间隔、重试次数和其他参数。

Keepalived组成架构

keepalived也是模块化设计,不同模块负责不同的功能,它主要有三个模块,分别是core、check和VRRP

  1. core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;

  2. check:负责健康检查,包括常见的各种检查方式;

  3. VRRP模块:是来实现VRRP协议的。

其他组件:

system call:系统调用

watch dog:监控check和vrrp进程的看管者,check负责检测健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。

利用VRRP协议进行主备通信。组播224.0.0.18

利用VRRP协议进行主备竞选,产生VIP

利用VRRP协议主向备发送组播包。当备服务器接收不到主服务器的组播包,就会认为主出现故障,主动接管资源

当主恢复时,根据配置决定是否抢占备服务器资源

ipvs wrapper:为集群内的所有节点生成IPVS规则

6个节点组成:2台后端web界面服务器,2台nginx负载均衡反向代理缓存服务器,2台lvs+keepalived服务器 2台web服务器要求只能使用内网ip、nginx服务器只是用内网ip、lvs+keepalived使用两张卡、一张内网、一个外网

nginx配置

    upstream apache {     #在server上面添加
        server 192.168.1.15:80 weight=1 max_fails=1 fail_timeout=10s;
    }
    server {
        listen       80;
        server_name  localhost;
​
        #charset koi8-r;
​
        #access_log  logs/host.access.log  main;
​
        location / {
           # root   html;
           # index  index.html index.htm;
            proxy_pass http://apache;
        }
​

keepalived配置文件

! Configuration File for keepalived     #!表示注释
global_defs {                       #全局定义部分
   notification_email {              #设置警报邮箱
     acassen@firewall.loc      #接收警报的邮箱地址,根据实际情况写
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc #设置发件人地址
   smtp_server 192.168.200.1    #设置smtp server地址,即发邮件服务器
   smtp_connect_timeout 30   #设置smtp超时连接时间,以上参数可以不配置
   router_id cong11   #表示运行keepalived服务器的一个标识,这个标识(router_id)是唯一的
}
​
vrrp_instance lvs-dr {  #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改
    state MASTER  #MASTER表示指定本节点为主节点,备用节点上设置为 BACKUP。注意节点状态均大写。
    interface ens37    #绑定虚拟 IP 的网络接口
    virtual_router_id 51  #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的。
    priority 100    #节点的优先级(1-255之间),越大越优先。备用节点必须比主节点优先级低。
    advert_int 1   #为同步通知间隔。MASTER与BACKUP之间心跳检查的时间间隔,单位为秒,默认为1。
    authentication {  #设置验证信息,两个节点必须一致,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
        auth_type PASS
        auth_pass 1111
    }
#   unicast_src_ip 192.168.118.132     #配置单播的源地址,即本机地址
#   unicast_peer {
#      192.168.118.129          #配置单播的目标地址,即对方节点地址,备有多台就配置多个地址
#    }
    virtual_ipaddress {    #指定虚拟 IP, 两个节点设置必须一样
        192.168.2.88
    }
}
#至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除
#以下为虚拟服务器定义部分
#类似添加虚拟服务器 ipvsadm -A -t 192.168.2.11:80 -s rr
virtual_server 192.168.2.88 80 {    #设置虚拟服务器,指定虚拟IP和端口
    delay_loop 6            #健康检查时间为6秒,即Keepalived多长时间监测一次RS。
    lb_algo rr             #设置负载调度算法为rr算法
    lb_kind DR         #设置负载均衡模式,有NAT,TUN和DR三种模式可选
    nat_mask 255.255.255.0   #非NAT模式注释掉此行  注释用!号
    persistence_timeout 50  #连接保持时间,单位是秒。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。同一IP地址的客户端50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法,同一IP的客户端超过50 秒后,再次访问,才会被转发到另一台real server上。Persistence是持久性的意思
    protocol TCP   #指定转发协议类型,有TCP和UDP两种
    real_server 192.168.2.13 80 { #配置RS节点1,需要指定 realserver 的真实 IP 地址和端口,IP和端口之间用空格隔开 
        weight 1    ##权重,权重大小用数字表示,数字越大,权重越高  
        TCP_CHECK {     #节点健康检查。这段内容要手动添加,把原来的内容删除
                connect_timeout 3       #超时时间,表示3秒无响应超时。
                nb_get_retry 3          #表示重试次数
                delay_before_retry 3    #表示重试间隔
                connect_port 80         #检测端口,利用80端口检查
                }
    }
    real_server 192.168.2.14 80 {   #RS节点2
        weight 1
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
                }
    }
}
#默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。 如: 
#virtual_server 10.10.10.2 1358 {  。。。 } 
#virtual_server 10.10.10.3 1358 {  。。。 }

#连接保持时间,单位是秒。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。同一IP地址的客户端50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法

主节点配置文件

! Configuration File for keepalived
​
global_defs {
   router_id cong11
}
​
vrrp_instance lvs-dr {
    state MASTER
    interface ens37
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.88
    }
}
​
virtual_server 192.168.2.88 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP
​
    real_server 192.168.2.13 80 {
        weight 1
        TCP_CHECK {    
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.2.14 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }   
    }
}

从节点配置文件

! Configuration File for keepalived
​
global_defs {
   router_id cong12
}
​
vrrp_instance lvs-dr {
    state BACKUP
    interface ens37
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.88
    }
}
​
virtual_server 192.168.2.88 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP
​
    real_server 192.168.2.13 80 {
        weight 1
        TCP_CHECK {    
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.2.14 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }   
    }
}

keepalived的常见的健康检查方式

TCP_CHECK检测
  real_server 192.168.2.13 80 {
            weight 100
            TCP_CHECK {
                connect_port 80  #检测端口,利用80端口检查
                connect_timeout 3  #连接超时时间
                nb_get_retry 3  #重连次数
                delay_before_retry 3  #重连间隔
            }
        }
​

基于HTTP状态码的检测

real_server 192.168.2.13 80 {
      weight 1
      HTTP_GET {
          url {
          path /index.html
          status_code 200 #http://192.168.2.13/index.html的返回状态码
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
}
​

MISC_CHECK检测

自定义Shell脚本监控

real_server 192.168.2.13 80 {
      weight 1
      HTTP_GET {
          url {
          path /index.html
          status_code 200 #http://192.168.2.13/index.html的返回状态码
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
}
​

用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:

#返回0:健康检查OK,权重不被修改

#返回1:健康检查失败,权重设为0

#返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253

keepalived检测脚本内容/opt/mytools/check_web.sh,返回0代表检查正常,返回1代表检查异常

/opt/mytools/check_web.sh内容如下

#!/bin/sh
serverip=$1
curl -s -m 2 http://$serverip
if [ $? -eq 0 ];then
    exit 0
else
    exit 1
fi
​

注:curl命令中的-s选项表示静音模式,不输出任何东西。-m选项表示设置数据传输的最大时间。传输的最大允许时间

非抢占模式

和抢占模式的配置相比,只改了两个地方:

1、在vrrp_instance块下,两个节点各增加了nopreempt指令,表示不争抢vip。

2、两个节点的state都为BACKUP

在非抢占模式下,两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。

! Configuration File for keepalived
​
global_defs {
   router_id cong11
}
​
vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2 
       weight -20
}
​
vrrp_instance lvs-dr {
    state BACKUP
    interface ens37
    virtual_router_id 51
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.88
    }
     track_script {
       chk_nginx 
    }
}

0
博主关闭了所有页面的评论