HAProxy基于KeepAlived实现Web高可用及动静分离
前言
软件负载均衡一般通过两种方式来实现:
基于操作系统的软负载实现
基于第三方应用的软负载实现
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地址,以继续提供服务。
高可用解决方案
实验拓扑
-
#系统环境:CentOS6.6
-
#Static Server:httpd
-
#Dynamic Servicer:LAMP
配置过程
HA集群配置前提
时间同步
基于主机名互相通信
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
-
#两个节点都需如上操作
SSH互信
-
[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
-
-
#两个节点都安装
配置KeepAlived
-
[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' ps 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次失败认为服务器不可用
将配置文件同步至另一节点
-
[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高可用及动静分离实验就先说到这里了。
本次实验因资源有限只提供了两台web服务器,如有多台可设置轮询实现负载均衡,这里就不做多介绍了。
文章来源: zmedu.blog.csdn.net,作者:互联网老辛,版权归原作者所有,如需转载,请联系作者。
原文链接:zmedu.blog.csdn.net/article/details/103259788
- 点赞
- 收藏
- 关注作者
评论(0)