基於HAProxy + KeepAlived 實現高可用的WEB羣集

1、概述javascript

一、keepalived
php

     Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,能夠利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),可是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。Keepalived是VRRP的完美實現 。css


二、Haproxyhtml

      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恢復的時候會從新接管服務。java



2、實驗環境node

  • 實驗環境:準備4臺服務器,2臺haproxy+keepalived服務器,分別做主備。1臺動態網站服務器,一臺靜態網站服務器。linux

  • 實驗目的:實現外部用戶經過vip來訪問web服務器,而且可以根據訪問內容的不一樣來實現動靜分離,若是前端調度器宕機,能夠迅速切換,讓從服務器上線接管一切事務,進而不影響用戶訪問!web

服務器 IP地址 系統版本 軟件版本
前端主調度器

eth0:172.16.8.5redis

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.7 Centos6.5 httpd
動態服務器 eth0:172.16.8.9 Centos6.5 httpd     php


  • 關閉每一個服務器的防火牆

//關閉iptables和SELINUX
# service iptables stop
# setenforce 0
# vim /etc/sysconfig/selinux
---------------
SELINUX=disabled


3、haproxy與keepalived的安裝配置

一、時間同步:

[root@node1 ~]# ntpdate 172.16.0.1   //172.16.0.1爲時間服務器
[root@node2 ~]# ntpdate 172.16.0.1


二、在2臺主備服務器上安裝keepalived與haproxy

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


三、keepalived安裝配置

3.一、在主調度服務器上配置:

  • 修改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.二、在從服務器上配置

  • 修改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.三、測試

  • 分別啓動主備的keepalived

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

wKiom1Ngw5DTsvZBAAGmYb61Rbg206.jpg


  • 在主服務器上建立down文件

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

wKioL1NgxI2C8804AAPkOrNEek8075.jpg


wKiom1NgxUXxxpX6AAavDDwZ2h8863.jpg


三、配置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.一、修改日誌文件

//修改系統日誌的配置文件
[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.二、增長日誌設備

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


3.三、從新啓動一下日誌服務

[root@haproxy ~]# service rsyslog restart


3.四、檢查配置文件語法

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


3.五、將此配置文件發往從服務器:

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


四、建立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/


五、配置動靜服務器

  • 靜態服務器(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();
?>


4、模擬故障測試

//主從服務器都啓動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

wKiom1Nh5OGQpeUtAAIEfqxbXgE327.jpg

wKioL1Nh5NGCiVcvAAcrb6b32zw254.jpg


這樣咱們能夠經過這個stats界面來管理後端服務器了!


  • 動靜分離測試

訪問靜態頁面時,跳到web1服務器上(172.16.8.7)

wKioL1Nh5n-iRhEcAACmx-gaXVQ801.jpg


訪問動態頁面時跳到web2上,(172.16.8.9)

wKiom1Nh5vKQ3sDvAATNRfTWhA8091.jpg


  • 把主服務器的haproxy服務中止,看是否影響訪問!

[root@node1 keepalived]# service haproxy stop


check_haproxy.sh腳本檢測到haproxy服務中止,就把keepalived服務中止,從而vip從主服務器轉移到從服務器,用戶訪問無影響!

wKiom1Nh7XCB-axdAAHFj-DjhGM347.jpg

wKioL1Nh7UayMhovAACmx-gaXVQ954.jpg



    至此,基於keepalived與haproxy搭建的高可用web集羣已經完成,讀者若是有足夠多的主機的話,後面動靜頁面服務器能夠有多個,還能夠加個緩存服務器,加速用戶訪問!

相關文章
相關標籤/搜索