Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6888744
  • 博文数量: 3857
  • 博客积分: 6409
  • 博客等级: 准将
  • 技术积分: 15948
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 16:48
个人简介

迷彩 潜伏 隐蔽 伪装

文章分类

全部博文(3857)

文章存档

2017年(5)

2016年(63)

2015年(927)

2014年(677)

2013年(807)

2012年(1241)

2011年(67)

2010年(7)

2009年(36)

2008年(28)

分类: 高性能计算

2015-08-18 20:21:02

Nginx负载均衡服务器的双机高可用

[日期:2015-08-18] 来源:Linux社区  作者:zhangli401X [字体:  ]

如果将Web服务器集群当作一个城池,那么负载均衡服务器则相当于城门,重要性不言而喻。如果“城门”关了,与外界的通道也就断了,如果只要一台均衡服务器,当该服务器发生故障时,则会导致整个网站无法访问。因此我们需要来两台以上的服务器,实现故障转移与高可用。

双机高可用一般是通过虚拟IP(飘移IP)方法来实现的,基于Linux/Unix的IP别名技术。双机高可用方法目前分为两种:

(1):一台服务器加一台热被备务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态,当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;

(2):两台负载均衡服务器都处于活动状态,各自绑定一个公网虚拟IP,提供负载均衡服务,当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP。

第一种方式: 
(1)域名解析到虚拟IP 61.1.1.2 
(2)正常情况下,主机61.1.1.4绑定虚拟IP 61.1.1.2

/sbin/ifconfig eth0:1  61.1.1.2  broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/route add -host 61.1.1.2 dev eth0:1
/sbin/arping -I eth0 -c 61.1.1.2 61.1.1.1
(3):用户访问:(虚拟IP: 61.1.1.2)实际访问的是主机61.1.1.4,而备用机 61.1.1.5 则处于空闲状态。 
(4):如果主机61.1.1.4发生故障,背机61.1.1.5将在几秒钟内接管虚拟IP61.1.1.2,与自己绑定,并发送APping的公网网关刷新MAC地址。

/sbin/ifconfig etho:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/ifconfig add -host 61.1.1.2 dev eth0:1
/sbin/arping -I etho -c 3 -s 61.1.1.2  61.1.1.1
(5):这时,用户访问(虚拟IP)实际上访问的是备机 61.1.1.1,从而实现故障转移与高可用,避免了单点故障。

另外,第一种方式可以利用基于VRRP路由协议的Keeoalive软件实现的。

第二种方式: 
(1): 域名通过DNS轮询解析到虚拟IP 61.1.1.2和61.1.1.3上。 
(2)正常情况下,服务器个绑定一个虚拟IP。 
在服务器161.1.1.4上执行以下命令 
/sbin/ifconfig etho:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up 
/sbin/ifconfig add -host 61.1.1.2 dev eth0:1 
/sbin/arping -I etho -c 3 -s 61.1.1.2 61.1.1.1 
在服务器161.1.1.5上执行以下命令 
/sbin/ifconfig etho:1 61.1.1.3 broadcast 61.1.1.255 netmask 255.255.255.0 up 
/sbin/ifconfig add -host 61.1.1.2 dev eth0:1 
/sbin/arping -I etho -c 3 -s 61.1.1.3 61.1.1.1 
(3):用户访问www,linuxidc.com (虚拟IP 61.1.1.2和61.1.1.3)实际上是根据DNS轮询访问两台负载均衡服务器,两台服务器均处于活跃状态。 
(4):如果服务器1发生故障,服务器2将在几秒钟内接管服务器1的虚拟IP 61.1.1.2,与自己已绑定,并发送ARPing包给IDC的公关网关刷新新的MAC地址。 
在服务器2上执行以下命令: 
/sbin/ifconfig etho:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up 
/sbin/ifconfig add -host 61.1.1.2 dev eth0:1 
/sbin/arping -I etho -c 3 -s 61.1.1.2 61.1.1.1

我们可以写两个脚本,来实现第二种方式的自动故障转移。

以下是部署在Nginx负载均衡服务器1的脚本:

#!/bin/sh
LANG=C
date=$(date -d "today" +"%Y-%m-%d %H:%M:%S")

function_bind_vip1()
{
    /sbin/ifconfig etho:ha1 61.1.1.2 broadcast 219.232.254.255 netmask 255.255.255.192 up
    /sbin/route add -host 61.1.1.2 dev eth0:hal
}
function_bind_vip2()
{

    /sbin/ifconfig etho:ha2 61.1.1.3 broadcast 219.232.254.255 netmask 255.255.255.192 up
    /sbin/route add -host 61.1.1.2 dev eth0:ha2
}
function_restart_nginx()
{
    kill -USR1 'cat /usr/local/webserver/nginx/nginx.pid'
}
function_remove_vip1()
{
    /sbin/ifconfig etho:ha1 61.1.1.2 broadcast 219.232.254.255 netamsk 255.255.255.192 down
}

