nginx+keepalive实现高可用热备负载均衡

1、负载均衡是什么(摘自百度百科)
linux

        负载均衡 创建在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增长吞吐量、增强网络数据处理能力、提升网络的灵活性和可用性。nginx

        负载均衡,英文名称为Load Balance,其意思就是分摊到多个操做单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工做任务。web

2、经常使用的负载均衡后端

    一、HTTP重定向浏览器

        HTTP 重定向能够将 HTTP 请求进行转移,在 Web 开发中咱们常常会用它来完成自动跳转,好比用户登陆成功后跳转到相应的管理页面。 这种重定向彻底由HTTP 定义,而且由HTTP 代理和Web 服务器共同实现。很简单,当HTTP 代理(好比浏览器)向Web服务器请求某个URL后,Web 服务器能够经过HTTP 响应头信息中的Location 标记来返回一个新的URL,这意味着HTTP代理须要继续请求这个新的URL ,这便完成了自动跳转。固然,若是你本身写了一个 HTTP 代理,也能够不支持重定向,也就是对于Web 服务器返回的Location 标记视而不见,虽然这可能不符合HTTP 标准,但这彻底取决于你的应用须要。 也正是由于HTTP 重定向具有了请求转移和自动跳转的本领,因此除了知足应用程序须要的各类自动跳转以外,它还能够用于实现负载均衡,以达到Web 扩展的目的。bash

    二、DNS负载均衡服务器

        DNS负责提供域名解析服务,当咱们访问某个站点时,实际上首先须要经过该站点域名的DNS服务器来获取域名指向的IP 地址,在这一过程当中,DNS服务器完成了域名到IP 地址的映射,一样,这种映射也能够是一对多的,这时候,DNS 服务器便充当了负载均衡调度器(也称均衡器),它就像前面提到的重定向转移策略同样,将用户的请求分散到多台服务器上,可是它的实现机制彻底不一样。网络

    三、反向代理负载均衡 负载均衡

        反向代理服务器的核心工做即是转发 HTTP 请求,所以它工做在 HTTP 层面,也就是 TCP 七层结构中的应用层(第七层),因此基于反向代理的负载均衡也称为七层负载均衡,实现它并不困难,目前几乎全部主流的 Web 服务器都热衷于支持基于反向代理的负载均衡。tcp

    四、IP负载均衡 

        事实上,在数据链路层(第二层)、网络层(第三层)以及传输层(四层)均可以实现不一样机制的负载均衡,但有所不一样的是,这些负载均衡调度器的工做必须由Linux 内核来完成,由于咱们但愿网络数据包在从内核缓冲区进入进程用户地址空间以前,尽早地被转发到其余实际服务器上,没错,Linux 内核固然能够办获得,位于内核的Netfilter和IPVS能够解决问题,而用户空间的应用程序对此却一筹莫展。 另外一方面,也正是由于能够将调度器工做在应用层如下,这些负载均衡系统能够支持更多的网络服务协议,好比FTP 、SMTP 、DNS ,以及流媒体和VoIP 等应用。

3、规划和准备

        两台相同配置的web

用途 IP
MASTER 192.168.1.100
BACKUP 192.168.1.101

4、安装

        两台接入服务器分别安装nginX和keepalived

        准备依赖包

        yum -y install gcc pcre-devel zlib-devel openssl-devel popt-devel

        下载

        wget http://nginx.org/download/nginx-1.8.1.tar.gz

        wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz

        安装nginx

        安装keepalived

        tar zxvf keepalived-1.2.19.tar.gz

        cd keepalived-1.2.19

        ./configure

        make && make install

        cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

        cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

        mkdir /etc/keepalived

        cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

        cp /usr/local/sbin/keepalived /usr/sbin/

        加入启动服务

        echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local

        echo "/etc/init.d/keepalived start" >> /etc/rc.local

