1.架构
2个Apache节点,2个负载均衡节点。这四台服务器需要用到5个IP地址,其中4个IP地址分别分配给4台服务器,剩下的那个IP地址,我们叫做"虚拟IP地址“或”共享IP地址“,用来给2个负载均衡节点共享。
架构详情:
负载均衡节点1:lb1; IP地址:192.168.1.11
负载均衡节点2:lb2; IP地址:192.168.1.12
WEB节点1:www1; IP地址:192.168.1.13
WEB节点2:www2; IP地址:192.168.1.14
虚拟IP:192.168.1.10,对外服务,用于处理访问请求。
确定每台机器的/etc/hostname和/etc/hosts的内容:
比如 lb1的/etc/hostname的内容为: lb1
/etc/hosts的内容:
[...]
#127.0.1.1 lb1
192.168.1.11 lb1
[...]
其他三台都对应的配置。
2.架构的实现
2.1对WEB服务器的配置
2.1.1 安装Apache2 sudo apt-get install apache2
2.1.2 修改 /etc/apache2/apache2.conf
在本方案中,我们会将HAProxy配置成透明的反向代理,它会把访问者的IP地址用X-Forwarded-For变量传递给后面的WEB服务器。当然我们希望Apache在日志中记录访问者的IP地址,而不是负载均衡服务器的IP地址。
因此,我们修改/etc/apache2/apache2.conf,将LogFormat中的%h改为 %{X-Forwarded-For}i 。
LogFormat "%v:%p %{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
然后,使之生效: sudo sysctl -p
如果你的lb1和lb2用的是KVM/Xen虚拟机,还需要在宿主服务器上修改/etc/sysctl.conf:
net.ipv4.conf.default.rp_filter=1
2.2.5 HAProxy的安装及配置 (均在lb1和lb2上操作执行)
2.2.5.1安装HAProxy: sudo apt-get install haproxy
2.2.5.2配置/etc/haproxy/haproxy.cfg (修改前备份一下)
-------------------------------------------------
global
该配置让HAProxy监听在虚拟IP地址 192.168.1.10的80端口上,后面的两台web服务器分别为192.168.1.13和192.168.1.14,以文件/check.txt作为检查目标。
2.2.5.3 让HAProxy自动启动 (把ENABLED的值改成1)
sudo vi /etc/default/haproxy
# Set ENABLED to 1 if you want the init script to start haproxy.
2个Apache节点,2个负载均衡节点。这四台服务器需要用到5个IP地址,其中4个IP地址分别分配给4台服务器,剩下的那个IP地址,我们叫做"虚拟IP地址“或”共享IP地址“,用来给2个负载均衡节点共享。
架构详情:
负载均衡节点1:lb1; IP地址:192.168.1.11
负载均衡节点2:lb2; IP地址:192.168.1.12
WEB节点1:www1; IP地址:192.168.1.13
WEB节点2:www2; IP地址:192.168.1.14
虚拟IP:192.168.1.10,对外服务,用于处理访问请求。
确定每台机器的/etc/hostname和/etc/hosts的内容:
比如 lb1的/etc/hostname的内容为: lb1
/etc/hosts的内容:
[...]
#127.0.1.1 lb1
192.168.1.11 lb1
[...]
其他三台都对应的配置。
2.架构的实现
2.1对WEB服务器的配置
2.1.1 安装Apache2 sudo apt-get install apache2
2.1.2 修改 /etc/apache2/apache2.conf
在本方案中,我们会将HAProxy配置成透明的反向代理,它会把访问者的IP地址用X-Forwarded-For变量传递给后面的WEB服务器。当然我们希望Apache在日志中记录访问者的IP地址,而不是负载均衡服务器的IP地址。
因此,我们修改/etc/apache2/apache2.conf,将LogFormat中的%h改为 %{X-Forwarded-For}i 。
LogFormat "%v:%p %{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O" common
2.1.3 创建文件check.txt (内容随意)
我们使用HAProxy来监控WEB节点的状态。为此,我们需要在两个WEB节点下面准备一个文件,如果HAProxy能够访问到这个文件,就说明WEB节点正常,否则说明WEB节点发生故障。
2.1.4 修改虚拟主机配置
不希望虚拟主机在访问日志中记录check.txt的访问情况,这样会干扰我们的日志分析。为此,我们需要修改虚拟主机的配置文件,把原先的CustomLog行注释掉,并且加2行新配置:
vi /etc/apache2/sites-available/000-default.conf
[...]
#CustomLog ${APACHE_LOG_DIR}/access.log combined
SetEnvIf Request_URI "^/check\.txt$" dontlog
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!dontlog
[...]
请确认该配置文件中没有其他的CustomLog 。最后重启Apache (sudo /etc/init.d/apache2 restart)
2.1.5标识web主机 (测试的时候方便知道访问的是哪一个web节点
2.2 Keepalived的安装及配置
2.2.1 安装Keepalived
sudo apt-get install keepalived
2.1.3 创建文件check.txt (内容随意)
我们使用HAProxy来监控WEB节点的状态。为此,我们需要在两个WEB节点下面准备一个文件,如果HAProxy能够访问到这个文件,就说明WEB节点正常,否则说明WEB节点发生故障。
2.1.4 修改虚拟主机配置
不希望虚拟主机在访问日志中记录check.txt的访问情况,这样会干扰我们的日志分析。为此,我们需要修改虚拟主机的配置文件,把原先的CustomLog行注释掉,并且加2行新配置:
vi /etc/apache2/sites-available/000-default.conf
[...]
#CustomLog ${APACHE_LOG_DIR}/access.log combined
SetEnvIf Request_URI "^/check\.txt$" dontlog
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!dontlog
[...]
请确认该配置文件中没有其他的CustomLog 。最后重启Apache (sudo /etc/init.d/apache2 restart)
2.1.5标识web主机 (测试的时候方便知道访问的是哪一个web节点
2.2 Keepalived的安装及配置
2.2.1 安装Keepalived
sudo apt-get install keepalived
2.2.2 修改/etc/sysctl.conf
为了让Keepalived能够随便绑定虚拟IP地址,修改/etc/sysctl.conf,启用IP转发(net.ipv4.ip_forward),并加上一条nonlocal_bind的配置:
[...]
net.ipv4.ip_forward=1
为了让Keepalived能够随便绑定虚拟IP地址,修改/etc/sysctl.conf,启用IP转发(net.ipv4.ip_forward),并加上一条nonlocal_bind的配置:
[...]
net.ipv4.ip_forward=1
net.ipv4.ip_nonlocal_bind=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_syncookies=1
[...]然后,使之生效: sudo sysctl -p
如果你的lb1和lb2用的是KVM/Xen虚拟机,还需要在宿主服务器上修改/etc/sysctl.conf:
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.tcp_syncookies=1
net.ipv4.conf.eth1.proxy_arp=1
net.ipv4.conf.eth0.proxy_arp=1
net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
net.bridge.bridge-nf-call-arptables=0
(在kvm虚拟机中待验证)
2.2.3 配置Keepalived
将lb1作为负载均衡的“主服务器”,将lb2作为“从服务器”,这是通过配置文件中的priority(优先级)来实现的。在主服务器上设置priority为101,从服务器上则设置priority为100 。
----------------------------------------------------------------
在lb1/lb2上操作,创建/etc/keepalived/keepalived.conf 。
#通知设置
2.2.3 配置Keepalived
将lb1作为负载均衡的“主服务器”,将lb2作为“从服务器”,这是通过配置文件中的priority(优先级)来实现的。在主服务器上设置priority为101,从服务器上则设置priority为100 。
----------------------------------------------------------------
在lb1/lb2上操作,创建/etc/keepalived/keepalived.conf 。
#通知设置
global_defs{
notification_email{
1213@mapgoo.net #要通知的Email (邮箱地址可以多个,每行一个)
}
notification_email_from lb1@mytest.com #通知邮件的From地址
smtp_server 127.0.0.1 #这里可以设置成你自己的smtp服务器地址
smtp_connect_timeout 20
}
#定义脚本,用以检测haproxy是否正常运行
vrrp_script chk_haproxy{
script "killall -0 haproxy"
interval 2
weight 2
}
#虚拟接口配置
vrrp_instance VI_1{
interface eth0
state MASTER #在lb2上是BACKUP (区别点)
priority 101 #在lb2上是100 (区别点)
virtual_router_id 51
smtp_alert #启用email通知
authentication{
auth_type PASS
auth_pass Amitabha #设置你的密码
}
#共享的虚拟IP地址
virtual_ipaddress{
192.168.1.10
}
# 故障检测
track_script{
chk_haproxy
}
}
----------------------------------------------------------------
2.2.4 运行keepalived服务,并且查看IP地址信息:
service keepalived start
ip addr sh eth0
-----
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
-----
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether c8:1f:66:c5:0e:06 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.142/24 brd 192.168.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet 192.168.1.10/32 scope global eth1 (成功的话设置成MASTER的lb1,这是显示共享虚拟的IP地址)
valid_lft forever preferred_lft forever
inet6 fe80::ca1f:66ff:fec5:e06/64 scope link
valid_lft forever preferred_lft forever
------
------
2.2.5 HAProxy的安装及配置 (均在lb1和lb2上操作执行)
2.2.5.1安装HAProxy: sudo apt-get install haproxy
2.2.5.2配置/etc/haproxy/haproxy.cfg (修改前备份一下)
-------------------------------------------------
global
log /dev/log local0
log /edv/log local1 notice
maxconn 4096
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
option dontlognull
retries 3 #HAProxy在遇到问题时再重复3次
contimeout 5000
clitimeout 50000
srvtimeout 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen webfarm 192.168.1.10:80
mode http
option httplog
stats enable #启动统计页面
stats auth hiweed:mypassword #统计页面的账号和密码
balance roundrobin #均衡方式:逐个轮流
cookie JSESSIONID prefix #用于Session的
option httpclose
option forwardfor
option httpchk HEAD /check.txt HTTP/1.0
server webA 192.168.1.13:80 cookie A check
server webB 192.168.1.14:80 cookie B check
---------------------------------------------------
该配置让HAProxy监听在虚拟IP地址 192.168.1.10的80端口上,后面的两台web服务器分别为192.168.1.13和192.168.1.14,以文件/check.txt作为检查目标。
2.2.5.3 让HAProxy自动启动 (把ENABLED的值改成1)
sudo vi /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"
2.2.5.4 在lb1和lb2上启动HAProxy
sudo service haproxy start
3.测试
3.1WEB节点测试
浏览器中输入:192.168.1.10
按F5刷新,你会发现都是在两台web服务器之间切换,这就是我们实现的“负载均衡”功能。之所以能够切换,我们使用的均衡方式是roundrobin,也就是让所有的节点轮流上场。均衡方式也可以用source,这个有点像Nginx的IP Hash,也就是说,只要在集群的节点数量不变,那么来自某个IP的用户,会始终被HAProxy分配到固定的一个节点上(这个特性也会解决Session问题)。
2.2.5.4 在lb1和lb2上启动HAProxy
sudo service haproxy start
3.测试
3.1WEB节点测试
浏览器中输入:192.168.1.10
按F5刷新,你会发现都是在两台web服务器之间切换,这就是我们实现的“负载均衡”功能。之所以能够切换,我们使用的均衡方式是roundrobin,也就是让所有的节点轮流上场。均衡方式也可以用source,这个有点像Nginx的IP Hash,也就是说,只要在集群的节点数量不变,那么来自某个IP的用户,会始终被HAProxy分配到固定的一个节点上(这个特性也会解决Session问题)。
3.2负载均衡节点故障模拟
停掉主服务器lb1,看服务能不能中断。
4.HAProxy的WEB统计页面
HAProxy自带了一个web统计页面。在其配置文件中,有两行:
stats enable #启动统计页面
停掉主服务器lb1,看服务能不能中断。
4.HAProxy的WEB统计页面
HAProxy自带了一个web统计页面。在其配置文件中,有两行:
stats auth hiweed:mypassword #统计页面的账号和密码
浏览器中输入:192.168.1.10/haproxy?stats (即可用账号密码登陆上去)
如果不需要该页面,只需要在HAProxy的配置文件中去掉上面的这两行就行。
浏览器中输入:192.168.1.10/haproxy?stats (即可用账号密码登陆上去)
如果不需要该页面,只需要在HAProxy的配置文件中去掉上面的这两行就行。