高可用keepalived
什么是高可用?
一台服务器出现问题,另一台机器自动接管,不影响业务的使用
keepalived原理
keepalived基于VRRP协议
VIP漂移,VMAC地址通知ARP协议修改
高可用使用的软件 keepalived
1.keepalived协议
keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议
2.keepalived使用场景
通常业务系统需要保证7×24小时不DOWN机,比如公司内部的OA系统,每天公司人员都需要使用,则不允许Down机,作为业务系统来说随时都可用
3.高可用keepalived核心概念
1、如何确定谁是主节点谁是备节点(选举投票,优先级)
2、如果Master故障,Backup自动接管,那么Master恢复后会夺权吗(抢占试、非抢占式)
3、如果两台服务器都认为自己是Master会出现什么问题(脑裂)
搭建keepalived
1.安装keepalived
[root@lb01 ~]# yum install -y keepalived
[root@lb02 ~]# yum install -y keepalived
2.配置keepalived
#主节点配置
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb01 #身份识别
script_user root #脚本执行用户,如果没有会报错
}
vrrp_instance VI_1 {
state MASTER #默认身份是master
interface eth0 #VIP加在哪块网卡
virtual_router_id 51 #分组
priority 150 #优先级
advert_int 3 #沟通间隔
authentication {
auth_type PASS #认证方式 以明文密码的方式
auth_pass 1111 #密码是多少
}
virtual_ipaddress {
10.0.0.2 #VIP的地址
}
}
#备节点配置
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.2
}
}
全局定义块
1、email通知(notification_email、smtp_server、smtp_connect_timeout):用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用nagios全面监控代替。
2、lvs_id:lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。
3、router_id:用户标识本节点的名称,通常为hostname
4、花括号{}:用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。
VRRP实例定义块
vrrp_sync_group:同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
group:至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
vrrp_instance:vrrp实例名
1> state:实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。
2> interface:对外提供服务的网卡接口,即VIP绑定的网卡接口。如:eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。
3>mcast_src_ip:本机IP地址
4>virtual_router_id:虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。
5> priority:节点优先级,取值范围0~254,MASTER要比BACKUP高
6>advert_int:MASTER与BACKUP节点间同步检查的时间间隔,单位为秒
7>lvs_sync_daemon_inteface:负载均衡器之间的监控接口,类似于 HA HeartBeat的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口
8> authentication:验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP使用相同的密码才能正常通信。
9>smtp_alert:有故障时是否激活邮件通知
10>nopreempt:禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
11>virtual_ipaddress:虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。
在keepalived.conf配置文件中加入以下内容
1.notify_master“想要执行的脚本路径” #表示当切换到master状态时,要执行的脚本
2.notify_backup “想要执行的脚本路径”#表示当切换到backup状态时,要执行的脚本
3.notify_fault“想要执行的脚本路径”#表示切换出现故障时要执行的脚本
Keepalived配置区别 | Master节点配置 | Backup节点配置 |
---|---|---|
route_id(唯一标识) | router_id lb01 | router_id lb02 |
state(角色状态) | state MASTER | state BACKUP |
priority(竞选优先级) | priority 150 | priority 100 |
10.0.0.3 | 10.0.0.4 |
3.启动keepalived
systemctl start keepalived
#查看VIP在哪台负载均衡上起作用
hostname -I
10.0.0.3 10.0.0.2 172.16.1.3
4.高可用keepalived的抢占式与非抢占式
1)抢占式
master节点出现故障,keepalived关闭,backup节点自动接管VIP,如果master修复则抢回VIP,VIP回到master节点
#在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。
2)非抢占式
master节点出现故障,keepalived关闭,backup节点自动接管VIP,如果master修复,VIP任然在backup节点,当backup出现故障,master再将VIP切换
3)配置非抢占式
1、两个节点的state都必须配置为BACKUP
2、两个节点都必须加上配置 nopreempt
3、其中一个节点的优先级必须要高于另外一个节点的优先级。
两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级
Master配置
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}
Backup配置
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
4.高可用keepalived的脑裂故障
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。
1)产生脑裂的原因
1、服务器网线松动等网络故障
2、服务器硬件故障发生损坏现象而崩溃
3、主备都开启firewalld防火墙
2)模拟脑裂
#将节点1和节点2的防火墙都打开
[root@lb01 ~]# systemctl start firewalld
[root@lb02 ~]# systemctl start firewalld
3)检查是否脑裂办法
#如果发生脑裂,则随机kill掉一台即可
#在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
vip=10.0.0.2
lb01_ip=10.0.0.3
while true;do
#在 lb02 主机ping lb01 主机
ping -c 2 $lb01_ip &>/dev/null
#如果能ping通,且,lb02 主机上有VIP
if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
systemctl restart keepalived
echo "发生了脑裂"
else
echo "哈哈没事"
fi
sleep 5
done
keepalived 与 nginx
# keepalived 只是解决 nginx 单点故障问题,下面是非抢占式配置
1.在web服务器上写检测脚本
#lb01 lb02 2台主机都配置脚本
[root@lb01 ~]# vim check_web.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.通过pid进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl start nginx
sleep 3
# 等待3秒后再次获取一次Nginx状态
nginxpid=$(ps -C nginx --no-header|wc -l)
# 再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
nginxport=$(netstat -lntp | grep nginx|wc -l)
#2.通过端口进行判断, 如Nginx还不存活则重启Keepalived,让地址进行漂移,并退出脚本
if [ $nginxport -eq 0 ];then
systemctl start nginx
sleep 3
# 等待3秒后再次获取一次Nginx状态
nginxport=$(netstat -lntp | grep nginx|wc -l)
# 再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
#给脚本增加执行权限
[root@lb01 ~]# chmod +x /root/check_web.sh
2.配置 keepalived 自动执行脚本
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
script_user root
}
#每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_web {
script "/root/check_web.sh"
interval 5
weight -1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 150
advert_int 1
mcast_src_ip 10.0.0.3 #指定发送组播数据包的源IP地址
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.2
}
}
#调用并运行脚本
track_script {
check_web
}
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
script_user root
}
#每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_web {
script "/root/check_web.sh"
interval 5
weight -1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
mcast_src_ip 10.0.0.4 #指定发送组播数据包的源IP地址
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.2
}
}
#调用并运行脚本
track_script {
check_web
}
注意
1、生产中建议配置非抢占式
2、nginx没启动的时候keepalived 启动不了
指定 keepalived 日志位置
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
vim /etc/rsyslog.conf
#最后添加
local0.* /var/log/keepalived.log
#重启系统后就可以查看日志了
tail -f /var/log/keepalived.log
注意:
默认情况下,rsyslog是受selinux限制的
所以日志只能输出到 /var/log/messages里,自定义的目录无效
例如keepalived,haproxy的日志输出,都依赖于rsyslog
因此我们要关闭selinux
keepalived 开机启动不了
由于nginx还没有启动引起keepalived启动不了
解决方法:
vim /lib/systemd/system/keepalived.service
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target nginx.service