Keepalived+nginx高可用

这种方法会把Keepalived进程结束掉,在教育机构学习到的方法,我个人对这种方法不认可。

参考: https://www.cnblogs.com/gshelldon/p/14504236.html

1.域名不能绑定在两个IP上

  • 我们把域名绑定在VIP上

2.如何实现切换?

负载均衡的高可用

keepalived

注意:任何软件都可以使用keepalived来做高可用

keepalived如何实现高可用

VRRP:虚拟路由冗余协议

比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?

通常做法是给路由器增加一台北街店,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。

问题一:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办?
问题二:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以?

其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)

VIP:虚拟IP地址

VMAC:虚拟mac地址

如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息。

安装配置keepalived

环境准备

作用 IP 角色 VIP
lb01 10.0.0.5 Master 10.0.0.3
lb02 10.0.0.6 Backup 等master挂了VIP会过来
web01 10.0.0.7 web 没有VIP

部署web

部署MySQL

部署lb01

部署lb02

部署 keepalived

# 1.安装keepalived
[root@lb01 ~]# yum install -y keepalived
[root@lb02 ~]# yum install -y keepalived

# 2.MASTER配置文件
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地址
    }
}

# 3.BACKUP配置文件
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和nginx关联起来

抢占式和非抢占式

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
    }

关联nginx和keepalived

vim /etc/keepalived/keepalived.conf 

global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}

vrrp_script xxx {
    script "/root/nginx_keep.sh"
    interval 5
}

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地址
    }
    
}

track_script {
    xxx
}

[root@lb01 ~]# cat /root/nginx_keep.sh
#!/bin/sh
nginx_status=$(ps -C nginx --no-header|wc -l)

#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginx_status -eq 0 ];then
    systemctl start nginx
    sleep 3
    #2.等待3秒后再次获取一次Nginx状态
    nginx_status=$(ps -C nginx --no-header|wc -l) 
    #3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本  
    if [ $nginx_status -eq 0 ];then
        systemctl stop keepalived
   fi
fi

# 想让VIP漂移,不重启nginx
#!/bin/sh
nginx_status=$(ps -C nginx --no-header|wc -l)

if [ $nginx_status -eq 0 ];then
        systemctl stop keepalived
fi

## 注意:如果是抢占式,脚本只需要放在MASTER上,如果是非抢占式,脚本必须放在MASTER和BACKUP上

[root@lb01 ~]# chmod +x /root/nginx_keep.sh

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}

vrrp_script xxx {
    script "/usr/local/nginx_keep.sh"
    interval 5
}

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地址
    }

    track_script {
        xxx
    }
}

网站访问脚本

#!/bin/bash

while true;do
        code_status=$(curl -I -m 10 -o /dev/null -s -w %{http_code} www.wp.com)
        if [ $code_status -eq 200 ];then
                echo "$(date +%F-%T)_网站访问成功" >> /tmp/web.log
        else
                echo "$(date +%F-%T)_网站访问失败,状态码是: $code_status" >> /tmp/web.log
        fi
        sleep 1
done

高可用会存在的问题:

1、如何确定谁是主节点谁是备节点?

  • MASTER(主节点)
  • BACKUP(备节点)
  • priority(优先级,主节点的优先级要大于备节点的优先级)

2、如果Master故障,Backup自动接管,那么Master回复后会夺权吗?

  • 如果配置的是抢占式,MASTER会抢回VIP
  • 如果配置的是非抢占式,两个都BACKUP,额外加一个参数:nopreempt,非抢占式不会抢VIP

3、如果两台服务器都认为自己是Master会出现什么问题

两台机器上面都有VIP,两台机器都认为自己是主节点,如果都有VIP,会导致网站访问不了

1、服务器网线松动等网络故障
2、服务器硬件故障发生损坏现象而崩溃
3、主备都开启firewalld防火墙

#!/bin/sh
vip=10.0.0.3
lb01_ip=10.0.0.5
#while true;do
    ping -c 2 $lb01_ip &>/dev/null
    if [ $? -eq 0 ];then
        lb01_vip_status=$(ssh $lb01_ip "ip add|grep $vip|wc -l")
        lb02_vip_status=$(ip add|grep $vip|wc -l)
        if [ $lb01_vip_status -eq 1 -a $lb02_vip_status -eq 1 ];then
                echo '主节点和备节点都有VIP,开始关闭备节点的VIP...'
                systemctl stop keepalived
        fi
    else
        echo '主节点无法通信'
    fi
#sleep 5
#done

注意:

负载均衡:lvs harproxy nginx

1.如果企业中用的是物理服务,机房。我们可以做keepalived的高可用

2.如果企业中用的是云服务器,(阿里云...)不能做keepalived.... slb

posted @ 2020-07-24 21:12  Gshelldon  阅读(274)  评论(0编辑  收藏  举报