前言
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载。HAProxy相比LVS的使用要简单很多,但跟LVS一样,HAProxy自己并不能实现高可用,一旦HAProxy节点故障,将会影响整个站点。本文带来的是HAProxy基于KeepAlived实现Web高可用及动静分离。
相关介绍
HAProxy
HAProxy是一款提供高可用性、负载均衡以及基于TCP和HTTP应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。HAProxy适用于那些负载较大的web站点,这些站点通常又需要会话保持或七层处理。 HAProxy可以支持数以万计的并发连接,并且HAProxy的运行模式使得它可以很简单安全的整合进架构中,同时可以保护web服务器不被暴露到网络上。
KeepAlived
Keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案——由多台路由器组成一个热备组。通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。
高可用解决方案
实验拓扑
1
2
3
|
#系统环境:CentOS6.6
#Static Server:httpd
#Dynamic Servicer:LAMP
|
配置过程
HA集群配置前提
时间同步、基于主机名互相通信、SSH互信
请确保两个节点时间同步,可用ntpdate向时间服务器同步
1
|
[root@node1 ~]
# ntpdate cn.pool.ntp.org
|
基于主机名互相通信
1
2
3
4
5
6
7
8
9
10
11
12
|
[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
#两个节点都需如上操作
|
SSH互信
1
2
3
4
5
6
7
|
[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
|
安装所需程序
1
2
3
|
[root@node1 ~]
# yum install keepalived haproxy -y
#两个节点都安装
|
配置keepalived
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
[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
}
}
|
将配置文件同步给另一个节点
1
2
|
[root@node1 ~]
# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/
keepalived.conf 100% 787 0.8KB
/s
00:00
|
修改另一个节点配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
[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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
[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
/images
/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 images, 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次失败认为服务器不可用
|
将配置文件同步至另一节点
1
2
|
[root@node1 ~]
# scp /etc/haproxy/haproxy.cfg node2:/etc/haproxy/
haproxy.cfg 100% 4471 4.4KB
/s
00:00
|
web端配置
准备测试页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#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 ]
|
启动服务
1
2
3
4
5
6
|
[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情况
静态页面
动态页面
静态页面
动态页面
查看状态页面
模拟一个节点故障
1
2
3
4
|
[root@node1 ~]
# service haproxy stop
Stopping haproxy: [ OK ]
[root@node1 ~]
# service keepalived stop
Stopping keepalived: [ OK ]
|
查看各节点IP信息
VIP转移了,继续访问测试
访问不受任何影响,至此高可用及动静分离目的实现
The end
HAProxy基于KeepAlived实现Web高可用及动静分离实验就先说到这里了,本次实验因资源有限只提供了两台web服务器,如有多台可设置轮询实现负载均衡,这里就不做多介绍了,部署过程遇到问题可留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~
本文转自 北城书生 51CTO博客,原文链接:http://blog.51cto.com/scholar/1665213