什么是高可用
- 两台相同的业务系统,当某一台故障时,另外一台自动接管、提供服务
- 尽可能的希望我们的业务,持续不间断的提供服务
如何实现高可用
- keepalived:基于vrrp(虚拟路由冗余协议)协议实现高可用(运行在网络层面)
- 解决局域网中配置静态网关出现单点失效现象的路由协议
抢占式-配置(web-01)master
[root@nginx ~]# yum -y install keepalived.x86_64
[root@nginx ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
globa_defs {
router_id lb01 :表示身份
}
vrrp_instance VI_1 {
state MASTER
interface eth0 :绑定在eth0的网卡
virtual_router_id 50 :组id
priority 100 :优先级
advert_int 1 :每隔一秒探测是否存活
authentication {
auth_type PASS
auth_pass 111
}
virtual_ipaddress {
192.168.200.111 :虚拟的IP地址
}
}
抢占式-配置(web-02)backup
[root@nginx ~]# yum -y install keepalived.x86_64
[root@nginx ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111
}
}
非抢占式【配置文件】
- 首先节点机器都需要是backup角色
- 通过优先级确定谁是master
- 增加nopreempt
为什么要使用非抢占式
- 默认抢占式我们发现当master节点出现故障之后虚拟VIP会漂移到backup节点使用,当master恢复后又会将VIP抢占回来
- 故障和回复过程中出现了两次的VIP的漂移。如果在业务场景中是不适用的,我们可以使用非抢占式,当master恢复后不抢占VIP,backup继续使用VIP工作
web-01配置
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111
}
}
web-02配置
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111
}
}
keepalived【通过脚本监控nginx状态】
- 上面的使用方式是当服务节点出现故障停机、主机失联、keepalived服务故障,VIP才会切换飘逸,与nginx的运行状态没有任何关联
- 我们可以通过脚本监控nginx健康状态,实现地址飘逸
脚本的编写
#!/bin/bash
nginx_status=$(pidof nginx | wc -l)
if [ ${nginx_status} -eq 0 ];then
systemctl restart nginx &> /dev/null
sleep 2
nginx_status=$(pidof nginx | wc -l)
if [ ${nginx_status} -eq 0 ];then
systemctl stop keepalived &> /dev/null
fi
fi
chmod +x ke.sh
将脚本添加到keepalived配置中
global_defs {
router_id lb01
}
vrrp_script ckeck_web {
script "/sh/ke.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111
}
track_script {
check_web
}
}
global_defs {
router_id lb01
}
vrrp_script ckeck_web {
script "/sh/ke.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 99
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111
}
track_script {
check_web
}
}