13-Nginx_Keepalived高可用

1、Keepalived高可用基本概述

(1) 什么是高可用?

    一般是指2台机器启动着相同的业务系统,当有一台机器Down机了,另外一台服务器能快速的接管,对于访问的用户是无感知的。

(2) 高可用通常使用什么软件?

    通常服务高可用我们选择使用Keepalived软件实现

(3) Keepalived是如何实现高可用的?

    Keepalived软件是基于VRRP协议实现的。VRRP虚拟路由冗余协议,主要用于解决单点故障问题。

(4) 那么VRRP是如何诞生的,VRRP原理又是什么?

    比如公司的网络是通过网关转换进行上网的,那如果该路由器故障了,网关无法转发报文了,此时所有人都将无法上网,这时候怎么办呢?13-Nginx_Keepalived高可用    通常做法是给路由增加一台备节点,但问题来了?如果我们的主网关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地址。)
13-Nginx_Keepalived高可用    如何才能做到出现故障自动转移,此时VRRP就应运而生,我们的VVP其实就是通过软件或硬件的形式在Master和Backup外面增加一个虚拟MAC地址(简称VMAC)与虚拟IP(简称VIP)。那么这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的对应关系。

(5) 高可用Keepalived使用场景

    通常业务系统保持7X24小时不Down机,比如公司内部OA系统,每天公司人员都需要使用,则不允许Down机。作为业务系统来说随时都可使用。
13-Nginx_Keepalived高可用

(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) 对比keepalivedmasterbackup配置的区别
 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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!