zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    (转)分布式加载网站的静态文件
    (转)一步一步Asp.Net MVC系列_权限管理设计起始篇
    (转)SQL Server复制入门(一)复制简介
    (转)【配置属性】—Entity Framework实例详解
    (转)动态Entity Framework查询:Dynamic Query 介绍
    (转)用扩展方法优化多条件查询
    (转)一步一步Asp.Net MVC系列_权限管理之权限控制
    (转 )Entity Framework Code First使用者的福音 EF Power Tool使用记之二(问题探究)
    (转)【工欲善其事必先利其器】—Entity Framework实例详解
    (转)C#/winform 腾讯QQ注册
  • 原文地址:https://www.cnblogs.com/gshelldon/p/13374577.html
Copyright © 2011-2022 走看看