一、概述

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、时间同步:

[root@node1 ~]# ntpdate 172.16.0.1   //172.16.0.1为时间服务器
[root@node2 ~]# ntpdate 172.16.0.1


2、在2台主备服务器上安装keepalived与haproxy

[root@node1 ~]# yum -y install haproxy keepalived
[root@node2 ~]# yum -y install haproxy keepalived


3、keepalived安装配置

3.1、在主调度服务器上配置:

  • 修改keepalived配置文件

[root@node1 ~]# 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脚本

[root@node1 ~]# vim /etc/keepalived/notify.sh
//添加如下内容:
#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# 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

将此脚本发往从服务器:

[root@node1 ~]# 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

[root@node1 ~]# service keepalived start
[root@node2 ~]# service keepalived start
  • 查看ip

基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高


  • 在主服务器上创建down文件

[root@node1 ~]# touch /etc/keepalived/down
[root@node1 ~]# ip a
[root@node1 ~]# mail

基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高_02


基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高_03


3、配置haprox

主从服务器的haproxy配置文件都要一样

[root@node1 ~]# 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        //启用管理界面
frontend  http   //接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。这里定义的是http服务!
    bind *:80  //绑定的监控ip与端口
    mode http   //模式http
    acl url_static       path_beg       -i /static /p_w_picpaths /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等参数
    option  httpchk /index.html
    //检测文件,如果分发到后台index.html访问不到就不再分发给它
    server web1   172.16.8.7:80 check inter 2000 rise 2 fall 3
backend dynamic
     mode http
     balance roundrobin
     option  httpchk /index.php
     server web2  172.16.8.9:80 check inter 2000 rise 2 fall 3


3.1、修改日志文件

//修改系统日志的配置文件
[root@haproxy ~]# 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、增加日志设备

[root@haproxy ~]# vim /etc/rsyslog.conf
#增加一行
local2.*                                                /var/log/haproxy.log


3.3、重新启动一下日志服务

[root@haproxy ~]# service rsyslog restart


3.4、检查配置文件语法

[root@haproxy ~]# haproxy -c -f /etc/haproxy/haproxy.cfg
Configuration file is valid


3.5、将此配置文件发往从服务器:

[root@node1 haproxy]# scp /etc/haproxy/haproxy.cfg root@172.16.8.8:/etc/haproxy/


4、创建haproxy+keepalived脚本:

此脚本实现当haproxy挂掉后,能再次启动haproxy,若无法再次启动则彻底关闭keepalived将VIP交给

从机处理。

[root@node1 ~]#  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
--------------------
[root@node1 ~]#  chmod 755 /etc/keepalived/check_haproxy.sh
[root@node1 ~]#  nohup sh /etc/keepalived/check_haproxy.sh &


把此脚本发往从服务器

[root@node1 ~]# scp /etc/keepalived/check_haproxy.sh root@172.16.8.8:/etc/keepalived/


5、配置动静服务器

  • 静态服务器(172.16.8.7)

[root@master html]# yum -y install httpd

添加测试页面:

#vim /var/www/html/index.html
//添加如下内容
<h1>www.web1.com</h1>


  • 动态服务器(172.16.8.9)

# yum -y install httpd php

添加测试页面:

# vim /var/www/html/index.php
//添加如下内容:
<h1>www.web2.com</h1>
<?php
phpinfo();
?>


四、模拟故障测试

//主从服务器都启动keepalived与haproxy
[root@node1 ~]# service keepalived start
[root@node1 ~]# service haproxy start
[root@node2 ~]# service keepalived start
[root@node2 ~]# service haproxy start
//后端服务器启动web
[root@master ~]# service httpd start
[root@station142 ~]# service httpd start


  • 在游览器输入 http://172.16.8.1/haproxyadmin?stats,账户密码都为admin

基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高_04

基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高_05


这样我们可以通过这个stats界面来管理后端服务器了!


  • 动静分离测试

访问静态页面时,跳到web1服务器上(172.16.8.7)

基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高_06


访问动态页面时跳到web2上,(172.16.8.9)

基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高_07


  • 把主服务器的haproxy服务停止,看是否影响访问!

[root@node1 keepalived]# service haproxy stop


check_haproxy.sh脚本检测到haproxy服务停止,就把keepalived服务停止,从而vip从主服务器转移到从服务器,用户访问无影响!

基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高_08

基于HAProxy + KeepAlived 实现高可用的WEB群集_keepalived haproxy 高_09



    至此,基于keepalived与haproxy搭建的高可用web集群已经完成,读者如果有足够多的主机的话,后面动静页面服务器可以有多个,还可以加个缓存服务器,加速用户访问!