5、配置

    一、配置nginx

        两台接入服务器的nginx的配置彻底同样,主要是配置/usr/local/nginx/conf/nginx.conf的http。其中多域名指向是经过虚拟主机(配置http下面的server)实现;同一域名的不一样虚拟目录经过每一个server下面的不一样location实现;到后端的服务器在http下面配置upstream,而后在server或location中经过proxypass引用。要实现前面规划的接入方式,http的配置以下:

    ......

    upstream opslinux.com {

            #ip_hash;                                    # ip_hash只取ip地址的前三段进行hash,不方便测试,故关掉

          server 192.168.1.102:80;

          server 192.168.1.103:80;

          server 192.168.1.104:80;

    }

    server {

            listen       80;

            server_name  opslinux.com;

            location / {

                proxy_pass http://opslinux.com;

            }

    }

    ......

    验证方法:

    首先用IP访问前表中各个应用服务器的url

    再用域名和路径访问前表中各个应用系统的域名/虚拟路径

    二、配置keepalived

        按照上面的安装方法,keepalived的配置文件在/etc/keepalived/keepalived.conf。主、从服务器的配置相关联但有所不一样。以下:

    Master:

        ! Configuration File for keepalived

         global_defs {

            router_id NGINX_DEVEL

         }

        vrrp_instance VI_1 {

           state MASTER

            interface eth0

            virtual_router_id 51

            priority 100

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass 1111

           }

           virtual_ipaddress {

                192.168.1.100

           }

        }

    Backup:

        ! Configuration File for keepalived

        global_defs {

          router_id NGINX_DEVEL

        } 

        vrrp_instance VI_1 {

            state BACKUP

            interface eth0

            virtual_router_id 61

            priority 99

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass 1111

            }

            virtual_ipaddress {

               192.168.1.100

            }

        }

    验证方法:

        前后在主、从服务器上启动 keepalived: service keepalived start

        在主服务器上查看是否已经绑定了虚拟IP: ip addr

        中止主服务器上的keepalived: service keepalived stop 而后在从服务器上查看是否已经绑定了虚拟IP;

        启动主服务器上的keepalived看看主服务器可否从新接管虚拟IP

    三、keepalived 监控 nginx 的状态(MASTER)

        通过前面的配置,若是主服务器的keepalived中止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会从新接管VIP。 但这并非咱们须要的,咱们须要的是当NginX中止服务的时候可以自动切换。

        keepalived支持配置监控脚本,咱们能够经过脚本监控NginX的状态,若是状态不正常则进行一系列的操做,最终仍不能恢复NginX则杀掉keepalived,使得从服务器可以接管服务。

    如何监控NginX的状态

        最简单的作法是监控NginX进程,更靠谱的作法是检查NginX端口,最靠谱的作法是检查多个url可否获取到页面。

    如未尝试恢复服务

        若是发现NginX不正常,重启之。等待3秒再次校验,仍然失败则再也不尝试。

        cd /opt

        vi chk_nginx.sh

        根据上述策略很容易写出监控脚本。这里使用nmap检查nginx端口来判断nginx的状态,记得要首先安装nmap。监控脚本以下:

        #!/bin/bash

        # check nginx server status

        NGINX=/usr/local/nginx/sbin/nginx

        PORT=80

         

        nmap localhost -p $PORT | grep "$PORT/tcp open"

        #echo $?

        if [ $? -ne 0 ];then

            $NGINX -s stop

            $NGINX

            sleep 3

            nmap localhost -p $PORT | grep "$PORT/tcp open"

            [ $? -ne 0 ] && /etc/init.d/keepalived stop

        fi

        chmod a+x /opt/chk_nginx.sh                #设置脚本的执行权限

        则 keepalived.conf中增长以下配置:

    主 keepalived

        vrrp_script chk_http_port {

            script "/opt/chk_nginx.sh"

            interval 1

            weight -2

        }

        track_script {

            chk_http_port

        }

        例子:

        ! Configuration File for keepalived

        global_defs {

           router_id NGINX_UPSTEAM

        }

        vrrp_script chk_http_port {

            script "/opt/chk_nginx.sh"

            interval 1

            weight -2

        }

        vrrp_instance VI_1 {

            state MASTER

            interface eth0

            virtual_router_id 51

            priority 100

            advert_int 1

            authentication {

                auth_type PASS

                auth_pass 1111

            }

            virtual_ipaddress {

                192.168.1.100

            }

            track_script {

                chk_http_port

            }

        }

    更进一步,为了不启动keepalived以前没有启动nginx , 能够在/etc/init.d/keepalived的start中首先启动nginx(红色为新增部分):

        start() {

            /usr/local/nginx/sbin/nginx

            sleep 3

            echo -n $"Starting $prog: "

            daemon keepalived ${KEEPALIVED_OPTIONS}

            RETVAL=$?

            echo

            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog

        }

相关文章
相关标签/搜索