第四节:小白学nginx之keeplived的高可用

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, 一般都是银行、金融、证券、国企才会使用

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术