共计 5701 个字符,预计需要花费 15 分钟才能阅读完成。
如果将 Web 服务器集群当作一个城池,那么负载均衡服务器则相当于城门,重要性不言而喻。如果“城门”关了,与外界的通道也就断了,如果只要一台均衡服务器,当该服务器发生故障时,则会导致整个网站无法访问。因此我们需要来两台以上的服务器,实现故障转移与高可用。
双机高可用一般是通过虚拟 IP(飘移 IP)方法来实现的,基于 Linux/Unix 的 IP 别名技术。双机高可用方法目前分为两种:
(1):一台服务器加一台热被备务器,正常情况下,主服务器绑定一个公网虚拟 IP,提供负载均衡服务,热备服务器处于空闲状态,当主服务器发生故障时,热备服务器接管主服务器的公网虚拟 IP,提供负载均衡服务;
(2):两台负载均衡服务器都处于活动状态,各自绑定一个公网虚拟 IP,提供负载均衡服务,当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟 IP。
第一种方式:
(1)www.linuxidc.com 域名解析到虚拟 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): 用户访问:www.linuxidc.com(虚拟 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): 这时,用户访问 www.linuxidc.com(虚拟 IP) 实际上访问的是备机 61.1.1.1,从而实现故障转移与高可用,避免了单点故障。
另外,第一种方式可以利用基于 VRRP 路由协议的 Keeoalive 软件实现的。
第二种方式:
(1):www.linuxidc.com 域名通过 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} http://61.1.1.4′
httpcode_arp2=’/usr/bin/cur1 -o /dev/null s -w %{http_code} http://61.1.1.5′
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} http://61.1.1.5′
httpcode_arp2=’/usr/bin/cur1 -o /dev/null s -w %{http_code} http://61.1.1.4′
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://www.linuxidc.com/Linux/2013-09/90020.htm
使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm
搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm
CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm
CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm
CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm
Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm
Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm
Nginx 的详细介绍 :请点这里
Nginx 的下载地址 :请点这里
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-08/121855.htm