zoukankan      html  css  js  c++  java
  • 高可用系列之Nginx

    1.1Keepalived高可用软件

    Keepalived起初是专为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入了VRRP的功能,因此除了配合LVS服务外,也可以作为其他服务(Nginx,Haproxy)的高可用软件,VRRPVirtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由出现的单点故障问题,它能够保证网络的不间断、稳定的运行。所以,keepalived以方面具有LVS Cluster nodes healthchecks功能,另一方面也具有LVS directors failover功能。

    1.1.1LVS Directors failover功能

    Ha failover功能:实现LB Master主机和Backup主机之间故障转义和自动切换。

    这是针对有两个负载均衡器Director同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡的所有工作(vip资源及相应服务)一旦主负载均衡器(MASTER)故障修复,MASTER又会接管回它原来处理的工作,而备份负载均衡器(BACKUP)会释放master失效时它接管的工作,此时两者将恢复到最初各自的角色状态。

    1.1.2Lvs cluster nodes healthchecks功能

    1keepalived.conf里配置就可以实现LVS功能。

    2keeplaived可以对LVS下面的集群节点做健康检查。

    Rs healthcheck功能:负载均衡定期检查RS的可用性决定是否给其分发请求。

    当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的RS服务器从转发队列中清除出去,从而保证用户的访问不受影响:当故障的RS服务器被修复以后,系统又会自动地把它们加入转发队列,分发请求提供正常服务。

    1.2Keeplaived故障切换转移原理介绍

    Keepalived Directors高可用对之间的故障切换转移,是通过VRRP协议Virtual Router Redundancy Protocol 中文虚拟路由器冗余协议)来实现的。

    Keepalived Directors正常工作时,主Director节点会不断的向备节点广播心跳消息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时自身接管的IP资源及服务,恢复到原来的自身备用角色。

    1.3VRRP协议简单介绍

    VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台物理的机器并不同时工作,而是由一台称为Master的负责路由工作,其他的都是BackupMaster并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是MasterMaster有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的Master要负责转发发送给网关地址的包和响应ARP请求。

    VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MACIP(称为VIP)。客户端主机并不需要因为Master的改变而修改自己的路由配置,对他们来说,这种主从的切换是透明的。

    在一个虚拟路由器中,只有作为MasterVRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),Backup不会枪占Master,除非它的优先级(priority)更高。当Master不可用时(Backup收不到广告包),多台Backup中优先级最高的这台会被枪占为Master。这种枪占是非常快速的(<1s),以保证服务的连续性。

    由于安全性考虑,VRRP包使用了加密协议进行加密。

    1.4Keepalived工作原理小结

    1.4.1VRRP协议介绍

    1VRRP协议,全称Virtual Router Redundancy Protocol,中文名,虚拟路由器冗余协议,VRRP的出现就是为了解决静态 的单点故障。

    2VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器。

    3VRRP是通过IP多播的方式实现通信。

    4、主发包,备接包,当备接不到主发的包的时候,就启动接管程序接管主的资源。备可以由多个,通过优先级竞选。

    5VRRP使用加密协议。

    1.4.2Keepalived工作原理

    Keepalived高可用之间是通过VRRP协议通信的,VRRP协议是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会获得所有的资源,备节点处于等待状态,当主挂了时候,备节点,接管主节点的资源,然后顶替主节点对外提供服务。

    VRRP协议是通过IP多播包的方式(224.0.0.18)发送。

    keepalived之间,只有作为主的服务器会一直发送VRRP广播包,告诉备他还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管的速度可以小于1秒,VRRP使用加密协议加密发送广播包。

    1.5Keepalived+Nginx高可用实践

    1.5.1高可用环境准备

    [root@lb-node1 ~]# cat /etc/redhat-release  #查看系统版本

    CentOS release 6.7 (Final)

    [root@lb-node1 ~]# uname -r #查看内核版本

    2.6.32-573.el6.x86_64

    [root@lb-node1 ~]# getenforce #确认Selinux关闭状态

    Disabled

    [root@lb-node1 ~]# /etc/init.d/iptables status#确认Iptables关闭状态

    iptables: Firewall is not running.

    1.5.2安装Nginx web服务

    yum install openssl openssl-devel pcre pcre-devel -y

    mkdir -p /home/oldboy/tools

    cd /home/oldboy/tools

    wget -q http://nginx.org/download/nginx-1.6.3.tar.gz

    ls -l nginx-1.6.3.tar.gz

    useradd nginx -s /sbin/nologin -M

    tar xf nginx-1.6.3.tar.gz

    cd nginx-1.6.3

    ./configure--user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module--with-http_ssl_module

    make

    make install

    ln -s /application/nginx-1.6.3 /application/nginx

    1.5.3安装Keepalived高可用

    [root@lb01 ~]#yum -y install keepalived  #lb01端安装keepalived

    [root@lb02 ~]#yum -y install keepalived  #lb02端安装keepalived

    1.5.4配置Master_Keepalived

    [root@lb01 ~]# cat /etc/keepalived/keepalived.conf  #Master Keepalived配置文件

      ! Configuration File for keepalived

     

    global_defs {

    notification_email {

    liangwei.xu@foxmail.qq.com

         }

    notification_email_from Alexandre.Cassen@firewall.loc

    smtp_server 192.168.200.1

    smtp_connect_timeout 30

    router_id Nginx_01

      }

     

    vrrp_instance VI_1 {

          state MASTER

    interface eth0

    virtual_router_id 51

    priority 150

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

          }

    virtual_ipaddress {

    10.0.0.11/24

          }

      }

    1.5.5配置Backup_Keepalived

    [root@lb01 ~]# cat /etc/keepalived/keepalived.conf #Backup Keepalived配置文件

      ! Configuration File for keepalived

     

    global_defs {

    notification_email {

    liangwei.xu@foxmail.qq.com

         }

    notification_email_from Alexandre.Cassen@firewall.loc

    smtp_server 192.168.200.1

    smtp_connect_timeout 30

    router_id Nginx_02

      }

     

    vrrp_instance VI_1 {

          state Backup

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

          }

    virtual_ipaddress {

              10.0.0.11/24

          }

      }

    1.5.6Keepalived主备配置比较

    主从单实例keepalived.conf配置差别项

    Keepalived配置参数

    Master点特殊参数

    Backup点特殊参数

    route_id(唯一标识)

    route_id lb01

    route_id lb02

    state(角色状)

    state Master

    state Backup

    priority(竞选优先级)

    priority 150

    priority 100

    1.5.7启动keepalived服务

    [root@lb01 ~]# /etc/init.d/keepalived start #启动lb01Master_keepalived

    [root@lb02 ~]# /etc/init.d/keepalived start #启动lb02Master_keepalived

    1.5.8检测IP地址是否漂移

    [root@lb01 ~]# ip addr|grep 10.0.0.11 #查看是否有VIP地址

        inet 10.0.0.11/24 scope global secondary eth0

    [root@lb01 ~]# /etc/init.d/keepalived stop #停止MasterKeepalived

    [root@lb01 ~]# ip addr|grep 10.0.0.11 #VIP已经从Master端移除

     

    [root@lb02 ~]# ip addr|grep 10.0.0.11 #BackupKeepalived接管资源

        inet 10.0.0.11/24 scope global secondary eth0   

    [root@lb01 ~]# /etc/init.d/keepalived start #启动Master_keepalived

    [root@lb01 ~]# ip addr|grep 10.0.0.11 #Master继续接管资源           

        inet 10.0.0.11/24 scope global secondary eth0

    1.5.9Keepalived配置文件详解

      1 ! Configuration File for keepalived #注释

      2

      3 global_defs {

      4    notification_email {

      5      acassen@firewall.loc #5-7发邮件给谁

      8    }

      9    notification_email_from Alexandre.Cassen@firewall.lo #发邮件发件人

     10    smtp_server 192.168.200.1 #邮件服务器地址

     11    smtp_connect_timeout 30 #超时时间

     12    router_id Nginx_01 #主备ID不能一样

     13 }

     

    15 vrrp_instance VI_1 {  #实例名称(建议不修)

     16     state MASTER #服务器的状态(仅仅是傀儡)

     17     interface eth0 #通信端口

     18     virtual_router_id 51 #实例的ID

     19     priority 150 #优先级,主备之间最好相差50

     20     advert_int 1 #心跳间隔(如果一秒没通信备节点马上接管)

     21     authentication {

     22         auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同

     23         auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同

     24     }

     25     virtual_ipaddress { #vip(可以多个)

     26       10.0.0.11/24 #26-28配置vIP地址,绑定在eth0  因为(interface eth0)

    29     }

     30 }

     

    q全局定义块部分:主要设置Keepalived的通知机制和标识

    1、第4-9行是email通知参数。作用:当LVS发生切换或RS等有故障时,会发邮件报警。这是可选配,notifucation_email指定在keepalived发生事件时,需要发给的email地址,可以有多个,每行一个。

    2smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail,就可以使用上面默认配置实现邮件发送。

    3、第10行是Lvs负载均衡器标示(rote_id)。在一个局域网内,它应该是唯一的。

    4、大括号”{}” 用来分隔定义块,因此必须成对出现。如果漏写了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

     

    qVRRP定义块

    1、第13行为VRRP实例vrrp_instance,每个Vrrp实例可以认为是一个keepalived实例,在配置中VRRP实例可以有多个。

    (1)14行实例状态state.只有MasterBackup两种状态,并且需要大写这些单词。其中MASTER为工作状态。BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER,当失效的MASTER所在的系统恢复时,BACKUPMASTER恢复到BACKUP状态。

    (2)通信接口interface。对外提供服务的网络结构,如eth0,eth1当前主流的服务器有2个或2个以上的网络接口,在选择服务器接口时,一定要搞清楚了。

    (3)lvs_sync_daemon_interface。负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。

    (4)16行为虚拟路由标示virtual_route_id是一致的,同时在整个keepalived内是唯一的。

    (5)17行为优先级priority,这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER的优先级 BACKUP。若MASTERpriority值为150,那么BACKUPpriority只能在149或者跟小的数值(官方建议相差50)

    (6)18行同步通知间隔advert_intMASTERBACKUP负载均衡器之间同步检查的时间间隔,单位为秒。

    (7)19-22行验证authentication.包含验证类型和验证密码。类型主要有PASSAH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTERBACKUP使用相同的密码才能正常通信,这里官方推荐用明文即可。

     

    2、第23-27行为虚拟ip地址virtual_ipaddress。可以配置多个IP地址,每个地址占一行,需要指定子网掩码。

    注意:这个ip必须与我们在lvs客户端设定的vip相一致。

    1.5.10keepalived日志文件

    [root@lb01 ~]#sed -i '14 s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S 0"#g' /etc/sysconfig/keepalived #指定文件接收Keepalived服务日志

    [root@lb-node1 conf]# echo -e "local0.* /var/log/keepalived.log" >>/etc/rsyslog.conf  #配置至rsyslog

    [root@lb-node1 conf]# tail -1 /etc/rsyslog.conf  #检查是否配置成功

    local0.*/var/log/keepalived.log

    [root@lb-node1 conf]# /etc/init.d/rsyslog restart  #重新启动rsyslog

    Shutting down system logger:                               [  OK  ]

    Starting system logger:                                [  OK  ]

    1.6Keepalived+Nginx高可用多实例实践

    1.6.1Master_keepalived多实例

    [root@lb01 ~]# cat /etc/keepalived/keepalived.conf #这上面第一个实例是Master 第二个实例修改为Backup

    vrrp_instance VI_1 {

          state MASTER

    interface eth0

    virtual_router_id 51

    priority 150

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

          }

    virtual_ipaddress {

    10.0.0.11/24

          }

      }

     

    vrrp_instance VI_2 {

        state BACKUP

    interface eth0

        virtual_router_id 52

        priority 100

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

        }  

    virtual_ipaddress {

            10.0.0.12/24

        }  

    }

    1.6.2Backup_keepalived多实例

    [root@lb02 ~]# cat /etc/keepalived/keepalived.conf #这上面第一个实例是Backup,第二个实例修改为Backup

      vrrp_instance VI_1 {

          state Backup

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

          }

    virtual_ipaddress {

    10.0.0.11/24

          }

      }

     

    vrrp_instance VI_2 {

        state MASTER

    interface eth0

        virtual_router_id 52

        priority 150

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

        }  

    virtual_ipaddress {

    10.0.0.12/24

        }  

    }

    1.6.3检测多实例IP地址是否漂移

    [root@lb-node1 ~]# ip addr|grep 10.0.0.11

        inet 10.0.0.11/24 scope global secondary eth0

    [root@lb-node2 ~]# ip addr|grep 10.0.0.12

        inet 10.0.0.12/24 scope global secondary eth0

    [root@lb-node2 ~]# /etc/init.d/keepalived stop

    Stopping keepalived:                                       [  OK  ]

    [root@lb-node1 ~]# ip addr|grep 10.0.0

        inet 10.0.0.11/24 scope global secondary eth0

        inet 10.0.0.12/24 scope global secondary eth0

    [root@lb-node2 ~]# /etc/init.d/keepalived start

    Starting keepalived:                                       [  OK  ]

    [root@lb-node2 ~]# ip addr|grep 10.0.0.12     

        inet 10.0.0.12/24 scope global secondary eth0

    [root@lb-node1 ~]# ip addr|grep 10.0.0

        inet 10.0.0.11/24 scope global secondary eth0

     

    [root@lb-node1 ~]# tcpdump -n 'host 224.0.0.18'  抓包

    1.7keepalived列脑解决

    由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并

    Nginx宕机keepalived是不会接管的,需要写一个脚本检测nginx是否存活 ,如果不存货就kill nginxkeepalived

    1、 可以ping通主,备节点还有VIP就认为列脑  (如果停止主,脚本也会报脑裂)

    [root@lb02 ~]# cat check_split_brain.sh

    #!/bin/sh

    lb01_vip=10.0.0.12

    lb01_ip=10.0.0.7

    while true

    do

    ping -c 2 -W 3 $lb01_ip &>/dev/null

     if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ]

      then

        echo "ha is split brain.warning."

    else

        echo "ha is ok"

    fi

    sleep 5

    done

    1.8Keepalived常见故障解决

    服务器网线松动等网络故障

    服务器硬件故障发生损坏现象而崩溃

    Nginx服务死掉

    [root@lb01 scripts]# cat nginx_pid.sh

    #!/bin/sh

    while true

    do

    nginxpid=`ps -C nginx --no-header|wc -l`

     

    if [ $nginxpid -eq 0 ];then

    /application/nginx/sbin/nginx

    sleep 5

    nginxpid=`ps -C nginx --no-header|wc -l`          

       if [ $nginxpid -eq 0 ];then

    /etc/init.d/keepalived stop

       exit 1

       fi

    fi

         sleep 5

    done

     

  • 相关阅读:
    C# 获取存储过程 返回的参数Output
    Blog数据库设计之Tags表设计
    FLASH 加载进度 JS代码
    Asp.net清除数据缓存及页面缓存
    access数据库用sql语句添加字段,修改字段,删除字段,类型转换
    获取资源文件
    C# 如何获取当前项目运行路径的父目录?
    深入理解 __doPostBack
    LookUpEdit How update binding source immediately after selection?
    C#动态加载DLL
  • 原文地址:https://www.cnblogs.com/xuliangwei/p/6395493.html
Copyright © 2011-2022 走看看