Haproxy+keepalied实现web负载均衡
一、实验拓扑图;
keepalived的主要目的是为ipvs提供高可用性,因此keepalived除了能够实现资源转移之外,自身能够调用ipvsadm命令来生成规则,而且还能够检测后端Rserver服务的健康状态检测。keepalived自身就是一个服务 ,启动之后工作在两个节点上(可以是多个节点),一个为当前活动节点,一个为备用节点简称为一主(master)一备(backup)。master会不时的向backup传递通告信息(这种通告信息机制是基于vrrp协议),备用节点会一值处于存活状态,backup节点一但接收不到master的通告信息,就会把资源转移到自身节点上,生成规则,继续工作,这一转移的过程,对于用户来是说透明的.
二、后端服务的安装与配置;
[root@web1 ~]# yum install httpd [root@web1 ~]# echo "<h1>web1.yang.com</h1>" > /var/www/html/index.html [root@web1 ~]# service httpd start [root@web1 ~]# cat /var/www/html/index.html <h1>web1.yang.com</h1>
[root@web2 ~]# yum install httpd [root@web2 ~]# echo "<h1>web2.yang.com</h1>" > /var/www/html/index.html [root@web2 ~]# service httpd start [root@web2 ~]# cat /var/www/html/index.html <h1>web2.yang.com</h1>
[root@lamp ~]# yum install php php-mysql mysql mysql-server mysql-devel
[root@lamp html]# cat index.php
<?php
$link = mysql_connect(‘172.16.34.1‘,‘ouyang‘,‘redhat‘);
if ($link)
echo "<h1>数据库连接成功...</h1>";
else
echo "<h1>数据库连接失败...</h1>";
mysql_close();
phpinfo();
?>HA服务器上编译安装Haproxy;两台都需要安装,配置是一样的,这里只做一台服务器的配置,而后将其配置文件复制另一台HA即可;
#cd haproxy-1.4.24 [root@ha2 haproxy-1.4.24]# uname -n [root@ha2 haproxy-1.4.24]# make TARGET=linux26 ARCH=x86_64 [root@ha2 haproxy-1.4.24]# make install [root@ha2 haproxy-1.4.24]# mkdir /etc/haproxy [root@ha2 haproxy-1.4.24]# cp examples/haproxy.cfg /etc/haproxy/ [root@ha2 haproxy-1.4.24]# cp examples/haproxy.init /etc/init.d/haproxy [root@ha2 haproxy-1.4.24]# chmod +x /etc/init.d/haproxy [root@ha2 haproxy-1.4.24]# chmod +x /etc/init.d/haproxy [root@ha2 haproxy-1.4.24]# chkconfig --add haproxy [root@ha2 haproxy-1.4.24]# mkdir /usr/share/haproxy [root@ha2 haproxy-1.4.24]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
修改主配置文件;
[root@ha2 haproxy-1.4.24]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
chroot /usr/share/haproxy
uid 99
gid 99
daemon
#debug
#quiet
defaults
log global
mode http
option httplog 使用http日志
option dontlognull 不记录空连接日志,主要用于不记录健康检查日志
retries 3 服务器连接失败后的重试次数
option redispatch 在http模式,如果使用cookie的服务器宕机,客户端还会坚持连接它,该选项在后端服务器宕机时强制将请求转发给其它的健康主机
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
timeout check 1s 设置检查超时时间
timeout http-request 10s 连接超时时间
timeout queue 1m
timeout connect 10s 连接最大超时时间
timeout client 1m 客户端最大超时时间
timeout server 1m 服务器端最大超时时间
timeout http-keep-alive 10s
listen stats
mode http
bind 0.0.0.0:8080 #指定的IP地址与Port
stats enable #开启Haproxy统计状态
stats refresh 5s #统计页面自动刷新的时间间隔
stats hide-version #状态页面不显示版本号
stats uri /admin #统计页面的uri为"/admin"
stats realm Haproxy\ admin #统计页面认证时提示内容信息
stats auth admin:admin #统计页面的用户名与密码
stats admin if TRUE
frontend allen #定义前端服务器
bind *:80
mode http
option httpclose #每次请求完成主动关闭http连接
option forwardfor #后端服务器获取客户端的IP地址,可以从http header中获取
acl url_static path_end -i .html .jpg .gif #定义ACL规则以如".html"结尾的文件;-i:忽略大小写
acl url_dynamic path_end -i .php
default_backend webservers #客户端访问时默认调用后端服务器地址池
use_backend lamp if url_dynamic #调用后端服务器并检查ACL规则是否被匹配
backend webservers #定义后端服务器
balance roundrobin #定义算法;基于权重进行轮询
server web1 172.16.34.2:80 check rise 2 fall 1 weight 3
server web2 172.16.34.3:80 check rise 2 fall 1 weight 1
backend lamp
balance source #定义算法;源地址hash运算;类似于Nginx的ip_hash
server lamp 172.16.34.1:80 check rise 2 fall 1把ha-1定义好的配置文件传送至ha-2/etc/keepalived/目录下;
#service haproxy start
启动haproxy服务,查看其状态检测页面;
四、keepalived的安装配置;两个ha互为主从;
ha-2 vip 172.16.34.200 ha2为从,ha1为主 当主服务ha-2设备宕机了会自动切换去从服务ha-1服务
ha-1安装配置keepalived;
[root@ha1 ~]#yum -y install keepalived
[root@ha1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
admin@163.com 定义邮件列表,当主服务器出现故障时进行主从切换时会发送邮件给邮件列表当中的所有人;
}
! Configuration File for keepalived
notification_email_from Alexandre.Cassen@firewall.loc 定义邮件的发送者
smtp_server 127.0.0.1 邮件服务器的IP
}
vrrp_script chk_proess {
script "killall -0 haproxy"
interval 1
weight -2
}
vrrp_instance ha_1 { 定义第一个主设备ha-1
state MASTER ha-1主服务器
interface eth0
virtual_router_id 60 设置虚拟路由IP,相同的vrid为一个组,要求主从需不一致,为0-255;
priority 100 虚拟路由组中设备的优代级,优化级高被推荐为主设备;
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.34.100 虚拟路由IP(VIP)
}
track_script { 调用上面所定义的脚本
chk_proess
}
}
vrrp_instance ha_2 { 定义第二个主设备ha-2
state BACKUP ha-2为从服务器
interface eth0
virtual_router_id 57 设置虚拟路由IP,相同的vrid为一个组,要求主从需不一致,为0-255;
priority 87 虚拟路由组中设备的优代级,优化级高被推荐为主设备;
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.34.200 从服务器的虚拟IP (VIP)
}
}ha-2安装配置keepalived;
[root@ha2 ~]# #yum install -y keepalived
[root@ha2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
admin@163.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
}
vrrp_script chk_proess {
script "killall -0 haproxy"
interval 1
weight -2
}
vrrp_instance ha_1 {
state BACKUP ha-1为从服务
interface eth0
virtual_router_id 60
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.34.100
}
track_script {
chk_proess
}
}
vrrp_instance ha_2 {
state MASTER ha-2为主服务器
interface eth0
virtual_router_id 57
priority 88
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.34.200
}
track_script {
chk_proess
}
}启动keepalived;
[root@ha1 ~]#service keepalived start
ha-1查看VIP是否启动;
[root@ha1 ~]#ip addr show
[root@ha2 ~]#ip addr show
五、测试静态web;分别使用两个VIP进行测试;
测试php;
六、故障测试;对ha-1宕机操作;
ha-1的VIP地址已没有;而后到ha-2上查看;如下图;
当再次启动ha-1的时候,ha-1的VIP还会自动回来;
本文出自 “春天里” 博客,请务必保留此出处http://wfnygah.blog.51cto.com/7150625/1405727













