zoukankan      html  css  js  c++  java
  • Nginx之Keepalived

    1. Keepalived 高可用基本概述

    1.1 什么是高可用

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

    1.2 高可用通常使用什么软件?

    硬件通常使用 F5软件通常使用 keepalived

    1.3 keepalived是如何实现高可用的?

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

    1.4 那么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地址)

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

    1.5 高可用keepalived使用场景

    通常业务系统需要保证7×24小时不DOWN机,比如公司内部的OA系统,每天公司人员都需要使用,则不允许Down机,作为业务系统来说随时都可用

    1.6 高可用keepalived使用场景

    1、如何确定谁是主节点谁是背节点(选举投票,优先级)

    2、如果Master故障,Backup自动接管,那么Master回复后会夺权吗(抢占试、非抢占式)

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


    2. Keepalived 高可用安装配置

    2.1 实践环境配置

    作用 IP 角色
    节点1 10.0.0.5 Master
    节点2 10.0.0.6 Backup
    VIP 10.0.0.3

    2.2 在master和backup上分别安装keepalived

    [root@lb01 ~]# yum install -y keepalived
    [root@lb02 ~]# yum install -y keepalived
    

    2.3 配置节点1,Master

    #找到配置文件
    [root@lb02 ~]# rpm -qc keepalived
    /etc/keepalived/keepalived.conf
    /etc/sysconfig/keepalived
    
    #编辑配置文件
    [root@lb01 ~]# cat /etc/keepalived/keepalived.conf
    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地址
        }
    }
    

    2.4 配置节点2,Backup

    [root@lb02 ~]# cat /etc/keepalived/keepalived.conf
    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
        }
    }
    

    2.5 对比master与Backup的keepalived配置区别

    Keepalived配置区别 Master节点配置 Backup节点配置
    route_id(唯一标识) router_id lb01 router_id lb02
    state(角色状态) state MASTER state BACKUP
    priority(竞选优先级) priority 150 priority 100

    2.6 启动Master和Backup节点的keepalived

    #Master节点
    [root@lb01 ~]# systemctl start keepalived
    [root@lb01 ~]# systemctl enable keepalived
    
    #Backup节点
    [root@lb02 ~]# systemctl start keepalived
    [root@lb02 ~]# systemctl enable keepalived
    

    3. 高可用keepalived抢占式与非抢占式

    3.1 两个节点都启动时

    #由于节点1的优先级高于节点2,所以VIP在节点1上面
    [root@lb01 ~]# ip addr | grep 10.0.0.4
    inet 10.0.0.4/32 scope global eth0
    

    3.2 关闭节点1的keepalived

    [root@lb01 ~]# systemctl stop keepalived
    
    #节点2联系不上节点1,主动接管VIP
    [root@lb02 ~]# ip addr | grep 10.0.0.4
    inet 10.0.0.4/32 scope global eth0
    

    3.3 此时重新启动Master上的keepalived,会发现VIP被强行抢占

    [root@lb01 ~]# systemctl start keepalived
    [root@lb01 ~]# ip addr | grep 10.0.0.4
        inet 10.0.0.4/32 scope global eth0
    

    3.4 配置非抢占式

    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
        }
    

    3.5 通过windows的arp去验证,是否会切换MAC地址

    #查看VIP在节点1上面
    [root@lb01 ~]# ip addr | grep 10.0.0.4
        inet 10.0.0.4/32 scope global eth0
    
    #windows查看Mac地址
    

    #将节点1的keepalived停掉
    [root@lb01 ~]# systemctl stop keepalived
    
    #节点2接管VIP
    [root@lb02 ~]# ip addr | grep 10.0.0.4
        inet 10.0.0.4/32 scope global eth0
    
    #再次查看mac地址
    


    4. 高可用keepalived故障脑裂

    由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳,个字去的资源及服务的所有权,而此时的两台高可用服务器又都还活着。

    4.1 脑裂故障原因

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

    4.2 脑裂故障现象

    #将节点1和节点2的防火墙都打开
    [root@lb01 ~]# systemctl start firewalld
    
    [root@lb02 ~]# systemctl start firewalld
    
    #fireshark抓包查看
    

    4.3 解决脑裂故障方案

    #如果发生闹裂,则随机kill掉一台即可
    #在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑
    [root@lb02 ~]# cat check_split_brain.sh
    #!/bin/sh
    vip=10.0.0.4
    lb01_ip=10.0.0.5
    while true;do
        ping -c 2 $lb01_ip &>/dev/null
        if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
            echo "ha is split brain.warning."
        else
            echo "ha is ok"
        fi
    sleep 5
    done
    

    5. 高可用keepalived与nginx

    5.1 为什么域名解析到VIP就可以访问nginx?

    Nginx默认监听在所有的IP地址上,VIP会飘到一台节点上,相当于那台nginx多了VIP这么一个网卡,所以可以访问到nginx所在机器

    5.2 如果nginx宕机,会导致用户请求失败,但是keepalived没有挂掉不会进行切换,所以需要编写一个脚本检测Nginx的存活状态,如果不存活则kill掉keepalived

    [root@lb01 ~]# mkdir /server/scripts
    [root@lb01 ~]# 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@lb01 ~]# chmod +x /server/scripts/check_web.sh
    

    5.3 在lb01主机的keepalived配置文件中调用此脚本

    [root@lb01 ~]# cat /etc/keepalived/keepalived.conf
    global_defs {           
        router_id lb01      
    }
    
    #每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
    vrrp_script check_web {
        script "/server/scripts/check_web.sh"
        interval 5
    }
    
    vrrp_instance VI_1 {
        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.4   
        }
    }
    
    #调用并运行脚本
    track_script {
        check_web
    }
    
    #在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。(注意,如果配置为非抢占式,那么需要两台服务器都使用该脚本)
  • 相关阅读:
    ACCESS中默认值要填双引号
    错误一直找不到
    员工自行车的摆放处
    连接占线导致另一个hstmt
    去裕利面试
    路上又一见闻
    企业的形象
    骏泰面试感觉
    IE 标点符号输入不顺的原因
    C Primer Plus(十七)
  • 原文地址:https://www.cnblogs.com/223zhp/p/11453129.html
Copyright © 2011-2022 走看看