• nginx五 之高可用


    友情提示: 高可用是在缓存模块的环境基础上搭建,缓存模块可以参考http://www.cnblogs.com/dahuandan/p/6765042.html

    介绍

    单点架构的应用在出现故障时,会导致系统崩溃,停止服务。为了提高系统的容错性,减少故障停机的几率,需要建立一套备份机制,在故障发生时,转移到能正常工作的服务器上,这种方式就是高可用;

    nginx高可用一般通过keepalived实现,分为主备、主主两种方式,通常主主更能有效利用资源。

    主备方式

    配置主机


    #安装keepalived
    yum install keepalived -y
    #编辑keepalived的配置文件
    vi /etc/keepalived/keepalived.conf
    
    #内容如下:
    
    
    #全局配置,这里额外的静态路由并未添加因为它是非必要的,除非我们在当前或特定的主机上生成特殊的静态路由等  
    global_defs {
    
       #realserver故障时通知邮件的收件人地址,可以多个  
       notification_email {  
         acassen@firewall.loc
       }
       
       #发件人信息(可以随意伪装,因为邮件系统不会验证处理发件人信息)  
       notification_email_from Alexandre.Cassen@firewall.loc 
       
       #发邮件的服务器(一定不可为外部地址)
       smtp_server 127.0.0.1 
       
       #连接超时时间  
       smtp_connect_timeout 30 
       
       #路由器的标识(可以随便改动)
       router_id LVS_DEVEL
    }
    
    # 定义服务状态跟踪脚本,脚本中可以检查高可用服务的状态
    vrrp_script check_nginx { 
        
       #这里chk_nginx.sh是定义脚本的名称,可随意取  
       script "/opt/check_nginx.sh"
       
       #每隔2秒钟执行一次  
       interval 2
       
       #每检查一次,权重+2
       weight 2
    }
    
    #配置虚拟路由器的实例,VI_1是自定义的实例名称  
    vrrp_instance VI_1 {
        
        #初始状态,MASTER|BACKUP,当state指定的instance的初始化状态,在两台服务器都启动以后,
        #马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER 
        state MASTER
        
        #通告选举所用端口  
        interface eth0
        
        #虚拟路由的ID号(一般不可大于255)  
        virtual_router_id 51
        
        #优先级信息,备必须更低  
        priority 101
        
        #VRRP通告间隔,秒 
        advert_int 1
        
        #认证机制  
        authentication {
            
            #认证类型
            auth_type PASS
            
            #密码
            auth_pass 1111
        }
        
        #虚拟ip地址(VIP地址)
        virtual_ipaddress {
            192.168.1.121
        }
        
        #调用上面定义的服务状态跟踪脚本 
        track_script {
            check_nginx
        }
    }

    配置备机


     在另一台nginx服务器上配置好BACKUP,只需要修改keppalive中的state为BACKUP,priority为100即可,完整操作如下:

    #安装keepalived
    yum install keepalived -y
    #编辑keepalived的配置文件
    vi /etc/keepalived/keepalived.conf
    
    #内容如下:
    
    
    #全局配置,这里额外的静态路由并未添加因为它是非必要的,除非我们在当前或特定的主机上生成特殊的静态路由等  
    global_defs {
    
       #realserver故障时通知邮件的收件人地址,可以多个  
       notification_email {  
         acassen@firewall.loc
       }
       
       #发件人信息(可以随意伪装,因为邮件系统不会验证处理发件人信息)  
       notification_email_from Alexandre.Cassen@firewall.loc 
       
       #发邮件的服务器(一定不可为外部地址)
       smtp_server 127.0.0.1 
       
       #连接超时时间  
       smtp_connect_timeout 30 
       
       #路由器的标识(可以随便改动)
       router_id LVS_DEVEL
    }
    
    # 定义服务状态跟踪脚本,脚本中可以检查高可用服务的状态
    vrrp_script check_nginx { 
        
       #这里chk_nginx.sh是定义脚本的名称,可随意取  
       script "/opt/check_nginx.sh"
       
       #每隔2秒钟执行一次  
       interval 2
       
       #每检查一次,权重+2
       weight 2
    }
    
    #配置虚拟路由器的实例,VI_1是自定义的实例名称  
    vrrp_instance VI_1 {
        
        #初始状态,MASTER|BACKUP,当state指定的instance的初始化状态,在两台服务器都启动以后,
        #马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER 
        state BACKUP 
        
        #通告选举所用端口  
        interface eth0
        
        #虚拟路由的ID号(一般不可大于255)  
        virtual_router_id 51
        
        #优先级信息,备必须更低  
        priority 100
        
        #VRRP通告间隔,秒 
        advert_int 1
        
        #认证机制  
        authentication {
            
            #认证类型
            auth_type PASS
            
            #密码
            auth_pass 1111
        }
        
        #虚拟ip地址(VIP地址)
        virtual_ipaddress {
            192.168.1.121
        }
        
        #调用上面定义的服务状态跟踪脚本 
        track_script {
            check_nginx
        }
    }
    View Code

    添加校验脚本


     在定义好的opt目录下添加check_nginx.sh脚本文件,完整内容如下:

    #!/bin/bash
    #description: check service such as nginx
    #set -x
     
    CHECK_TIME=3
    NGINX_OK=1
    NOW=`date`
    STATUS='OK!'
     
    procnum=`ps -ef |grep "/usr/local/nginx/sbin/nginx"|grep -v "grep"|wc -l`
     
    while [ "$CHECK_TIME" -ne 0 ]
    do
        let "CHECK_TIME-=1"
        if [ "$procnum" -eq 1 -a -f /usr/local/nginx/logs/nginx.pid ]
        then
            NGINX_OK=1
            CHECK_TIME=0
        else
            NGINX_OK=0
        fi
    done
     
    if [ "$NGINX_OK" -eq 0 ]
    then 
        status='fail!'
        /etc/init.d/keepalived stop
    fi
     
    echo "$NOW:$STATUS" >> /usr/local/nginx/logs/keepalived.log
    exit 0
    View Code

    测试主备方案


    #分别启动keepalive
    service keepalived start
    #查看虚拟ip(VIP)情况
    ip a
    
    #此时我们可以看到虚拟ip 192.168.1.121绑定在MASTER的eth0;
    #当停止MASTER所在服务器的nginx服务时,脚本会停调keepalived服务,从而将虚拟IP浮动到BACKUP
    #而我们依旧可以通过虚拟ip来访问应用

    主主方式

    配置双主


     配置双主很简单,我们只需要在主备的基础上把主机的MASTER实例复制到备机上,备机的BACKUP实例复制到主机上,同时把复制的MASTAR、BACKUP的虚拟ip改为192.168.1.122,virtual_router_id改为  52即可。

    完整的配置文件:

    ########################################服务器一#################################################
    
    #全局配置,这里额外的静态路由并未添加因为它是非必要的,除非我们在当前或特定的主机上生成特殊的静态路由等  
    global_defs {
    
       #realserver故障时通知邮件的收件人地址,可以多个  
       notification_email {  
         acassen@firewall.loc
       }
       
       #发件人信息(可以随意伪装,因为邮件系统不会验证处理发件人信息)  
       notification_email_from Alexandre.Cassen@firewall.loc 
       
       #发邮件的服务器(一定不可为外部地址)
       smtp_server 127.0.0.1 
       
       #连接超时时间  
       smtp_connect_timeout 30 
       
       #路由器的标识(可以随便改动)
       router_id LVS_DEVEL
    }
    
    # 定义服务状态跟踪脚本,脚本中可以检查高可用服务的状态
    vrrp_script check_nginx { 
        
       #这里chk_nginx.sh是定义脚本的名称,可随意取  
       script "/opt/check_nginx.sh"
       
       #每隔2秒钟执行一次  
       interval 2
       
       #每检查一次,权重+2
       weight 2
    }
    
    #MASTER实例,VI_1是自定义的实例名称  
    vrrp_instance VI_1 {
        
        #初始状态,MASTER|BACKUP,当state指定的instance的初始化状态,在两台服务器都启动以后,
        #马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER 
        state MASTER
        
        #通告选举所用端口  
        interface eth0
        
        #虚拟路由的ID号(一般不可大于255)  
        virtual_router_id 51
        
        #优先级信息,备必须更低  
        priority 100
        
        #VRRP通告间隔,秒 
        advert_int 1
        
        #认证机制  
        authentication {
            
            #认证类型
            auth_type PASS
            
            #密码
            auth_pass 1111
        }
        
        #虚拟ip地址(VIP地址)
        virtual_ipaddress {
            192.168.1.121
        }
        
        #调用上面定义的服务状态跟踪脚本 
        track_script {
            check_nginx
        }
    }
    
    #BACKUP实例,VI_2是自定义的实例名称  
    vrrp_instance VI_2 {
        
        #初始状态,MASTER|BACKUP,当state指定的instance的初始化状态,在两台服务器都启动以后,
        #马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER 
        state BACKUP 
        
        #通告选举所用端口  
        interface eth0
        
        #虚拟路由的ID号(一般不可大于255)  
        virtual_router_id 52
        
        #优先级信息,备必须更低  
        priority 100
        
        #VRRP通告间隔,秒 
        advert_int 1
        
        #认证机制  
        authentication {
            
            #认证类型
            auth_type PASS
            
            #密码
            auth_pass 1111
        }
        
        #虚拟ip地址(VIP地址)
        virtual_ipaddress {
            192.168.1.122
        }
        
        #调用上面定义的服务状态跟踪脚本 
        track_script {
            check_nginx
        }
    }
    
    
    
    
    ########################################服务器二#################################################
    
    #全局配置,这里额外的静态路由并未添加因为它是非必要的,除非我们在当前或特定的主机上生成特殊的静态路由等  
    global_defs {
    
       #realserver故障时通知邮件的收件人地址,可以多个  
       notification_email {  
         acassen@firewall.loc
       }
       
       #发件人信息(可以随意伪装,因为邮件系统不会验证处理发件人信息)  
       notification_email_from Alexandre.Cassen@firewall.loc 
       
       #发邮件的服务器(一定不可为外部地址)
       smtp_server 127.0.0.1 
       
       #连接超时时间  
       smtp_connect_timeout 30 
       
       #路由器的标识(可以随便改动)
       router_id LVS_DEVEL
    }
    
    # 定义服务状态跟踪脚本,脚本中可以检查高可用服务的状态
    vrrp_script check_nginx { 
        
       #这里chk_nginx.sh是定义脚本的名称,可随意取  
       script "/opt/check_nginx.sh"
       
       #每隔2秒钟执行一次  
       interval 2
       
       #每检查一次,权重+2
       weight 2
    }
    
    #BACKUP实例,VI_1是自定义的实例名称  
    vrrp_instance VI_1 {
        
        #初始状态,MASTER|BACKUP,当state指定的instance的初始化状态,在两台服务器都启动以后,
        #马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER 
        state BACKUP 
        
        #通告选举所用端口  
        interface eth0
        
        #虚拟路由的ID号(一般不可大于255)  
        virtual_router_id 51
        
        #优先级信息,备必须更低  
        priority 100
        
        #VRRP通告间隔,秒 
        advert_int 1
        
        #认证机制  
        authentication {
            
            #认证类型
            auth_type PASS
            
            #密码
            auth_pass 1111
        }
        
        #虚拟ip地址(VIP地址)
        virtual_ipaddress {
            192.168.1.121
        }
        
        #调用上面定义的服务状态跟踪脚本 
        track_script {
            check_nginx
        }
    }
    
    
    #MASTER实例,VI_2是自定义的实例名称  
    vrrp_instance VI_2 {
        
        #初始状态,MASTER|BACKUP,当state指定的instance的初始化状态,在两台服务器都启动以后,
        #马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER 
        state MASTER
        
        #通告选举所用端口  
        interface eth0
        
        #虚拟路由的ID号(一般不可大于255)  
        virtual_router_id 52
        
        #优先级信息,备必须更低  
        priority 100
        
        #VRRP通告间隔,秒 
        advert_int 1
        
        #认证机制  
        authentication {
            
            #认证类型
            auth_type PASS
            
            #密码
            auth_pass 1111
        }
        
        #虚拟ip地址(VIP地址)
        virtual_ipaddress {
            192.168.1.121
        }
        
        #调用上面定义的服务状态跟踪脚本 
        track_script {
            check_nginx
        }
    }
    View Code

    测试双主方案


    #分别重新启动keepalive
    service keepalived restart
    #查看虚拟ip(VIP)情况
    ip a
    
    #此时我们可以看到虚拟ip 192.168.1.121、122 分别绑定在两台服务器的eth0;
    #当停止某台服务器的nginx服务时,脚本会停调keepalived服务,浮动虚拟ip;
    #在另一台服务器执行ip a时,我们发现两个虚拟ip都绑定在该服务器的eth0;
    #而我们依旧可以通过两个虚拟ip来访问应用
  • 相关阅读:
    算法---递归及尾递归
    ScheduledThreadPoolExecutor之remove方法
    数据结构---队列及简单实现有界队列
    数据结构---栈及四则运算实现
    数据结构---链表及约瑟夫环问题带来的思考
    数据结构---数组
    时间复杂度和空间复杂度
    Redis缓存设计与性能优化
    Springboot+ELK实现日志系统简单搭建
    Docker学习笔记(三):Dockerfile及多步骤构建镜像
  • 原文地址:https://www.cnblogs.com/dahuandan/p/6771072.html
Copyright © 2020-2023  润新知