基于HAProxy + KeepAlived 实现高可用的WEB群集
一、概述1、keepalived
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现 。
2、Haproxy
HAProxy是高性能的代理服务器,其可以提供7层和4层代理,具有healthcheck,负载均衡等多种特性,性能卓越,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。
KeepAlived是一个高可用方案,通过VIP(即虚拟IP)和心跳检测来实现高可用。其原理是存在一组(两台)服务器,分别赋予Master,Backup两个角色,默认情况下Master会绑定VIP到自己的网卡上,对外提供服务。Master,Backup会在一定的时间间隔向对方发送心跳数据包来检测对方的状态,这个时间间隔一般为2秒钟,如果Backup发现Master宕机,那么Backup会发送ARP包到网关,把VIP绑定到自己的网卡,此时Backup对外提供服务,实现自动化的故障转移,当Master恢复的时候会重新接管服务。
二、实验环境
[*] 实验环境:准备4台服务器,2台haproxy+keepalived服务器,分别作主备。1台动态网站服务器,一台静态网站服务器。
[*] 实验目的:实现外部用户通过vip来访问web服务器,并且能够根据访问内容的不同来实现动静分离,如果前端调度器宕机,可以迅速切换,让从服务器上线接管一切事务,进而不影响用户访问!
服务器IP地址系统版本软件版本前端主调度器 eth0:172.16.8.5
vip:172.16.8.1
Centos6.5 keepalived-1.2.7-3.el6.x86_64
haproxy-1.4.24-2.el6.x86_64
前端备调度器 eth0:172.16.8.8
vip:172.16.8.1
Centos6.5 keepalived-1.2.7-3.el6.x86_64
haproxy-1.4.24-2.el6.x86_64
静态服务器eth0:172.16.8.7Centos6.5httpd动态服务器eth0:172.16.8.9Centos6.5httpd php
[*] 关闭每个服务器的防火墙
//关闭iptables和SELINUX
# service iptables stop
# setenforce 0
# vim /etc/sysconfig/selinux
---------------
SELINUX=disabled
三、haproxy与keepalived的安装配置
1、时间同步:
# ntpdate 172.16.0.1 //172.16.0.1为时间服务器
# ntpdate 172.16.0.1
2、在2台主备服务器上安装keepalived与haproxy
# yum -y install haproxy keepalived
# yum -y install haproxy keepalived
3、keepalived安装配置
3.1、在主调度服务器上配置:
[*] 修改keepalived配置文件
# vim /etc/keepalived/keepalived.conf
//修改如下:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost //配置管理员邮箱
}
notification_email_from kaadmin@localhost //配置发件人
smtp_server 127.0.0.1 //配置邮件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down {
script "[[ -e /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -150 //此脚本的意思是如果在/etc/keepalived/目录下有down文件,则把此主服务器的优先级降低150(可以自行设定),让别的从服务器变成主服务器
}
vrrp_instance VI_1 {
state MASTER //配置模式 master为主服务器
interface eth0
virtual_router_id 51 //虚拟路由id号
priority 220 //优先级,各个节点优先级越高,更加有可能成为主服务器
advert_int 1
authentication {
auth_type PASS //认证方式
auth_pass 1111
}
virtual_ipaddress {
172.16.8.1 //配置虚拟ip,vip
}
track_script {
chk_mantaince_down //检查脚本
}
//当主服务器状态发生变化时,发送变化信息给邮件服务器,可以通过mail命令查看
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
[*] 创建notify.sh脚本
# vim /etc/keepalived/notify.sh
//添加如下内容:
#!/bin/bash
# Author: MageEdu
# description: An example of notify script
#
vip=172.16.8.1
contact='root@localhost'
notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
esac 将此脚本发往从服务器:
# scp /etc/keepalived/notify.sh root@172.16.8.8:/etc/keepalived/
3.2、在从服务器上配置
[*] 修改keepalived配置文件
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_mantaince_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -150
}
vrrp_instance VI_1 {
state BACKUP //修改为BACKUP
interface eth0
virtual_router_id 51
priority 160 //优先级要低于主的
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.8.1
}
track_script {
chk_mantaince_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
3.3、测试
[*] 分别启动主备的keepalived
# service keepalived start
# service keepalived start
[*] 查看ip
http://s3.运维网.com/wyfs02/M02/25/7E/wKiom1Ngw5DTsvZBAAGmYb61Rbg206.jpg
[*] 在主服务器上创建down文件
# touch /etc/keepalived/down
# ip a
# mail http://s3.运维网.com/wyfs02/M00/25/7F/wKioL1NgxI2C8804AAPkOrNEek8075.jpg
http://s3.运维网.com/wyfs02/M01/25/7E/wKiom1NgxUXxxpX6AAavDDwZ2h8863.jpg
3、配置haprox
主从服务器的haproxy配置文件都要一样
# vim /etc/haproxy/haproxy.cfg
//修改如下:
#---------------------------------------------------------------------
# Example configuration for a possible web application.See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events.This is done
# 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//日志输出配置,所有日志都记录在本机,通过local2输出
chroot /var/lib/haproxy//改变当前工作目录,安全模式
pidfile /var/run/haproxy.pid //pid文件
maxconn 4000 //最大连接数
user haproxy //用户
group haproxy //组
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 //配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
mode http //默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK(注,health已经废弃)
log global //采用全局定义的日志
option httplog//日志类别http日志格式
option dontlognull//不记录健康检查的日志信息
option http-server-close //每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8//不记录本机转发的日志
option redispatch //serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries 3 //3次连接失败就认为服务不可用,也可以通过后面设置
timeout http-request 10s//请求超时
timeout queue 1m //队列超时
timeout connect 10s //连接超时
timeout client 1m //客户端连接超时
timeout server 1m //服务器连接超时
timeout http-keep-alive 10s //长连接超时
timeout check 10s //检查超时
maxconn 3000 //最大连接数
listen stats //listen是Frontend和Backend的组合体。这里定义的是haproxy监控!
mode http //模式http
bind *:80 //绑定的监控ip与端口
stats enable //启用监控
stats hide-version //隐藏haproxy版本
stats uri /haproxyadmin?stats//定义的uri
stats realm Haproxy\ Statistics//统计页面密码框上提示文本
stats auth admin:admin //认证
stats admin if TRUE //启用管理界面
frontendhttp //接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。这里定义的是http服务!
bind *:80//绑定的监控ip与端口
mode http //模式http
acl url_static path_beg -i /static /images /javascript /stylesheets //acl后面是规则名称,定义访问控制
acl url_static path_end -i .jpg .gif .png .css .js .html
acl url_dynamic path_end -i .php
use_backend static if url_static//满足url_static这个条件,则启用static的backend
use_backend dynamic if url_dynamic////满足url_dynamic这个条件,则启用dynamic的backend
default_backend dynamic//定义的默认backend
backend static //static的作用域
mode http
balance roundrobin
//banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
optionhttpchk /index.html
//检测文件,如果分发到后台index.html访问不到就不再分发给它
server web1 172.16.8.7:80 check inter 2000 rise 2 fall 3
backend dynamic
mode http
balance roundrobin
optionhttpchk /index.php
server web2172.16.8.9:80 check inter 2000 rise 2 fall 3
3.1、修改日志文件
//修改系统日志的配置文件
# vim /etc/sysconfig/rsyslog
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-c 2 -r"
3.2、增加日志设备
# vim /etc/rsyslog.conf
#增加一行
local2.* /var/log/haproxy.log
3.3、重新启动一下日志服务
# service rsyslog restart
3.4、检查配置文件语法
# haproxy -c -f /etc/haproxy/haproxy.cfg
Configuration file is valid
3.5、将此配置文件发往从服务器:
# scp /etc/haproxy/haproxy.cfg root@172.16.8.8:/etc/haproxy/
4、创建haproxy+keepalived脚本:
此脚本实现当haproxy挂掉后,能再次启动haproxy,若无法再次启动则彻底关闭keepalived将VIP交给
从机处理。
#vim /etc/keepalived/check_haproxy.sh
//添加如下内容
---------------------
#!/bin/bash
while :
do
hapid=`ps -C haproxy --no-header |wc -l`
if [ $hapid -eq 0 ];then
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
sleep 5
if [ $hapid -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
sleep 5
done
--------------------
#chmod 755 /etc/keepalived/check_haproxy.sh
#nohup sh /etc/keepalived/check_haproxy.sh &
把此脚本发往从服务器
# scp /etc/keepalived/check_haproxy.sh root@172.16.8.8:/etc/keepalived/
5、配置动静服务器
[*] 静态服务器(172.16.8.7)
# yum -y install httpd 添加测试页面:
#vim /var/www/html/index.html
//添加如下内容
www.web1.com
[*] 动态服务器(172.16.8.9)
# yum -y install httpd php 添加测试页面:
# vim /var/www/html/index.php
//添加如下内容:
www.web2.com
四、模拟故障测试
//主从服务器都启动keepalived与haproxy
# service keepalived start
# service haproxy start
# service keepalived start
# service haproxy start
//后端服务器启动web
# service httpd start
# service httpd start
[*] 在游览器输入 http://172.16.8.1/haproxyadmin?stats,账户密码都为admin
http://s3.运维网.com/wyfs02/M02/25/81/wKiom1Nh5OGQpeUtAAIEfqxbXgE327.jpg
http://s3.运维网.com/wyfs02/M01/25/82/wKioL1Nh5NGCiVcvAAcrb6b32zw254.jpg
这样我们可以通过这个stats界面来管理后端服务器了!
[*] 动静分离测试
访问静态页面时,跳到web1服务器上(172.16.8.7)
http://s3.运维网.com/wyfs02/M00/25/82/wKioL1Nh5n-iRhEcAACmx-gaXVQ801.jpg
访问动态页面时跳到web2上,(172.16.8.9)
http://s3.运维网.com/wyfs02/M02/25/82/wKiom1Nh5vKQ3sDvAATNRfTWhA8091.jpg
[*] 把主服务器的haproxy服务停止,看是否影响访问!
# service haproxy stop
check_haproxy.sh脚本检测到haproxy服务停止,就把keepalived服务停止,从而vip从主服务器转移到从服务器,用户访问无影响!
http://s3.运维网.com/wyfs02/M01/25/82/wKiom1Nh7XCB-axdAAHFj-DjhGM347.jpg
http://s3.运维网.com/wyfs02/M00/25/82/wKioL1Nh7UayMhovAACmx-gaXVQ954.jpg
至此,基于keepalived与haproxy搭建的高可用web集群已经完成,读者如果有足够多的主机的话,后面动静页面服务器可以有多个,还可以加个缓存服务器,加速用户访问!
页:
[1]