Keepalived详解

2020-08-29  本文已影响0人  欧耶90

一、Keepalived介绍
Keepalived是一款由C编写的软件,一般解决负载均衡器的高可用性问题,提供了负载均衡、健康检查和高可用的功能,高可用功能是由VRRP协议来实现的。

二、软件设计
Keepalived启动后由3个进程组成。

1. 主进程 - 负责监视和创建子进程
2. 子进程1 - 负责VRRP功能
3. 子进程2 - 负责健康检查功能
image.png
父进程健康框架为watchdog,会周期性的向子进程发送hello数据包,如果发现无法向子进程发送hello包,则父进程会重新启动子进程。父进程会通过多路IO复用控制程序发送hello数据包来检查子程序中的死循环,也能通过SysV来检查子进程是否存活。
包含如下组件:
image.png
组件的详细介绍见官方文档:组件介绍地址

三、Keepalived安装
在Red Hat 系服务器上安装

yum install keepalived -y

在Debian系服务器上安装

apt install keepalived -y

四、keepalived配置

  1. 全局配置定义
# 全局定义标识
global_defs {
    # 通知收件人地址
    notification_email {
        email
        email
    }
    # 通知发送邮件地址
    notification_email_from email
    # smtp服务器地址
    smtp_server host
    # smtp服务器连接超时时间
    smtp_connect_timeout num
    # 指定LVS导向器的名字
    lvs_id string
}
  1. 虚拟路由定义
vrrp_instance VI_1 {        #定义实例
    state MASTER            #指定keepalived节点的初始状态,可选值为MASTER|BACKUP
    interface eth0          #VRRP实例绑定的网卡接口,用户发送VRRP包
    virtual_router_id 51    #虚拟路由的ID,同一集群要一致
    priority 100            #定义优先级,按优先级来决定主备角色,优先级越大越优先
    nopreempt               #设置不抢占
    advert_int 1            #主备通讯时间间隔
    authentication {        #配置认证
        auth_type PASS      #认证方式,此处为密码
        auth_pass 1111      #同一集群中的keepalived配置里的此处必须一致,推荐使用8位随机数
    }
    virtual_ipaddress {     #配置要使用的VIP地址
        192.168.200.16
    }
}
  1. 虚拟服务器定义
virtual_server 10.10.10.2 1358 {    #配置虚拟服务器
    delay_loop 6        #健康检查的时间间隔
    lb_algo rr          #lvs调度算法
    lb_kind NAT         #lvs模式
    persistence_timeout 50      #持久化超时时间,单位是秒
    protocol TCP        #4层协议

    sorry_server 192.168.200.200 1358   #定义备用服务器,当所有RS都故障时用sorry_server来响应客户端

    real_server 192.168.200.2 1358 {    #定义真实处理请求的服务器
        weight 1                        #给服务器指定权重,默认为1
        HTTP_GET {
            url {
              path /testurl/test.jsp    #指定要检查的URL路径
              digest 640205b7b0fc66c1ea91c463fac6334d   #摘要信息
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3       #连接超时时间
            nb_get_retry 3          #get尝试次数
            delay_before_retry 3    #在尝试之前延迟多长时间
        }
}
  1. 部分配置说明
    vrrp_instance段配置
nopreempt      #设置为不抢占。默认是抢占的,当高优先级的机器恢复后,会抢占低优先 
级的机器成为MASTER,而不抢占,则允许低优先级的机器继续成为MASTER,即使高优先级 
的机器已经上线。如果要使用这个功能,则初始化状态必须为BACKUP。

preempt_delay  #设置抢占延迟。单位是秒,范围是0---1000,默认是0.发现低优先 
级的MASTER后多少秒开始抢占。

vrrp_script段配置

#作用:添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。
#注意:至少有一个VRRP实例调用它并且优先级不能为0.优先级范围是1-254.
vrrp_script <SCRIPT_NAME> {
          ...
    }

#选项说明:
script "/path/to/somewhere"     #指定要执行的脚本的路径。
interval <INTEGER>              #指定脚本执行的间隔。单位是秒。默认为1s。
timeout <INTEGER>               #指定在多少秒后,脚本被认为执行失败。
weight <-254 --- 254>           #调整优先级。默认为2.
rise <INTEGER>                  #执行成功多少次才认为是成功。
fall <INTEGER>                  #执行失败多少次才认为失败。
user <USERNAME> [GROUPNAME]     #运行脚本的用户和组。
init_fail                       #假设脚本初始状态是失败状态。

#weight说明: 
1. 如果脚本执行成功(退出状态码为0),weight大于0,则priority增加。
2. 如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少。
3. 其他情况下,priority不变。

real_server段配置

weight <INT>            #给服务器指定权重。默认是1
inhibit_on_failure      #当服务器健康检查失败时,将其weight设置为0, 
                        而不是从Virtual Server中移除
notify_up <STRING>      #当服务器健康检查成功时,执行的脚本
notify_down <STRING>    #当服务器健康检查失败时,执行的脚本
uthreshold <INT>        #到这台服务器的最大连接数
lthreshold <INT>        #到这台服务器的最小连接数

tcp_check段配置

connect_ip <IP ADDRESS>     #连接的IP地址。默认是real server的ip地址
connect_port <PORT>         #连接的端口。默认是real server的端口
bindto <IP ADDRESS>         #发起连接的接口的地址。
bind_port <PORT>            #发起连接的源端口。
connect_timeout <INT>       #连接超时时间。默认是5s。
fwmark <INTEGER>            #使用fwmark对所有出去的检查数据包进行标记。
warmup <INT>    //指定一个随机延迟,最大为N秒。可防止网络阻塞。如果为0,则关闭该功能。
retry <INIT>                #重试次数。默认是1次。
delay_before_retry <INT>    #默认是1秒。在重试之前延迟多少秒。

五、实际案例:主主配置
两台互为主主同时可提供服务,一台服务宕掉后另一台可接管

主:
! 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_connect_timeout 30
   router_id lb01
}
vrrp_script chk_nginx {
 script "/usr/local/scripts/nginx_check.sh"
 interval 2
 weight 20
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass server123
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        10.10.44.142/24
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123fa9f6
    }
    virtual_ipaddress {
        10.10.44.143/24
    }
}

备:
! 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_connect_timeout 30
   router_id lb02
}
vrrp_script chk_nginx {
 script "/usr/local/scripts/nginx_check.sh"
 interval 2
 weight 20
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass server123
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        10.10.44.142/24
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123fa9f6
    }
    virtual_ipaddress {
        10.10.44.143/24
    }
}
上一篇下一篇

猜你喜欢

热点阅读