HAProxy基于KeepAlived实现Web高可用及动静分离
前言
软件负载均衡一般有两种实现方式:基于 *** 作系统的软负载实现和基于第三方应用的软负载实现。LVS是基于Linux *** 作系统的软负载,而HAProxy是基于第三方应用的软负载。与LVS相比,HAProxy的使用简单得多,但与LVS一样,HAProxy本身无法实现高可用性。一旦HAProxy节点出现故障,将会影响整个站点。本文介绍的是HAProxy在KeepAlived的基础上实现了Web的高可用性和动静分离。
相关介绍
HAProxy
HAProxy是一个代理软件,提供高可用性、负载平衡和基于TCP和HTTP的应用程序。HAProxy是完全免费的。在HAProxy的帮助下,您可以快速可靠地提供基于TCP和HTTP应用程序的代理解决方案。HAProxy适用于那些负载较重的网站,通常需要会话维护或者七层处理。HAProxy可以支持数万个并发连接,其运行模式使得集成到架构中变得简单安全,同时可以保护web服务器不暴露在网络中。
保持活动状态
Keepalived采用VRRP(虚拟路由器冗余协议)热备份协议,通过软件实现linux服务器的多机热备份功能。VRRP是路由器的备份解决方案,多台路由器组成一个热备用组。通过共享的虚拟IP地址向外界提供服务;每个热备组中只有一个主服务器同时提供服务,其他服务器处于冗余状态。如果当前在线的服务器出现故障,其他服务器将自动接管(优先级决定替换顺序)虚拟IP地址以继续提供服务。
高可用性解决方案
实验拓扑
#系统环境:CentOS6.6
#Static Server:httpd
#Dynamic Servicer:LAMP
配置过程
高可用性集群配置前提
时间同步,基于主机名的相互通信,SSH相互信任
请确保两个节点之间的时间同步,并使用ntpdate与时间服务器同步。
[root@node1 ~]# ntpdate cn.pool.ntp.org
基于主机名相互通信
[root@node1 ~]# vim /etc/hosts
172.16.10.123 node1.scholar.com node1
172.16.10.124 node2.scholar.com node2
[root@node1 ~]# vim /etc/sysconfig/network
HOSTNAME=node1.scholar.com
[root@node1 ~]# uname -n
node1.scholar.com
#两个节点都需如上 *** 作
宋承宪互信
[root@node1 ~]# ssh-keygen -t rsa -P ''
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2
[root@node2 ~]# ssh-keygen -t rsa -P ''
[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
[root@node1 ~]# date; ssh node2 'date' #测试
Wed Jun 24 15:58:46 CST 2015
Wed Jun 24 15:58:46 CST 2015
安装所需的程序
[root@node1 ~]# yum install keepalived haproxy -y
#两个节点都安装
配置保持活动状态
[root@node1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 { #定义VRRP实例,实例名自定义
state MASTER #指定Keepalived的角色,MASTER为主服务器,BACKUP为备用服务器
interface eth0 #指定HA监测的接口
virtual_router_id 51 #虚拟路由标识(1-255),在一个VRRP实例中主备服务器ID必须一样
priority 100 #优先级,数字越大越优先,主服务器优先级必须高于备服务器
advert_int 1 #设置主备之间同步检查时间间隔,单位秒
authentication { #设置验证类型和密码
auth_type PASS #验证类型
auth_pass ab007 #设置验证密码,同一实例中主备密码要保持一致
}
virtual_ipaddress { #定义虚拟IP地址
192.168.12.21
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 61
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass sr200
}
virtual_ipaddress {
192.168.12.22
}
}
将配置文件同步到另一个节点
[root@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/
keepalived.conf 100% 787 0.8KB/s 00:00
修改另一个节点配置文件。
[root@node2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass ab007
}
virtual_ipaddress {
192.168.12.21
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 61
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass sr200
}
virtual_ipaddress {
192.168.12.22
}
}
配置HAProxy
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
log 127.0.0.1 local2 #日志将通过rsyslog进行归档记录
chroot /var/lib/haproxy #运行的安装路径
pidfile /var/run/haproxy.pid #pid文件存放的位置
maxconn 4000 #最大连接
user haproxy #运行haproxy的用户
group haproxy #运行haprixy的组
daemon #以后台模式运行haproxy
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http #工作模式
log global #记录日志
option httplog #详细记录http日志
option dontlognull #不记录健康检查的日志信息
option http-server-close #启用服务器端主动关闭
option forwardfor except 127.0.0.0/8 #传递客户端IP
retries 3 #请求重试次数
timeout http-request 10s #http
请求超时时间
timeout queue 1m #一个请求在队列里的超时时间
timeout connect 10s #
连接服务器超时时间
timeout client 1m #客户端超时时间
timeout server 1m #客户端超时时间
timeout http-keep-alive 10s #持久连接超时时间
timeout check 10s #心跳检测超时时间
maxconn 3000 #最大连接数
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend proxy *:80
#定义ACL
acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
acl url_dynamic path_end _i .php .jsp
use_backend dynamic if url_dynamic #调用后端服务器并检查ACL规则是否被匹配
default_backend static
#---------------------------------------------------------------------
# static backend for serving up p_w_picpaths, stylesheets and such
#---------------------------------------------------------------------
backend static #后端调度
balance source #调度算法
server s1 172.16.10.125:80 inter 1500 rise 2 fall 3 check
#----------------------------------------
listen statistics
mode http #http 7 层模式
bind *:8080 #监听地址
stats enable #启用状态监控
stats auth admin:admin #验证的用户与密码
stats uri /admin?status #访问路径
stats hide-version #隐藏状态页面版本号
stats admin if TRUE #如果验证通过了就允许登录
stats refresh 3s #每3秒刷新一次
acl allow src 192.168.12.0/24 #允许的访问的IP地址
tcp-request content accept if allow #允许的地址段就允许访问
tcp-request content reject #拒绝非法连接
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend dynamic
balance source
server s2 172.16.10.12:80 check inter 1500 rise 2 fall 3
#check inter 1500是检测心跳频率
#rise2 2次正确认为服务器可用
#fall3 3次失败认为服务器不可用
将配置文件同步到另一个节点
[root@node1 ~]# scp /etc/haproxy/haproxy.cfg node2:/etc/haproxy/
haproxy.cfg 100% 4471 4.4KB/s 00:00
Web端配置
准备测试页
#static server
[root@scholar ~]# vim /var/www/html/index.html
<h1>172.16.10.125</h1>
[root@scholar ~]# service httpd start
Starting httpd: [ OK ]
#dynamic server
[root@scholar ~]# vim /var/www/html/index.php
<h1>172.16.10.20</h>
<?php
$link = mysql_connect('127.0.0.1','root','');
if ($link)
echo "Success...";
else
echo "Failure...";
mysql_close();
phpinfo();
?>
[root@scholar ~]# service httpd start
Starting httpd: [ OK ]
[root@scholar ~]# service mysqld start
Starting mysqld: [ OK ]
启动服务
[root@node1 ~]# service haproxy start; ssh node2 'service haproxy start'
Starting haproxy: [ OK ]
Starting haproxy: [ OK ]
[root@node1 ~]# service keepalived start; ssh node2 'service keepalived start'
Starting keepalived: [ OK ]
Starting keepalived: [ OK ]
静态和动态分离以及高可用性测试
检查每个节点的IP状态
静态页面
动态页面
静态页面
动态页面
查看状态页面
模拟节点故障
[root@node1 ~]# service haproxy stop
Stopping haproxy: [ OK ]
[root@node1 ~]# service keepalived stop
Stopping keepalived: [ OK ]
检查每个节点的IP信息
VIP已被转移。继续参观测试。
访问不受影响,从而达到高可用、动静分离的目的。
结束
以上就是HAProxy基于KeepAlived实现web高可用、动静分离的实验。由于资源有限,本实验只提供了两台网络服务器。如果有多台服务器可以设置轮询来实现负载均衡,这里就不介绍了。如果在部署过程中遇到什么问题,可以留言交流。以上仅供个人学习。如有错漏,请勿喷~~~
评论列表(0条)