一、Keepalived 高可用基本概述
1.什么是高可用
一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。
2.keepalived是如何实现高可用的
keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题
3.高可用keepalived核心概念
如何确定谁是主节点谁是备节点(选举投票,优先级)
如果Master故障,Backup自动接管,那么Maste恢复后会夺权吗(抢占试、非抢占式)
如果两台服务器都认为自己是Master会出现什么问题(脑裂)
二、keepalived高可用安装配置
环境准备
作用 | IP | 角色 |
---|---|---|
node1 | 10.0.0.5 | Master |
node2 | 10.0.0.6 | Backup |
VIP | 10.0.0.3 | 虚拟 |
安装keepalived
[root@lb01 ~]#yum -y install keepalived
[root@lb02 ~]#yum -y install keepalived
配置master
[root@lb01 ~]#cat /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface ens33 #网卡绑定接口
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
[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
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
对比master与Backup的keepalived配置区别
Keepalived配置区别 | Master节点配置 | Backup节点配置 |
---|---|---|
route_id(唯一标识) | router_id lb01 | router_id lb02 |
state(角色状态) | state MASTER | state BACKUP |
priority(竞选优先级) | priority 150 | priority 100 |
启动keepalived
三、高可用keepalived抢占式与非抢占式
默认两个节点的Keepalived都启动,节点1的优先级高于节点2,所以VIP在节点1上
[root@lb01 ~]#ip a |grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
关闭节点1的keepalived
[root@lb01 ~]#systemctl stop keepalived.service
#节点2联系不上节点1,主动接管VIP
[root@lb02 ~]#ip a |grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
此时重新启动Master上的keepalived,会发现VIP被强行抢占
[root@lb01 ~]#systemctl start keepalived.service
[root@lb01 ~]#ip a |grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
四、配置非抢占式
- 两个节点的state都必须配置为BACKUP
- 两个节点都必须加上配置 nopreempt
- 其中一个节点的优先级必须要高于另外一个节点的优先级。
两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。
Master配置
[root@lb01 ~]#vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_instance VI_1 {
state BACKUP #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
nopreempt
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
Backup配置
[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
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
通过windows的arp去验证,是否会切换MAC地址
#查看VIP在节点1上面
[root@lb01 ~]#ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
#windows查看Mac地址
C:\Users\Administrator> arp -a
#将节点1的keepalived停掉
[root@lb01 ~]# systemctl stop keepalived
#节点2接管VIP
[root@lb02 ~]#ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
#再次查看mac地址
C:\Users\Administrator> arp -a
#将节点1的keepalived重启
[root@lb01 ~]#systemctl start keepalived
C:\Users\Administrator> arp -a
#发现MAC地址没有转换 依旧是lb02MAC地址
五、高可用keepalived故障脑裂
脑裂故障原因
- 服务器网线松动等网络故障
- 服务器硬件故障发生损坏现象而崩溃
- 主备都开启firewalld防火墙
脑裂故障现象
#需先配置抢占式
[root@lb01 ~]#ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
[root@lb02 ~]#ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global ens33
#节点1和节点2相互发送VRRP信息 相互都收不到
六高可用keepalived结合nginx
为什么域名解析到VIP就可以访问nginx?
Nginx默认监听在所有的IP地址上,VIP会飘到一台节点上,相当于那台nginx多了VIP这么一个网卡,所以可以访问到nginx所在机器
但是…..如果nginx宕机,会导致用户请求失败,但是keepalived没有挂掉不会进行切换,所以需要编写一个脚本检测Nginx的存活状态,如果不存活则kill掉keepalived
编写脚本
[root@lb01 ~]#cat check_web.sh
#!/bin/sh
Nginx=`netstat -lnutp |grep 80|wc -l`
if [ $Nginx -eq 0 ];then
systemctl restart nginx
Nginx=`netstat -lnutp |grep 80|wc -l`
if [ $Nginx -eq 0 ];then
systemctl stop keepalived
fi
fi
#给脚本增加执行权限
[root@lb01 ~]#chmod +x check_web.sh
[root@lb01 ~]#ll
total 4
-rwxr-xr-x 1 root root 197 Dec 18 16:10 check_web.sh
在lb01主机的keepalived配置文件中调用此脚本
[root@lb01 ~]#vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
#每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_web {
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface ens33 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
#nopreempt
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
#调用并运行脚本
track_script {
check_web
}
}
重启服务
[root@lb01 ~]# systemctl restart keepalived
#在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。(注意,如果配置为非抢占式,那么需要两台服务器都使用该脚本)
Comments NOTHING