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配置
- 全局配置定义
# 全局定义标识
global_defs {
# 通知收件人地址
notification_email {
email
email
}
# 通知发送邮件地址
notification_email_from email
# smtp服务器地址
smtp_server host
# smtp服务器连接超时时间
smtp_connect_timeout num
# 指定LVS导向器的名字
lvs_id string
}
- 虚拟路由定义
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
}
}
- 虚拟服务器定义
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 #在尝试之前延迟多长时间
}
}
- 部分配置说明
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
}
}