function_remove_vip2()
{
    /sbin/ifconfig etho:ha2 61.1.1.3 broadcast 219.232.254.255 netamsk 255.255.255.192 down
}
function_vip_arping1()
{
    /sbin/ifconfig -I eth0 -c 3 -e 611..1.1.2 61.1.1.1 > /dev/null 2>&1
}
function_vip_arping2()
{
    /sbin/ifconfig -I eth0 -c 3 -e 611..1.1.3 61.1.1.1 > /dev/null 2>&1
}

bind_time_vip1="N";
bind_time_vip2="N";

while true
do
    httpcode_arp1='/usr/bin/cur1 -o /dev/null s -w %{http_code} '
    httpcode_arp2='/usr/bin/cur1 -o /dev/null s -w %{http_code} '

    if [x$httpcode_rip1 == "x200"];
    then
        function_bind_vip1
        function_vip_arping1
        function_restart_nginx
        bind_time_vip1="Y"
    fi
    function_vip_arping1
    else
        if [$bind_time_vip1 == "Y"];
        then
            function_remote_vip1
            bind_time_vip="N"
        fi
    fi

    if [x$httpcode_arp2 == "x200"];
    then
        if[ $bind_time_vip2 == "Y"]
        then
            function_rempve_vip2
            bind_time_vip2="N"
        fi
    else
    if[$bind_time_vip2 == "N"];
    then
        function_bind_vip2
        function_vip_arping2
        function_restart_nginx
        bind_time_vip2="Y"
    fi
    function_vip_arping2
fi

sleep 5
done
在Nginx服务器1将脚本驻留后台运行: 
nohup /bin/sh ./nginx_hal.sh 2>&1 > dev/null &

以下代码部署在服务器2:

#!/bin/sh
LANG=C
date=$(date -d "today" +"%Y-%m-%d %H:%M:%S")

function_bind_vip1()
{
    /sbin/ifconfig etho:ha1 61.1.1.3 broadcast 219.232.254.255 netmask 255.255.255.192 up
    /sbin/route add -host 61.1.1.3 dev eth0:hal
}
function_bind_vip2()
{

    /sbin/ifconfig etho:ha2 61.1.1.2 broadcast 219.232.254.255 netmask 255.255.255.192 up
    /sbin/route add -host 61.1.1.2 dev eth0:ha2
}
function_restart_nginx()
{
    kill -USR1 'cat /usr/local/webserver/nginx/nginx.pid'
}
function_remove_vip1()
{
    /sbin/ifconfig etho:ha1 61.1.1.3 broadcast 219.232.254.255 netamsk 255.255.255.192 down
}

function_remove_vip2()
{
    /sbin/ifconfig etho:ha2 61.1.1.2 broadcast 219.232.254.255 netamsk 255.255.255.192 down
}
function_vip_arping1()
{
    /sbin/ifconfig -I eth0 -c 3 -e 61.1.1.3  61.1.1.1 > /dev/null 2>&1
}
function_vip_arping2()
{
    /sbin/ifconfig -I eth0 -c 3 -e 61.1.1.2  61.1.1.1 > /dev/null 2>&1
}

bind_time_vip1="N";
bind_time_vip2="N";

while true
do
    httpcode_arp1='/usr/bin/cur1 -o /dev/null s -w %{http_code} '
    httpcode_arp2='/usr/bin/cur1 -o /dev/null s -w %{http_code} '

    if [x$httpcode_rip1 == "x200"];
    then
        function_bind_vip1
        function_vip_arping1
        function_restart_nginx
        bind_time_vip1="Y"
    fi
    function_vip_arping1
    else
        if [$bind_time_vip1 == "Y"];
        then
            function_remote_vip1
            bind_time_vip="N"
        fi
    fi

    if [x$httpcode_arp2 == "x200"];
    then
        if[ $bind_time_vip2 == "Y"]
        then
            function_rempve_vip2
            bind_time_vip2="N"
        fi
    else
    if [$bind_time_vip2 == "N"];
    then
        function_bind_vip2
        function_vip_arping2
        function_restart_nginx
        bind_time_vip2="Y"
    fi
    function_vip_arping2
fi

sleep 5
done

在Nginx服务器2将脚本驻留后台运行: 
nohup /bin/sh ./nginx_ha2.sh 2>&1 > dev/null &

更多Nginx相关教程见以下内容

CentOS 6.2实战部署Nginx+MySQL+PHP http:///Linux/2013-09/90020.htm

使用Nginx搭建WEB服务器 http:///Linux/2013-09/89768.htm

搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程 http:///Linux/2013-09/89692.htm

CentOS 6.3下Nginx性能调优 http:///Linux/2013-09/89656.htm

CentOS 6.3下配置Nginx加载ngx_pagespeed模块 http:///Linux/2013-09/89657.htm

CentOS 6.4安装配置Nginx+Pcre+php-fpm http:///Linux/2013-08/88984.htm

Nginx安装配置使用详细笔记 http:///Linux/2014-07/104499.htm

Nginx日志过滤 使用ngx_log_if不记录特定日志 http:///Linux/2014-07/104686.htm

Nginx 的详细介绍请点这里
Nginx 的下载地址请点这里

本文永久更新链接??址http:///Linux/2015-08/121855.htm

linux
阅读(656) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~