一、keepelived如何实现高可用?
keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题
原理:主备服务器都属于一个小组,主服务器会持续向组内成员发送心跳信息,告诉备用服务存活,如果备用服务器接收不到心跳信息,则自动接管自动接管VIP虚拟ip地址和虚拟MAC地址,备用服务器接管虚拟ip地址后,会发送通告信息,告诉网络中的所有设备MAC地址变更
二、主服务器恢复后的方式
抢占式:恢复就抢回去继续当主(主服务器配置高于备服务器)
非抢占式:恢复就变成备用服务器(主备服务器配置相同)
三、keepailved配置非抢占式,默认抢占式(负载均衡单点,通过心跳信息探测keepalived是否存在)
1.再创建一台负载均衡并hosts解析
【位置: 10.0.0.12 主机名为LB02】
2.配置10.0.0.11为主服务器
【位置:10.0.0.11 主机名为LB】
[root@LB ~]# yum -y install keepalived #安装服务
[root@LB ~]# vim /etc/keepalived/keepalived.conf #配置文件配置
点击查看代码
global_defs { #全局配置
router_id LB #标识身份->名称
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
nopreempt #非抢占式
priority 150 #优先级 150票
advert_int 1 #监测间隔时间 秒
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
[root@LB ~]# systemctl start keepalived
[root@LB ~]# systemctl enable keepalived
3.配置10.0.0.12为备服务器(与主服务器操作相同、配置文件的优先级票数不同)
[root@LB02 ~]# vim /etc/keepalived/keepalived.conf
点击查看代码
global_defs {
router_id LB02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 50
priority 100 #优先级票数减少
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
四、可能出现脑裂的问题(都探测不到心跳,都想接管服务器)
1.问题排查:
1)双方开启了防火墙
2)网络设备问题
3)网线问题
4)网卡问题
2.如何解决脑裂:
(通过脚本探测主服务器是否有相同的10.0.0.3虚拟ip地址,有则杀死自己的keepalived的服务)
第一步:10.0.0.12备用服务器生成密钥对
[root@LB02 ~]# ssh-keygen
第二步:将密钥对推送到主服务器
[root@LB02 ~]# ssh-copy-id 10.0.0.11
[root@LB ~]# > /etc/issue.net # 清空登录前的提示信息
第三步:写脚本探测是否同时存在10.0.0.3相同的虚拟IP地址
[root@LB02 ~]# vim check_vip.sh
点击查看代码
LB=`ssh 10.0.0.11 ip a|grep 10.0.0.3|wc -l`
LB02=`ip a|grep 10.0.0.3|wc -l`
[ $LB -eq $LB02 ] && systemctl stop keepalived #当LB和LB02相等时则关闭自己的keepalived
3.为什么 netstat 看不到 10.0.0.3?
原因分析:
Nginx 监听的是 0.0.0.0:443,不是特定 IP
VIP 10.0.0.3 是网卡上的别名 IP
netstat 默认显示监听绑定的 IP,不是所有可访问的 IP
4.当自身的负载均衡down后,自动杀死自己的keepalived避免僵尸服务
1)写脚本
[root@LB ~]# vim cjeck_web.sh
点击查看代码
#!/bin/sh
NG=`ps -C nginx --no-header|wc -l`
if [ $NG -eq 0 ]
then
#如果nginx不存在则尝试重启nginx
systemctl restart nginx
#等待1秒
sleep 1
#在重新检查nginx是否存在
NG=`ps -C nginx --no-header|wc -l` #判断nginx是否存在
if [ $NG -eq 0 ]
then
#如果$NG变量为0说明nginx还是没有启动、只能杀死keepalived
systemctl stop keepalived
fi
fi
2)集成到配置文件中自动执行
[root@LB ~]# vim /etc/keepalived/keepalived.conf
点击查看代码
router_id LB #标识身份->名称
}
vrrp_script cjeck_web {
script "/root/cjeck_web.sh" # 脚本的位置
interval 5 #5秒检测一次
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级 150票
advert_int 1 #监测间隔时间 秒
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
track_script {
cjeck_web #调用cjeck_web模块并执行
}
}
3)给脚本X执行权限
[root@LB ~]# chmod +x cjeck_web.sh
浙公网安备 33010602011771号