zzbb 发表于 2018-12-30 10:44:21

基于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]
查看完整版本: 基于HAProxy + KeepAlived 实现高可用的WEB群集