keepalived
一、keepalived简介
1.1 keepalived是什么?
keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:nginx、haproxy、mysql等)的高可用解决方案软件。
keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
Keepalived官网:http://www.keepalived.org/
2.2 Keepalived的重要功能
keepalived有三个重要的功能,分别是:
-
管理LVS负载均衡软件
-
实现LVS集群节点的健康检查
-
作为系统网络服务的高可用性
2.3 Keepalived高可用故障转移的原理
Keepalived高可用服务之间的故障切换转移,是通过VRRP来实现的。
在Keepalived服务正常工作时,主Master节点会不断地向备Backup节点发送(多播的方式)心跳消息,用以告诉备节点自己还活着,当主节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主节点的心跳了,于是调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
二、Keepalived原理
2.1 VRRP
Keepaliced高可用对之间是通过VRRP通信的,因此,我们从VRRP开始了解起:
-
VRRP,中文名为虚拟路由冗余协议,是为了解决静态路由的单点故障。
-
VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
-
VRRP用IP多播的方式(默认多播地址224.0.0.18)实现高可用对之间通信。
-
工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
-
VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
2.2 Keepalived工作原理
Keepalived高可用是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主节点的优先级高于备节点,因此,工作时主节点会优先获得所有的资源,备节点处于等待状态,当主节点挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在Keepalived服务之间,只有作为主节点的服务器会一直发送VRRP组播包,告诉备节点它还活着,此时备节点不会抢占主节点,当主节点不可用时,即备节点监听不到主节点发送的组播包时,就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于1秒。
三、Keepalived部署
3.1 keepalived配置文件说明
cd /etc/keepalived
cp keepalived.conf conf keepalived.conf.ba
cat keepalived.conf
# 配置文件重要信息含义
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 LVS_DEVEL # 定义路由标识信息,同局域网内唯一
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { # 定义实例
state MASTER # 指定keepalived节点的初始状态,可选值为MASTER/BACKUP
interface eth0 # VRRP实例绑定的网卡接口,用户发送VRRP包
virtual_router_id 51 # 虚拟路由的ID,同一集群要一致
priority 100 # 定义优先级,按优先级来决定主备角色,优先级越大越优先
advert_int 1 # 主备通讯时间间隔
authentication { # 配置认证
auth_type PASS # 认证方式,此处为密码
auth_pass 1111 # 同一集群中的keepalived配置里此处必须一致,推荐使用8为随机数
}
virtual_ipaddress { # 配置要使用的VIP
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 443 { # 配置虚拟服务器
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.201.100 443 { # 定义真实处理请求的服务器
weight 1 # 给服务器指定权重,默认为1
SSL_GET {
url {
path / # 指定要检查的URL路径
digest ff20ad2481f97b1754ef3e12ecd3a9cc # 摘要信息
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 # 连接超时时间
retry 3 # get尝试次数
delay_before_retry 3 # 在尝试之前延迟多长时间
}
}
}
3.2 环境说明
master 192.168.100.100 CentOS-7
backup 192.168.100.200 CentOS-7
VIP 192.168.100.150
防火墙与selinux都关闭
配置阿里源与epel源
# 安装常用命令
yum -y install vim wget gcc gcc-c++
# 安装keepalived
yum -y install keepalived
# 安装nginx
yum -y install nginx
systemctl restart nginx
systemctl enable nginx
# master节点添加测试网页
echo "master node" > /usr/share/nginx/html/index.html
# backup节点添加测试网页
echo "backup node" > /usr/share/nginx/html/index.html
3.3 配置主节点配置文件
global_defs {
router_id ldh01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.150
}
}
virtual_server 192.168.100.150 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.100.100 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.200 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# 重启keepalived,并设置下次启动生效
systemctl restart keepalived.service
systemctl enable keepalived.service
3.4 配置备节点配置文件
global_defs {
router_id ldh02
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 90 # 比主节点小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.150
}
}
virtual_server 192.168.100.150 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.100.100 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.200 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
# 重启keepalived,并设置下次启动生效
systemctl restart keepalived.service
systemctl enable keepalived.service
3.5 主节点与备节点开启侦听VIP功能
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
sysctl -p
3.6 让keepalived监控nginx负载均衡
在master上编写脚本
mkdir /scripts
cd /scripts/
vim check.sh
#!/bin/bash
nginx_status=`ps -ef | grep -v "grep" | grep "nginx" | wc -l`
if [ $nginx_status -lt 1 ];then
systemctl stop keepalived
fi
:wq
chmod +x check.sh
vim notify.sh
#!/bin/bash
VIP=$2
sendmail () {
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to master"
echo $content | mail -s "$subject" 843261424@qq.com
}
case "$1" in
master)
nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
if [ $nginx_status -lt 1 ];then
systemctl start nginx
fi
sendmail
;;
backup)
nginx_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
if [ $nginx_status -gt 0 ];then
systemctl stop nginx
fi
;;
*)
echo "Usage:$0 master|backup VIP"
;;
esac
:wq
chmod +x notify.sh
在backup上编写脚本
mkdir /scripts
cd /scripts/
scp root@192.168.100.100:/scripts/check.sh .
scp root@192.168.100.100:/scripts/notify.sh .
chmod +x check.sh
chmod +x notify.sh