1、Keepalived高可用基本概述
(1) 什么是高可用?
一般是指2台机器启动着相同的业务系统,当有一台机器Down机了,另外一台服务器能快速的接管,对于访问的用户是无感知的。
(2) 高可用通常使用什么软件?
通常服务高可用我们选择使用Keepalived软件实现
(3) Keepalived是如何实现高可用的?
Keepalived软件是基于VRRP协议实现的。VRRP虚拟路由冗余协议,主要用于解决单点故障问题。
(4) 那么VRRP是如何诞生的,VRRP原理又是什么?
比如公司的网络是通过网关转换进行上网的,那如果该路由器故障了,网关无法转发报文了,此时所有人都将无法上网,这时候怎么办呢?
通常做法是给路由增加一台备节点,但问题来了?如果我们的主网关master故障了,用户是需要手动修改网关指向Backup,如果用户过多修改起来会非常的麻烦。
第一个问题:
假设用户将指向都修改到Backup路由器,那么Master路由器如果修复好了又该怎么办?
第二个问题:
假设Master网关故障,我们将Backup网关配置为Master网关IP行不行?
其实上不行,因为PC第一次是通过ARP广播寻找到Master网关的Mac地址与P地址,PC则会将Master网关的对应P与MAC地址写入ARP缓存表中,那么PC第二次则会直接读取ARP缓存表中的MAC地址与P地址,然后进行数据包的转发。此时PC转发的数据包还是会交给Master。(除非PC的ARP缓存表过期,再次发起ARP广播的时候才能正确获取Bakcup的Mac地址与对应的IP地址。)如何才能做到出现故障自动转移,此时VRRP就应运而生,我们的VVP其实就是通过软件或硬件的形式在Master和Backup外面增加一个虚拟MAC地址(简称VMAC)与虚拟IP(简称VIP)。那么这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的对应关系。
(5) 高可用Keepalived使用场景
通常业务系统保持7X24小时不Down机,比如公司内部OA系统,每天公司人员都需要使用,则不允许Down机。作为业务系统来说随时都可使用。
(6) 高可用核心概念总结
-
如何确定谁是主节点谁是备节点。(投票选举?优先级?) -
如果Master故障,Backup主动接管,那Master恢复后会夺权吗?(抢占式、非抢占式) -
如果两台服务器都认为自己是Master会出现什么问题?
2、Keepalived高可用安装配置
(1) 实践环境,配置实现虚IP转移
状态 IP 角色 主机名
节点1 192.168.2.5 Master Nginx-5
节点2 192.168.2.6 Backup Nginx-6
VIP 192.168.2.111
(2)在master与backup上分别安装keepalived
[root@Nginx-5 ~]# yum -y install keepalived
[root@Nginx-6 ~]# yum -y install keepalived
(3) 配置节点1,Master
[root@Nginx-5 ~]# cat /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id 01 #标识唯一身份
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface ens192 #网卡绑定接口
virtual_router_id 50 #虚拟路由id(相当于一个组,master和backup必须设置相同才能找到对方,进行对比。)
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #明文认证
auth_pass 1111 #明文密码
}
virtual_ipaddress {
192.168.2.111 #虚拟的VIP地址,可以配多个。
}
}
(4) 配置节点2,Backup
[root@Nginx-6 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id 02
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.111
}
}
(5) 对比keepalived
的master
与backup
配置的区别
Keepalived配置区别 Master配置 Backup配置
route_id(唯一标识) router_id 01 router_id 02
state(角色状态) state Master state Backup
priority(竞选优先级) priority 150 priority 100
(6) 启动Master与Backup节点的keepalived
# 01
[root@Nginx-5 ~]# systemctl enable keepalived
[root@Nginx-5 ~]# systemctl start keepalived
# 02
[root@Nginx-6 ~]# systemctl enable keepalived
[root@Nginx-6 ~]# systemctl start keepalived
3、Keepalived高可用地址漂移
(1) VIP在Master服务器上
[root@Nginx-5 ~]# ip addr |grep 192.168.2.111
inet 192.168.2.111/32 scope global ens192
(2) 模拟一下Master故障
# 在Master上关闭keepalived
[root@Nginx-5 ~]# systemctl stop keepalived
[root@Nginx-5 ~]# ip addr |grep 192.168.2.111
[root@Nginx-5 ~]#
#发现地址已经漂移到Backup端
[root@Nginx-6 ~]# ip addr |grep 192.168.2.111
inet 192.168.2.111/32 scope global ens192
(3) 此时重新启动Master上的Keepalived服务,会发现VIP被强行抢回(默认抢占式)
# 重新启动Master上的Keepalived服务,VIP被强行抢回
[root@Nginx-5 ~]# systemctl restart keepalived
[root@Nginx-5 ~]# ip addr |grep 192.168.2.111
inet 192.168.2.111/32 scope global ens192
# Backup 上没有了
[root@Nginx-6 ~]# ip addr |grep 192.168.2.111
[root@Nginx-6 ~]#
# 查看Backup日志
Jun 19 22:53:25 Nginx-6 Keepalived_vrrp[1970]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Jun 19 22:53:25 Nginx-6 Keepalived_vrrp[1970]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jun 19 22:53:25 Nginx-6 Keepalived_vrrp[1970]: VRRP_Instance(VI_1) removing protocol VIPs.
Jun 19 23:01:01 Nginx-6 systemd: Started Session 8 of user root.
(4) 设置非抢占式
通常如果Master服务故障后,Backup会变成Master,但是当Master服务恢复的时候,Master会抢占VIP,这样就会发生两次切换,对业务繁忙的网站来说并不是太友好,可在Mater端的设置中添加如下参数
vrrp_instance VI_1 { ······ nopreempt ······
配置非抢占式注意事项:
1、两个节点的state都必须配置为BACKUP
2、最好在两个节点加上配置 nopreempt(Master必须配)
3、其中一个节点的优先级必须要高于另外一个节点的优先级。
引用官方文档对nopreempt字段的说明:"nopreempt" allows the lower priority machine to maintain the master role, even when a higher priority machine comes back online.
NOTE: For this to work, the initial state of this entry must be BACKUP.
根据上述描述,第一点提到的state必须配置为BACKUP就明白了。
# Master配置
[root@Nginx-5 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id 01
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface ens192
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.111
}
}
#Backup配置
[root@Nginx-6 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id 02
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface ens192
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.111
}
}
(5) keepalived虚拟地址漂移与Nginx服务进行关联
-
1.Nginx默认监听在所有的IP地址上。 -
2.用户将域名解析到VIP上面即可。
4、Keepalived高可用故障脑裂
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器有都还活着。
常见故障原因:
服务器网线松动等网络故障 服务器硬件故障发生损坏现象而奔溃 (以上这两个模拟不了) 主备都开启 firewalld
防火墙 (如果发生脑裂,也就是主备都有VIP,则随机kill掉一台即可。)Nginx服务死掉等
(1) 在备上编写检测脚本,测试如果能ping
通主并且备节点还有VIP
的话则认为产生了脑裂
[root@Nginx-6 ~]# cat check_split_brain.sh
#!/bin/sh
01_vip=192.168.2.111
01_ip=192.168.2.5
while true;do
ping -c 2 -W 3 $01_ip &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$01_vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 5
done
(2) 如果Nginx岩机,会导致用户请求失败,但是keepalived
并不会进行切换,所以需要编写一个脚本检测Nginx的存活状态,如果不存活则kill nginx和keepalived
Nginx服务死掉等
1.会导致用户无法正常的访问到网站。 2.该服务器的VIp也不会进行漂移(因为keepalived与nginx是两个不同的软件) 解决手段:写个监控脚本,如果nginx停止运行,则尝试启动,如果尝试失败,则停止keepalived
[root@Nginx-5 ~]# mkdir /server/scripts
[root@Nginx-5 ~]# vim /server/scripts/check_web.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.判断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@Nginx-5 ~]# chmod +x /server/scripts/check_web.sh
(3) 在Master主机的keepalived配置文件中调用此脚本
#在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。(注意,如果配置为非抢占式,那么需要两台服务器都使用该脚本)
[root@Nginx-5 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id 01
}
#1.每5秒执行一次脚本, 脚本执行内容不能超过5秒,否则会被中断再次重新运行脚本
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
nopreempt
state MASTER
interface ens192
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.2.111
}
#2.调用并运行该脚本
track_script {
check_web
}
}
注:公有云不支持keepalived(自带LVS+keppalived高可用)
原文始发于微信公众号(运维库):13-Nginx_Keepalived高可用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/64273.html