安装前准备:
需要5台机器,两台安装haproxy+keepalived实现主从,其余三台做后台动态与静态的真实服务器。
该实现后端主机使用基于端口的虚拟主机来实现。后端使用了4台虚拟主机,两静两动。关闭防火墙、selinux,保证时间均同步
VIP:192.168.0.100
haproxy1:192.168.0.121
haproxy2:192.168.0.124
http:192.168.0.127
配置:
1、安装haproxy、keepalived(2个节点均安装)
yum install haproxy -y
yum install keepalived -y
2、配置haproxy。核心使用haproxy的acl功能。
HAproxy可以工作在7层模型下,因此,要实现HAProxy的强大功能,一定要学会使用强大灵活的ACL规则,通过ACL规则实现基于Haproxy的只能负载均衡系统。
ACL一般有两种功能:
(1)、通过设置的ACL规则检查客户端请求时候合法,如果符合ACL规则要求,那么就将放行;如果不符合规则,则直接中断请求。
(2)、符合ACL规则要求的请求将被提交到后端的服务器集群,进而实现基于ACL规则的负载均衡。
frontend web
bind *:80
acl url_static1 path_beg -i /static /images /javascript /stylesheets
acl url_static2 path_end -i .jpg .gif .png .css .js
acl nginx path_beg -i /nginx
acl php path_end -i .php
use_backend static1 if url_static1
use_backend static2 if url_static2
use_backend nginx if nginx
use_backend php if php
backend static1
balance roundrobin
server web1 192.168.0.127:80 check
backend static2
balance roundrobin
server web2 192.168.0.127:81 check
backend nginx
balance roundrobin
server web3 192.168.0.127:82 check
backend php
balance roundrobin
server web4 192.168.0.127:83 check
上述acl定义了四个ACL规则,分别是static1,static2,nginx,php。规则中的path_end,path_beg分别代表如果客户端的请求的URL中以.php,.gif,.png结尾则返回true。访问路径以/static/,/images,/nginx等开始时返回true.
后面的use_backend行代表当满足ACL规则后要调度到哪个后端。例如:如果用户请求php动态内容时返回到83端口的虚拟主机。这些主机里也可以再使用多台主机实现负载均衡。
3、配置haproxy的监控web页面
listen admin_stats
bind *:81
mode http
stats enable
stats hide-version
stats refresh 20s
stats uri /haproxy_stats
stats realm welcome to haproxy
stats auth gaofan:123456
stats admin if TRUE
利用本机81端口实现监控。
4、搭建虚拟主机,在服务端安装http或者nginx软件,实现基于端口的四台虚拟主机。该案例以httpd为例。
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<Directory "/var">
Options Indexes FollowSymLinks
AllowOverride none
# Order allow,deny
# Allow from all
Require all granted
</Directory>
NameVirtualHost *:80
<VirtualHost *:80>
ServerName static1.test.org
DocumentRoot "/var/www/html/static1"
</VirtualHost>
NameVirtualHost *:81
<VirtualHost *:81>
ServerName static2.test.org
DocumentRoot "/var/www/html/static2"
</VirtualHost>
NameVirtualHost *:82
<VirtualHost *:82>
ServerName nginx.test.org
DocumentRoot "/var/www/html/nginx"
</VirtualHost>
NameVirtualHost *:83
<VirtualHost *:83>
ServerName php.test.org
DocumentRoot "/var/www/html/php"
</VirtualHost>
在httpd.conf文件中添加上述配置,并添加监听的端口
Listen 80
Listen 81
Listen 82
Listen 83
同时要注意注释掉httpd的默认根
#DocumentRoot "/var/www/html"
配置所需要的页面:
[root@ga html]# pwd
/var/www/html
[root@ga html]# tree .
.
├── nginx
│ └── nginx
│ └── index.html
├── php
│ └── test.php
├── static1
│ ├── images
│ │ └── index.html
│ ├── javascript
│ │ └── index.html
│ ├── static
│ │ └── index.html
│ └── stylesheets
│ └── index.html
└── static2
└── 0.jpg
利用虚拟主机与物理机其实原理都差不多。生产中就要严格区分动与静。动态的可以使用tomcat、PHP、Resin等,静态使用httpd、nginx等
4、启动httpd,先自己测试访问
5、测试都可以访问到,再来将代理端1的haproxy.cfg拷贝到代理端2。
scp /etc/haproxy/haproxy.cfg 192.168.0.124:/etc/haproxy/
6、打开haproxy的日志功能
[root@localhost keepalived]# vim /etc/rsyslog.conf
添加如下内容
# Save haproxy messages also to haproxy.log
local2.* /var/log/haproxy.log
并且将记录的UDP与TCP的注释都打开
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
7、重启日志,当有访问请求时就可以在/var/log/下看到haproxy的日志信息。
systemctl restart rsyslog
8、配置好haproxy后,建议两个代理端都用自身IP去访问不同的URL,看是否得到上述测试结果。若结果不对,最容易出错的地方就是ACL的配置,仔细检查。
9、配置keepalived
! Configuration File for keepalived
global_defs {
notification_email {
}
router_id keepalived1
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy3.sh"
interval 1
weight 10
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 61
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.100
}
track_script {
chk_haproxy
}
}
将该文件拷贝到代理端2,同时修改state处为BACKUP,priority降低一点。
10、编写上述的检测haproxy脚本
[root@localhost keepalived]# cat ./check_haproxy3.sh
#!/bin/bash
if [ $(ps -C haproxy --noheader | wc -l) -eq 0 ]; then
systemctl start haproxy
fi
sleep 2
if [ $(ps -C haproxy --noheader | wc -l ) -eq 0 ]; then
systemctl start keepalived
fi
上述的检测方式特别多,目的就是检测当某一端haproxy如果down掉了,保证VIP可以漂移至另一端,实现高可用。
最常用的可以使用killall命令:
killall -0 haproxy
但是!笔者在测试时有时候就很奇怪,明明关掉了haproxy,VIP漂不过去,很纳闷!希望有大神可以指点。
11、启动haproxy、keepalived。
12、利用VIP访问测试:
13、再测试高可用状态,将代理端1 的haproxy关掉。看看VIP是否在代理端2,若不在就应该好好检查探测脚本。
14、查看监控页:
在该页面也可以实现调整后端真实服务端的状态。
15、Haproxy的功能是及其强大的,可以代理后端mysql的读操作,还可以接一个共享存储。可以尝试,共同探讨!