1.什么是高可用?
通常情况下,都是启动2台相同的业务系统,一台故障,另外一台自动接管
2.高可用实现的工具?
服务高可用,keepalived软件实现
3.keepalived如何实现高可用?
keepalived基于VRRP协议,虚拟路由冗余协议
4.keepalived的使用和安装
- 实践环境,配置实现虚IP转移
状态 IP 角色
节点1 10.0.0.5 Master
节点2 10.0.0.6 Backup
VIP 10.0.0.3
- 安装keepalived
yum install keepalived -y
- 配置Master的Keepalived
global_defs { #全局配置
router_id lb01 #表示身份->名称
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface eth0 #网卡绑定接口
virtual_router_id 50 #虚拟路由id 重要
priority 150 #优先级 重要
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #明文认证
auth_pass 1111 #明文密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
- 配置Backup的Keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
- 对比keepalived的master与backup配置的区别
Keepalived配置区别 Master配置 Backup节配置
route_id(唯一标识) lb01 lb02
state(角色状态) Master Backup
priority(竞选优先级) 150 100
- 配置完成之后,启动keepalived
[root@lb01 ~]# systemctl enable keepalived
[root@lb01 ~]# systemctl start keepalived
- 配置非抢占式
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
}
keepalived 的一些问题
1.主和备都配置一样的角色,一样的优先级??
keepalived虚拟地址漂移与Nginx服务进行关联
1.Nginx默认监听在所有的IP地址上
2.用户将域名解析到VIP上面即可
2.由于下面的原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。
- 服务器网线松动等网络故障
- 服务器硬件故障发生损坏现象而崩溃
- 主备都开启firewalld防火墙
此时就发发生脑裂,如果发生脑裂,则随机kill掉一台即可。
我们接下来,可以在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
lb01_vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
ping -c 2 -W 3 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 5
done
3.如果Nginx服务死掉,会出现啥原因?
1.会导致用户无法正常的访问到网站。
2.该服务器的VIp也不会进行漂移(因为keepalived与nginx是两个不同的软件)
解决手段:
写个监控脚本,如果nginx停止运行,则尝试启动,如果尝试失败,则停止keepalived
[root@lb01 ~]# mkdir /server/scripts
[root@lb01 ~]# vim /server/scripts/check_web.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)
#判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginxpid -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒后再次获取一次Nginx状态
nginxpid=$(ps -C nginx --no-header|wc -l)
#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
#给脚本增加执行权限
[root@lb01 ~]# chmod +x /server/scripts/check_web.sh
注意,上述的脚本,我们需要在keepalived的配置文件中, 进行配置,才能定时执行
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
#1.每5秒执行一次脚本, 脚本执行内容不能超过5秒,否则会被中断再次重新运行脚本
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
nopreempt
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
#2.调用并运行该脚本
track_script {
check_web
}
}
注意:公有云不支持keepalived, 一般都是银行、金融、证券、国企才会使用