收藏
官网:https://keepalived.org/
下载安装
1.官网下载
2.进入解压后的目录,编译安装
shell
# *** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS. ------- 安装前两个解决这个警告
# configure: error: libnfnetlink headers missing ---------- 安装最后那个解决这个错误
yum install -y libnl libnl-devel libnfnetlink-devel./configure --prefix=/usr/local/keepalived
make && make install########或者也可以
yum install -y keepalived
配置
全局配置(global_defs)
global_defs {
# 通知邮件,当keepalived发送切换时需要发email给具体的邮箱地址
nitification_email {
tom@abc.com
jerry@abc.com
}
# 设置发件人的邮箱信息
notification_email_from zhangsan@abc.com
# 指定smtp服务地址
smtp_server 192.168.200.1
# 指定smtp服务连接超时时间
smtp_connect_timeout 30
# 运行keepalived服务器的一个标识,可以用作发送邮件的主题信息
router_id keepalived1# 默认是不跳过检查,检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是
# 如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)
vrrp_skip_check_adv_addr
# 严格遵守VRRP协议
vrrp_strict
# 在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级,默认是0
vrrp_garp_interval 0
# 设置非请求消息的发送延迟时间,默认为0
vrrp_gna_interval 0
}
高可用配置(vrrp_instance)
# 脚本名称与下面track_script需要对应上
vrrp_script ck_nginx
{
# 指定脚本绝对路径
script "脚本位置"
# 执行的时间间隔
interval 3
# 动态调整vrrp_instance的优先级
# weight为正数时,执行结果为真,优先级提升;执行结果为假,优先级保持不变;
# weight为负数时,执行结果为真,优先级不变;执行结果为假,优先级会提升。
weight -20
}vrrp_instance VI_1 {
# 设置此虚拟路由器的初始状态,可选择MASTER或者BACKUP
state MASTER
# 绑定当前虚拟路由器所使用的物理接口,如eth0、lo等
interface eth0
# 指定一个或多个网络接口,并监控这些接口的状态,不监控网络接口不需要配置
#track_interface {
# eth0
#}
# 区别:
# interface参数指定了VRRP实例所使用的网络接口,以便VRRP实例可以在这些接口上运行。
# track_interface用于指定VRRP实例所监控的网络接口,如果指定的接口状态发生变化(如接口故障或断开连接),VRRP实例将自动切换到备用状态。
virtual_router_id 51
# 取值范围是0~255,默认是100,值越高优先级越高
priority 100
# 设置VRRP通告的时间间隔,即心跳间隔,用于设定MASTER与BACKUP主机之间同步检查的时间间隔,单位是秒。默认为1秒
advert_int 1
# 非抢占模式,默认抢占模式
# keepalived的主备切换有两种模式:抢占式和非抢占式
# 抢占式:一种动态的调度策略,当主节点出现故障时,备份节点会抢占成为新的主节点。在抢占模式下,主节点和备份节点之间会进行竞争,优先级高的节点会成为新的主节点。这种调度策略适用于需要快速恢复服务的情况,可以减少故障时间
# 非抢占式:一种静态的调度策略,主节点和备份节点之间不会进行竞争。在非抢占模式下,不会轻易发生IP漂移。这种调度策略适用于需要保证服务稳定性的情况,可以避免由于竞争导致的网络不稳定。之所以说不会轻易发生IP漂移是只有当keepalived发生故障的时候(当前节点不可用)其他节点才会出来干活
# nopreempt
# 主备切换时间(skew_time),计算方式为:(256-Backup设备的优先级)/256,单位为秒。
# 抢占时间:preempt_delay = (advert_int * 3) + (priority - 100) * 2,,其中,preempt_delay表示抢占时间,单位为秒;advert_int表示keepalived发送心跳包的时间间隔,单位为秒;priority表示节点的优先级,取值范围为1-255,值越大表示优先级越高。根据公式可以看出,抢占时间与心跳包发送间隔和节点优先级有关。心跳包发送间隔越短,抢占时间越短;节点优先级越高,抢占时间越短。
authentication {
# 认证类型
auth_type PASS
# 验证密码,主备服务器保持一致
auth_pass 1111
}
virtual_ipaddress {
192.168.200.222
}
track_script {
ck_nginx
}
# 当切换到master时,执行的脚本
notify_master /opt/keepalived/etc/script/notify_fifo.sh
# 当切换到backup时,执行的脚本
notify_backup /opt/keepalived/etc/script/notify_fifo.sh
# 故障时执行的脚本
notify_fault /opt/keepalived/etc/script/notify_fifo.sh
# 通知
notify /opt/keepalived/etc/script/notify_fifo.sh
# 使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
smtp_alert
}
服务检查脚本,参考一:
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
服务检查脚本,参考二:
#!/bin/sh
check_command=`pidof nginx 2> /dev/null`
if [ -z "$check_command" ] ; then
exit 2
fi
exit 0
服务检查脚本,参考三:
#!/bin/bash
logfile=/lb/keepalived_log/keepalived.logif [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
echo "`date '+%F %H:%M:%S'` `hostname`:nginx's master proccess is not exist,starting nginx.service">>$logfile
#/usr/local/nginx/sbin/nginx
systemctl start nginx.service
echo "wait for 3 second...">>$logfile
sleep 3
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
echo "`date '+%F %H:%M:%S'` `hostname`:nginx's master process is failed to start,now kill keepalived process to initiate vrrp transition">>$logfile
ps -aux | grep keepalived | grep -v grep | awk '{print $2}' | xargs kill -9
else
echo "`date '+%F %H:%M:%S'` `hostname`:nginx started successfully.">>$logfile
fi
fi
负载均衡(lvs--virtual_server)
virtual_server 192.168.50.23 80 {
# 健康检查的间隔时间(秒)
delay_loop 6
#指定调度算法,轮询(rr)
lb_algo rr
# 指定群集工作模式,直接路由(DR)
# DR:直连,NAT:地址转换,TUN:隧道模式
lb_kind DR
# 连接保持时间(秒)
persistence_timeout 0
# 应用服务采用的是 TCP协议
protocol TCP# 指定第一个Web节点的地址、端口
real_server 192.168.50.56 80 {
# 节点的权重
weight 1
# 健康检查方式
TCP_CHECK {
# 添加检查的目标端口
connect_port 80
# 添加连接超时(秒)
connect_timeout 3
# 添加重试次数
nb_get_retry 3
# 添加重试间隔
delay_before_retry 3
}
}real_server 192.168.50.57 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}