负载均衡的方案有很多种,这边采用HAProxy+Keepalived解决方案。
介绍
HAProxy介绍
HAproxy是一个高性能的TCP/HTTP负载均衡服务器软件,速度非常快,可用性极高。它适用于所有基于TCP或者HTTP的应用程序,尤其适用于繁忙的Web服务。在当今主流的服务器配置上,可以轻松地支持几万的并发链接。
Keepalived介绍
从Keepalived的名字可以看出,它的作用就是“keep alive”,让你的系统正常运转,永不宕机。我们使用Keepalived的目的,就是检测从多Web服务器的状态;如果有一台Web
服务器出现故障,Keepalived将很快检测到并把它从系统中剔除,待其恢复正常后,Keepalived会自动将其重新加入到服务器群中。整个过程不需要人工干涉,你所要做的,只是对发生故障的节点进行修复。
HAProxy+Keepalived的好处
这种集群方案的好处有很多:
配置十分方便。
万一有Web服务器宕机,系统可以及时发现,并把访问需求交给健康的服务器,这样就不会出现用户无法访问的情况。这就是“高可用性”的体现。
负载均衡服务器会把访问需求分给比较有空的Web服务器,而不会给那些本来就已经很忙的服务器。这是“负载均衡”的体现。
Failover(故障转移)时间极短。如果将状态检查频率设置为每1秒钟一次,那么一旦负载均衡服务器发生故障,从服务器会在1秒后立即变成主服务器。
HAProxy支持Session,会比较好地处理好Session的问题。很多网站都是基于Session的,比如论坛、购物车等;如果你在网上 购物时,在Apache节点一上创建了Session,那么万一节点二突然接管了你的访问请求,你的购物信息将丢失,因为Session也丢失了。但是我 们采用的方案,就不会产生这样的问题。
架构
在这个例子中,有2个Apache节点、2个负载均衡节点。这4台服务器需要用5个IP地址。其中4个IP地址当然是分配给4台服务器每台一个,剩下的那个IP,我们叫做“虚拟IP地址”,用来给2个负载均衡节点共享。
架构详情
配置信息如下:
负载均衡节点1:lb1.mytest.com(lb1);IP地址:192.168.1.10;
负载均衡节点2:lb2.mytest.com(lb2);IP地址:192.168.1.11;
Web节点1:www1.mytest.com(www1);IP地址:192.168.1.12;
Web节点2:www2.mytest.com(www2);IP地址:192.168.1.13;
虚拟IP:192.168.1.14,用于处理访问请求。
架构的实现
Web服务器的安装及配置
1.安装apache2
首先,我们在两台Web节点www1和www2上安装Apache2:
$sudo apt-get install apache2
安装程序已经创建了一个虚拟主机/etc/apache2/sites-available/default,其默认的www根目录为/var/www/。
2.修改apache2.conf
在本方案中,我们会将HAProxy配置成透明的反向代理,它会把访问者的IP地址用X-Forwarded-For变量传递给后面的Web服务器。我们当然希望Apache在日志中记录访问者的IP地址,而不是负载服务器的IP地址。
因此,我们需要修改apache2.conf将LogFormat中的%h改为%{X-Forwarded-For}i.
$sudo nano /etc/apache2/apache2.conf
[...]
#LogFormat ”%h %l %u %t \ ”%r\” %>s %b \ ” %{Referer}i\” \”%{User-Agent}i\”" combined
LogFormat ”%{X-Forwarded-For}i %l %u %t \”%r\” %>s %b \ ” %{Referer}i\” \”%{User-Agent}i\”" combined
[...]
3.创建文件check.txt
我们将使用HAProxy来监控Web节点的状态。为此,我们需要在两个Web节点的/var/www/ 下面准备一个文件,如果HAProxy能够访问到这个文件,就说明Web节点正常;否则说明Web节点发生故障。
该文件的名称可以自己定义,我们把它命名为check.txt;
$sudo touch /var/www/check.txt
4.修改虚拟主机配置
我们不希望虚拟主机在访问日志中记录check.txt的访问情况,这样会干扰我们做日志分析。为此,我们需要修改虚拟主机的配置文件:
$sudo nano /etc/apache2/sites-available/default
[...]
SetEnvIf Request_URI ”^/check\.txt$” dontlog
CustimLog /var/log/apache2/access.log combined env=!dontlog
[...]
请确认该配置文件中没有其他的CustomLog。
最后,重新启动Apache:
$sudo /etc/init.d/apache2 restart
HAProxy的安装及配置
以下操作,均在lb1.mytest.com和lb2.mytest.com上执行。
1.安装HAProxy
好,现在我们来安装HAProxy:
$sudo apt-get install haproxy
2.配置haproxy.cfg
HAProxy的配置文件为/etc/haproxy.cfg, 我们先备份原文件,再创建一个新的:
$sudo mv /etc/haproxy.cfg /etc/haproxy.cfg-back
$sudo nano /etc/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
retries 3
redispat ch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webfarm 192.168.1.14:80
mode http
stats enable
sats auth admin:password
balance roundrobin
cookie JSESSIONID prefix
option httpclose
option forwardfor
option httpchk HEAD /check.txt HTTP/1.0
server webA 192.168.1.12:80 cookie A check
server webB 192.168.1.13:80 cookie B check
上述配置中的retries指定了重试次数,也就是在发现某个Web节点无法访问后,还会再重试3次。“cookie JSESSIONID prefix”一行,是用于处理Session的。
该配置让HAProxy监听在虚拟IP地址192.168.1.14的80端口上,后面的两台Web服务器分别为192.168.1.12和192.168.1.13,以文件/check.txt作为检查目标。
HAProxy的配置选项极为丰富,具体信息请参考:
3.修改/etc/sysctl.conf
为了让HAProxy能够绑定到虚拟IP地址,我们需要修改/etc/sysctl.conf:
$sudo nano /etc/sysctl.conf
添加下面一行内容
net.ipv4.ip_nonlocal_bind = 1
然后,使之生效:
$sudo sysctl -p
4.让HAProxy自动启动
现在,我们来修改/etc/default/haproxy,以便让HAProxy在系统启动时也能够自动启动。
$sudo nano /etc/default/haproxy
#Set ENABLED to 1 if you want the init script to start haproxy.
ENABLED = 1
#Add extra flags here.
#EXTRAOPTS = ”-de -m 16″
Keepalived的安装及配置
我们刚才已经配置好lb1和lb2,让HAProxy监听虚拟IP地址192.168.1.14.不过,到底是lb1还是lb2应该监听该IP地址呢?这项工作是由Keepalived完成的。
Keepalived将lb1和lb2分配为“主”和“从”,平时工作由主服务器负责,从服务器处于待命状态。
1. 安装Keepalived
现在我们来安装Keepalived:
$sudo apt-get install keepalived
该软件也很小,很快就可以安装完毕。
2. 配置Keepalived
现在我们来配置Keepalived. 它的配置文件位于/etc/keepalived/keepalived.conf.
我们将lb1作为负载均衡的“主服务器”,将lb2作为“从服务器”。这是通过配置文件中的priority(优先级)来实现的。在“主服务喊叫”上要设置priority为101,“从服务器”则设置priority为100。
在lb1上,设置/etc/keepalived/keepalived.conf:
$sudo nano /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy{
script ”kill -0 haproxy”
interval 2 #每2秒钟检查一次
weight 2
}
vrrp_instance VI_1{
interface eth0
state Master
virtual_router_id 51
priority 101 #101为“主”,100为“从”
virtual_ipaddress{
192.168.1.14
}
track_script{
chk_haproxy
}
}
然后,运行Keepalived服务:
$sudo /etc/init.d/keepalived start
在lb2上,设置/etc/keepalived/keepalived.conf:
$sudo nano /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy{
script ”kill -0 haproxy”
interval 2 #每2秒钟检查一次
weight 2
}
vrrp_instance VI_1{
interface eth0
state Master
virtual_router_id 51
priority 100 #101为“主”,100为“从”
virtual_ipaddress{
192.168.1.14
}
track_script{
chk_haproxy
}
}
然后,运行Keepalived服务:
$sudo /etc/init.d/keepalived start
现在,在lb1和lb2上分别查看IP地址信息:
$ip addr sh eth0
在lb1上,应该可以看到虚拟IP地址192.168.1.14
在lb2上,刚看不到虚拟IP地址192.168.1.14
最后,在lb1和lb2上分别启动HAProxy:
$sudo /etc/init.d/haproxy start