zoukankan      html  css  js  c++  java
  • 【原创】学习日记5:nginx负载均衡(三)2012.01.10 nginx+keepalievd,实现负载均衡和故障点切换。keepalived双机热备。

    接上文  学习日记4:nginx负载均衡(二)2012.01.08

    ......

    到此,整体工作还差一个备用nginx proxy,其中涉及到keepalived,做心跳。

       

    黄线以上做完了。

    本次主要做的是1加一台从nginx_proxy ,暂且命令为front2(为从)。之前的nginx_proxy命令为front(为主)

    1 在主nginx上配置keepalived。

    cd /usr/local/src/
    wget http://keepalived.org/software/keepalived-1.2.7.tar.gz
    
    tar -xzvf keepalived-1.2.7.tar.gz
    cd keepalived-1.2.7/
    ./configure --prefix=/usr/local/keepalived

    这时候会报错的!

    configure: error: 
      !!! OpenSSL is not properly installed on your system. !!!
      !!! Can not include OpenSSL headers files.            !!!

    缺少gcc,安装下面扩展

    yum install gcc gcc-c++ autoconf automake

    继续编译,下面还会报错,类似这样的错误。

    make: *** No targets specified and no makefile found.  Stop.
    configure: error: ! OpenSSL is not properly installed on your system. configure: error: !

     对此,我们安装以下扩展即可解决。

    yum -y install openssl-devel
    yum -y install popt-devel

    在编译

    ./configure --prefix=/usr/local/keepalived

    这时候,会出现下面的结果,这个结果就表明是ok的。到此你的keepalived安装是成功的!

    Keepalived configuration
    ------------------------
    Keepalived version       : 1.2.7
    Compiler                 : gcc
    Compiler flags           : -g -O2
    Extra Lib                : -lpopt -lssl -lcrypto 
    Use IPVS Framework       : Yes
    IPVS sync daemon support : Yes
    IPVS use libnl           : No
    Use VRRP Framework       : Yes
    Use VRRP VMAC            : Yes
    SNMP support             : No
    Use Debug flags          : No

    继续下面的操作

    make
    make install
    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
    mkdir /etc/keepalived
    cd /etc/keepalived
    vim keepalived.conf

     

    keepalived.conf配置文件比较重要

    front1 :主nginx的配置文件如下:

    ! Configuration File for keepalived
    global_defs {
       router_id LVS_01
    }
    vrrp_instance VI_1 {
        state MASTER  #master 主nginx
        interface eth1
        virtual_router_id 51
        mcast_src_ip 192.168.65.133 #本机ip地址也即主nginx地址
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.65.128 #vip 虚拟出来的ip地址 要求在内网中未被使用
        }
    }

    到此,主nginx配置完成。同样的操作,在从nginx上也配置一遍。

    不过从nginx的配置文件如下:

    [root@localhost nginx]# vim /etc/keepalived/keepalived.conf 
    
    ! Configuration File for keepalived
    global_defs {
       router_id LVS_01
    }
    vrrp_instance VI_1 {
        state BACKUP #slave 
        interface eth2
        virtual_router_id 51
        mcast_src_ip 192.168.65.137 #slave ip
        priority 80
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.65.128 #vip
        }
    }

    重启两边的keepalived服务:

    [root@localhost conf.d]# service keepalived restart
    Stopping keepalived:                                       [FAILED]
    Starting keepalived:                                       [  OK  ]

    主nginx上,用

    [root@localhost conf.d]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:20:e9:20 brd ff:ff:ff:ff:ff:ff
        inet 192.168.65.133/24 brd 192.168.65.255 scope global eth1
        inet 192.168.65.128/32 scope global eth1
        inet6 fe80::20c:29ff:fe20:e920/64 scope link 
           valid_lft forever preferred_lft forever

     到此,我们的vip算是真正的绑定上了。

    查看keepalived的日志:

    root@localhost conf.d]# tail -f /var/log/messages 
    Jan  9 18:53:06 localhost Keepalived_healthcheckers[3355]: Using LinkWatch kernel netlink reflector...
    Jan  9 18:53:06 localhost Keepalived_vrrp[3356]: Configuration is using : 34824 Bytes
    Jan  9 18:53:06 localhost Keepalived_vrrp[3356]: Using LinkWatch kernel netlink reflector...
    Jan  9 18:53:06 localhost Keepalived_vrrp[3356]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]
    Jan  9 18:53:06 localhost Keepalived_vrrp[3356]: VRRP_Instance(VI_1) Transition to MASTER STATE
    Jan  9 18:53:07 localhost Keepalived_vrrp[3356]: VRRP_Instance(VI_1) Entering MASTER STATE
    Jan  9 18:53:07 localhost Keepalived_vrrp[3356]: VRRP_Instance(VI_1) setting protocol VIPs.
    Jan  9 18:53:07 localhost avahi-daemon[1765]: Registering new address record for 192.168.65.128 on eth1.IPv4.
    Jan  9 18:53:07 localhost Keepalived_healthcheckers[3355]: Netlink reflector reports IP 192.168.65.128 added
    Jan  9 18:53:07 localhost Keepalived_vrrp[3356]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.65.128
    Jan  9 18:53:12 localhost Keepalived_vrrp[3356]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.65.128

    从nginx上,同样

    [root@localhost nginx]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:a7:81:c7 brd ff:ff:ff:ff:ff:ff
        inet 192.168.65.137/24 brd 192.168.65.255 scope global eth2
        inet6 fe80::20c:29ff:fea7:81c7/64 scope link 
           valid_lft forever preferred_lft forever

    我们发现并没有绑定vip 128

    同时;

    [root@localhost nginx]# tail -f /var/log/messages 
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Registering Kernel netlink reflector
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Registering Kernel netlink command channel
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: Opening file '/etc/keepalived/keepalived.conf'.
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Opening file '/etc/keepalived/keepalived.conf'.
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: Configuration is using : 34822 Bytes
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Configuration is using : 4821 Bytes
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: Using LinkWatch kernel netlink reflector...
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: VRRP_Instance(VI_1) Entering BACKUP STATE
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Using LinkWatch kernel netlink reflector...

    貌似从nginx似乎出了什么问题,先不着急。

    这时候我们停止掉主nginx的服务,再看看效果怎么样!

    killall nginx

    再观察从nginx的状态变化

    [root@localhost nginx]# tail -f /var/log/messages 
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Registering Kernel netlink reflector
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Registering Kernel netlink command channel
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: Opening file '/etc/keepalived/keepalived.conf'.
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Opening file '/etc/keepalived/keepalived.conf'.
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: Configuration is using : 34822 Bytes
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Configuration is using : 4821 Bytes
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: Using LinkWatch kernel netlink reflector...
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: VRRP_Instance(VI_1) Entering BACKUP STATE
    Jan  9 19:16:25 localhost Keepalived_vrrp[22421]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]
    Jan  9 19:16:25 localhost Keepalived_healthcheckers[22420]: Using LinkWatch kernel netlink reflector...
    Jan  9 19:17:33 localhost Keepalived_vrrp[22421]: VRRP_Instance(VI_1) Transition to MASTER STATE
    Jan  9 19:17:34 localhost Keepalived_vrrp[22421]: VRRP_Instance(VI_1) Entering MASTER STATE
    Jan  9 19:17:34 localhost Keepalived_vrrp[22421]: VRRP_Instance(VI_1) setting protocol VIPs.
    Jan  9 19:17:34 localhost Keepalived_vrrp[22421]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth2 for 192.168.65.128
    Jan  9 19:17:34 localhost avahi-daemon[1810]: Registering new address record for 192.168.65.128 on eth2.IPv4.
    Jan  9 19:17:34 localhost Keepalived_healthcheckers[22420]: Netlink reflector reports IP 192.168.65.128 added
    Jan  9 19:17:39 localhost Keepalived_vrrp[22421]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth2 for 192.168.65.128

    从第33秒后发现,备用nginx已经转为master状态。

    再看

    [root@localhost nginx]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:a7:81:c7 brd ff:ff:ff:ff:ff:ff
        inet 192.168.65.137/24 brd 192.168.65.255 scope global eth2
        inet 192.168.65.128/32 scope global eth2
        inet6 fe80::20c:29ff:fea7:81c7/64 scope link 
           valid_lft forever preferred_lft forever

    发现没有?vip飘过来了!

    针对Keepalived的不足,用check_nginx.sh来监控nginx进程,实现真正意义上的负载均衡高可用.
    此脚本思路其实也很简单,即放置在后台一直监控nginx进程;如进程消失,尝试重启nginx,
    如是失败则立即停掉本机的keepalived服务,让另一台负载均衡器接手.

    vi /shell/nginx_pid.sh
    ###################################################
    #!/bin/bash
    while :
        do
        nginxpid=`ps -C nginx --no-header | wc -l`
    
     if [ $nginxpid -eq 0 ]
       then
       /usr/local/nginx-0.8.53/sbin/nginx
       sleep 5
     if [ $nginxpid -eq 0 ]
        then
        /etc/init.d/keepalived stop
        fi
        fi
        sleep 5
    done
    ###################################################

    我们仍然可以继续访问我们的站点。至此。故障点切换宣告结束。

  • 相关阅读:
    CMSIS_OS中osMailPut 和 osMessagePut 的问题
    网络:W5500抓包TCP segment of a reassembled PDU
    网络:W5500 UDP数据包格式注意事项
    笔记:把编译时间加入到目标文件
    笔记:git和码云
    笔记:git基本操作
    FreeRtos堆栈检测应用
    一个由自增运算符以及C语法顺序细节引起的bug
    高级文件操作
    linux 权限相关
  • 原文地址:https://www.cnblogs.com/wangjiafang/p/2854401.html
Copyright © 2011-2022 走看看