高性能業務架構解決方案(HAproxy+Keepalived)

高性能業務架構解決方案(HAproxy+Keepalived)

1、 概況javascript

    1.1 應用場景php

    1.2 LVS/Nginx/HAProxy特色css

2、 相關理論html

    2.1 Keepalived工做原理前端

    2.2 HAproxy工做原理java

3、 架構拓撲linux

4、 資源規劃nginx

5、 實施部署web

    5.1初始化配置redis

    5.2 HAproxy配置

    5.3 Keepalived部署

        5.3.1 Keepalived的安裝

        5.3.2 配置keepalived

        5.3.3 檢測腳本

    5.4 後端WEB服務器

    5.5 測試

        5.5.1 負載均衡測試與動靜分類

        5.5.2 高可用測試

6、 注意事項

    6.1 安裝注意事項

    6.2 將相關開機自啓服務

 

1、概況

1.1 應用場景

Nginx/LVS/HAProxy的基於Linux開源免費的負載均衡軟件。對於大型的,須要進行高併發的網站或者對網絡不太嚴格的場景,可使用Nginx;對於大型的Web服務器的時候可使用Haproxy;對性能有嚴格要求的時候可使用LVS,就單純從負載均衡的角度來講,LVS也許會成爲主流,更適合如今大型的互聯網公司。本文采用HAproxy+keepalived雙主方案來解決業務架構高可用。

1.2 LVS/Nginx/HAProxy特色

名稱

特色

LVS

1) 抗負載能力強、是工做在網絡4層之上僅做分發之用,沒有流量的產生,這個特色也決定了它在負載均衡軟件裏的性能最強的;

2) 配置性比較低,這是一個缺點也是一個優勢,由於沒有可太多配置的東西,因此並不須要太多接觸,大大減小了人爲出錯的概率;

3) 工做穩定,自身有完整的雙機熱備方案,如LVS+KeepalivedLVS+Heartbeat,不過咱們在項目實施中用得最多的仍是LVS/DR+Keepalived

4) 無流量,保證了均衡器IO的性能不會收到大流量的影響;

5) 應用範圍比較廣,能夠對全部應用作負載均衡;

6) 軟件自己不支持正則處理,不能作動靜分離,這個就比較遺憾了;其實如今許多網站在這方面都有較強的需求,這個是Nginx/HAProxy+Keepalived的優點所在。

7) 若是是網站應用比較龐大的話,實施LVS/DR+Keepalived起來就比較複雜了,特別後面有Windows Server應用的機器的話,若是實施及配置還有維護過程就比較複雜了

Nginx

1) 工做在網絡的7層之上,能夠針對http應用作一些分流的策略,好比針對域名、目錄結構,它的正則規則比HAProxy更爲強大和靈活,這也是許多朋友喜歡它的緣由之一;

2) Nginx對網絡的依賴很是小,理論上能ping通就就能進行負載功能,這個也是它的優點所在;

3) Nginx安裝和配置比較簡單,測試起來比較方便;

4) 也能夠承擔高的負載壓力且穩定,通常能支撐超過幾萬次的併發量;

5) Nginx能夠經過端口檢測到服務器內部的故障,好比根據服務器處理網頁返回的狀態碼、超時等等,而且會把返回錯誤的請求從新提交到另外一個節點,不過其中缺點就是不支持url來檢測;

6) Nginx僅能支持httpEmail,這樣就在適用範圍上面小不少,這個它的弱勢;

7) Nginx不只僅是一款優秀的負載均衡器/反向代理軟件,它同時也是功能強大的Web應用服務器。LNMP如今也是很是流行的web架構,大有和之前最流行的LAMP架構分庭抗爭之勢,在高流量的環境中也有很好的效果。

8) Nginx如今做爲Web反向加速緩存愈來愈成熟了,不少朋友都已在生產環境下投入生產了,並且反映效果不錯,速度比傳統的Squid服務器更快,有興趣的朋友能夠考慮用其做爲反向代理加速器。

HAProxy

1) 支持兩種代理模式:TCP(四層)和HTTP(七層)HAProxy是支持虛擬主機

2) 可以補充Nginx的一些缺點好比Session的保持,Cookie的引導等工做

3) 支持url檢測後端的服務器出問題的檢測會有很好的幫助。

4) 它跟LVS同樣,自己僅僅就只是一款負載均衡軟件;單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。

5) HAProxy能夠對Mysql讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,不過在後端的MySQL slaves數量超過10臺時性能不如LVS,因此我向你們推薦LVS+Keepalived

6) HAProxy的算法如今也愈來愈多了,算法特別靈活

2、相關理論

2.1 Keepalived工做原理

keepalived:顧名思義是保持存活,經常使用來搭建設備的高可用,防止業務核心設備出現單點故障。keepalived基於VRRP協議來實現高可用主要用做realserver的健康檢查以及負載均衡主機和backup主機之間的故障漂移。若是將TCP/IP劃分爲5Keepalived就是一個相似於3~5層交換機制的軟件,具備3~5層交換功能,其主要做用是檢測web服務器的狀態,若是某臺web服務器故障,Keepalived將檢測到並將其從系統中剔除,當該web服務器工做正常後Keepalived自動將其加入到服務器羣中,這些工做所有自動完成,而不須要人工干預,只須要人工修復故障的web服務器便可。

層機理是發送ICMP數據包即PING給某臺服務器,若是不,則認爲其故障,並從服務器羣中剔除層機理是檢測TCP端口號狀態來判斷某臺服務器是否故障,若是檢測端口存在異常,則從服務器羣中剔除層機理是根據用戶的設定檢查某個服務器應用程序是否正常運行,若是不正常,則從服務器羣中剔除。

2.2 HAproxy工做原理

反向代理服務器,支持雙機熱備支持虛擬主機,但其配置簡單,擁有很是不錯的服務器健康檢查功能,當其代理的後端服務器出現故障, HAProxy會自動將該服務器摘除,故障恢復後再自動將該服務器加入

3、架構拓撲

wKiom1ij5hGQI0f7AAD1cvhiYEk727.png

4、資源規劃

主機名稱

內網IP

操做系統

HAproxy-1

10.10.10.2

Centos 6.5 64

HAproxy-2

10.10.10.3

Centos 6.5 64

WEB01static

10.10.10.11

Centos 6.5 64

WEB02static

10.10.10.12

Centos 6.5 64

WEB03dynamic

10.10.10.13

Centos 6.5 64

WEB04dynamic

10.10.10.14

Centos 6.5 64

VIP1

10.10.10.100

\

VIP1

10.10.10.101

\


5、實施部署

5.1初始化配置

getenforce 0關閉SeLinux

修改主機名

防火牆開放22/80端口

測試網絡連通性

更新YUM

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
yum makecache                               #生成緩存

5.2HAproxy配置

masterbackup上面同時配置

安裝可採用yum直接安裝,或下載tar包編譯安裝。

兩臺前端HAproxy配置同樣

vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http                  #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch # 當使用了cookie時,haproxy將會將其請求的後端服務器的serverID插入到
 cookie中,以保證會話的SESSION持久性;而此時,若是後端的服務器宕掉
了, 可是客戶端的cookie是不會刷新的,若是設置此參數,將會將客戶的請求強制定向到另一個後端server上,以保證服務的正常。
    retries                 3                     # 定義鏈接後端服務器的失敗重連次數
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s                   #鏈接超時
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s                   #設置http-keep-alive的超時時間
    timeout check           10s                   #檢測超時時間
    stats  uri  /stats                            #haproxy 狀態頁面
    stats auth admin:admin                        #haproxy登錄驗證用戶名密碼
    maxconn                 3000
    frontend  proxy *:80                          #監聽地址爲80
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js .html    #定義靜態訪問規則
    acl dynamic_content  path_end      -i .php    #定義動態訪問規則
    use_backend static          if url_static
    default_backend             dynamic
    backend static
    balance     roundrobin
    server     web01 10.10.10.11:80  check inter 2000 fall 3 weight 30     #後端靜態web
    server     web02 10.10.10.12:80  check inter 2000 fall 3 weight 30     #每隔2000ms檢查服務器80端口狀態,連續失敗次數3次,權重30
    backend dynamic                                #定義一個名爲dynamic後端部分
    balance     roundrobin                         #負載均衡算法
    server     web03 10.10.10.13:80  check inter 2000 fall 3 weight 30     #後端動態web
    server      web04 10.10.10.14:80  check inter 2000 fall 3 weight 30

重啓haproxy服務

訪問測試,驗證輸入admin/admin

 

wKiom1ilU8vxbvQ8AAHnP6QOIrM129.png

wKioL1ilU8zxoB0rAAE8MhmSqY8619.png

5.3 Keepalived部署

5.3.1 Keepalived的安裝

masterbackup上面均須要配置

yum groupinstall "Development tools" -y                           #安裝開發組環境工具
yum install openssl-devel popt-devel -y                           #安裝相應軟件包
ln -s /usr/src/kernels/2.6.32-642.1.1.el6.x86_64 /usr/src/linux   #此處要根據實際操做系統最高版本的kernel 爲準
若是/usr/src/kernels/下面沒文件使用yum 安裝 kernel-devel
#下載keepalive
wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz
tar zxvf keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
./configure --with-kernel-dir=/usr/src/kernels/2.6.32-642.1.1.el6.x86_64

(注意這個步驟要看到如下字樣纔是正常的)

Use IPVS Framework : Yes

IPVS sync daemon support : Yes

make && make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/sbin/keepalived /usr/sbin/
chkconfig --add keepalived
chkconfig --level 2345 keepalived on
/etc/init.d/keepalived start

至此keepalive就已經安裝完畢。

5.3.2 配置keepalived

編輯HAproxy-A  keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
        xuel@51idc.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 10.10.10.2
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_script chk_haproxy {
        script "killall -0 haproxy"              #服務探測,返回0說明服務是正常的
        interval 1                               #每隔1秒探測一次
        weight 2                                 #haproxy上線,權重加2;下線,權重減2
}
 
vrrp_instance VI_1 {                             #雙主實例1
    state MASTER                                 #HA-A(10.10.10.2)爲主,HA-B(10.10.10.3)爲備
    interface eth1                               #VIP配置網卡接口
    virtual_router_id 51                         #實例1的VRID爲51
    priority 100                                 #主(10.10.10.2)的優先級爲100,從的(10.10.10.3)優先級爲99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.10.100/24 dev eth1                 #實例1的VIP
    }
        track_interface {
                eth1
        }
 
track_script {                                   #腳本追蹤
        chk_haproxy
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}
 
vrrp_instance VI_2 {                             #雙主實例2
    state BACKUP                                 #HA-A(10.10.10.2)爲主,HA-B(10.10.10.3)爲備
    interface eth1
    virtual_router_id 52                         #實例1的VRID爲51
    garp_master_delay 1
    priority 99                                  #備(10.10.10.2)的優先級爲99,主的(10.10.10.3)優先級爲100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.10.101/24 dev eth1                 #實例2的VIP
    }
    track_interface {
        eth1
    }
    track_script {                               #腳本追蹤
        chk_haproxy
    }
}

5.3.3 檢測腳本

cd /etc/keepalived
vim notify.sh
#!/bin/bash
vip=10.10.10.100
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
        /etc/rc.d/init.d/haproxy start
        exit 0
    ;;
    backup)
#        notify backup
        /etc/rc.d/init.d/haproxy stop
        exit 0
    ;;
    fault)
#        notify fault
        /etc/rc.d/init.d/haproxy stop
        exit 0
    ;;
    *)
        echo 'Usage: `basename $0` {master|backup|fault}'
        exit 1
    ;;
esac
chmod +x /etc/keepalived/notify.sh

配置HAproxy-Bkeepalived

編輯HAproxy-B  keepalived.conf

! Configuration File for keepalived
global_defs {
   notification_email {
        xuel@51idc.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 10.10.10.2
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_script chk_haproxy {
        script "killall -0 haproxy"        #服務探測,返回0說明服務是正常的
        interval 1                  #每隔1秒探測一次
        weight 2                   #haproxy上線,權重加2;下線,權重減2
}
 
vrrp_instance VI_1 {                    #雙主實例1
    state BACKUP                     #HA-A(10.10.10.2)爲備,HA-B(10.10.10.3)爲主
    interface eth1                    #VIP配置接口
    virtual_router_id 51                 #實例1的VRID爲51
    priority 99                     #主(10.10.10.2)的優先級爲100,從的(10.10.10.3)優先級爲99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.10.100/24 dev eth1          #實例1的VIP
    }
        track_interface {
                eth1             #VIP網卡接口
        }
 
track_script {                        #腳本追蹤
        chk_haproxy
    }
 
}
 
vrrp_instance VI_2 {                    #實例2的VIP
    state MASTER                     #HA-A(10.10.10.2)爲備,HA-B(10.10.10.3)爲主
    interface eth
    virtual_router_id 52                 #實例2的VRID爲52
    garp_master_delay 1
    priority 100                     #備(10.10.10.2)的優先級爲99,主的(10.10.10.3)優先級爲100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.10.101/24 dev eth1
    }
    track_interface {
        eth1
    }
    track_script {                    #腳本追蹤
        chk_haproxy
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

腳本文件與HA-A一樣配置,腳本內容相同。

5.4 後端WEB服務器

安裝開發組環境工具與相關軟件包

yum install -y pcre-devel openssl-devel
yum groupinstall "Development tools"
wget  http://nginx.org/download/nginx-1.11.5.tar.gz
tar zxvf nginx-1.11.5.tar.gz
cd nginx-1.11.5
./configure  
make && make install
/usr/local/nginx/sbin/nginx             #啓動nginx

WEB01/WEB02爲靜態web

WEB01寫入網頁文件

echo 「This is web01-10.10.10.11 static test page!」>>/usr/local/nginx/html/index.html

WEB02寫入網頁文件

echo 「This is web02-10.10.10.12 static test page!」>>/usr/local/nginx/html/index.html

WEB03/WEB04爲動態web,須要配置php

yum remove php*        
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
yum install php70w*
/etc/init.d/php-fpm start                #啓動php

WEB03寫入網頁文件

echo 「<?php
echo "This is web03-10.10.10.13 dynamic test page.";
phpinfo();
?>」>>/usr/local/nginx/html/index.php

WEB04寫入網頁文件

echo 「<?php
echo "This is web03-10.10.10.14 dynamic test page.";
phpinfo();
?>」>>/usr/local/nginx/html/index.html

WEB03/WEB04配置nginx加入php支持

vim /usr/local/nginx/conf/nginx.conf
啓用php註釋
 location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }
注意/usr/local/nginx/html爲nginx網頁文件存放路徑,根據實際狀況修改
/usr/local/nginx/sbin/nginx -s reload             #重啓nginx

查看結果

wKioL1ilVwizGe2lAADpulpnlbk949.png

wKiom1ilVwmiufrdAADMzg7ZFCo933.png

wKioL1ilVwqypVHWAADTGrYWrns820.png

wKiom1ilVwridrp3AAEsuNxt8FY664.png

5.5 測試

5.5.1 負載均衡測試與動靜分類

單獨VIP10.10.10.100,默認訪問的後端動態web服務器,刷新瀏覽器,能夠看到在後端WEB03/WEB04直接來回切換。

wKioL1ilVz6SfnMCAADTGrYWrns312.png

wKiom1ilVz-DZ7X4AAEsuNxt8FY027.png

指定訪問靜態頁面,在WEB01/WEB02來回切換

wKiom1ilV8yDsyU4AADpulpnlbk251.png

wKioL1ilV8zQm3fNAADMzg7ZFCo115.png

訪問VIP10.10.10.101

wKioL1ilWACixkYVAADpulpnlbk569.png

wKiom1ilWADApHCjAADMzg7ZFCo850.png

wKioL1ilWAGj7lesAADTGrYWrns676.png

wKiom1ilWALiVuklAAEsuNxt8FY720.png

5.5.2 高可用測試

查看HAproxy-AVIP

wKioL1ilWO6AcsRNAAOdHmWpUlg117.png查看HAproxy-BVIP

wKioL1ilWQKAuP7-AAOhvWB5APY507.png中止HAproxy-A服務器之上的haproxy服務或中止服務器,測試VIP是否漂移到HAproxy-B

wKiom1ilWYTyCBRgAAPFFUycBfs721.png此時VIP已經漂移到HAproxy-B上面wKioL1ilWZ2SW-u_AAPUg74DZOs501.png

後端web已經正常對外提供服務。

wKiom1ilWcXC2clhAADpulpnlbk495.png

wKioL1ilWcXjKAMwAADMzg7ZFCo986.png

wKioL1ilWcbQ2WIEAADTGrYWrns951.png

wKiom1ilWcexQCZLAAEsuNxt8FY987.png

啓動HAproxy之上的haproxyVIP已經成功切回。

wKiom1ilWk-gAMwXAALbgZR7sno417.png

6、注意事項

6.1 安裝注意事項

ln -s /usr/src/kernels/2.6.32-642.1.1.el6.x86_64 /usr/src/linux   #此處要根據實際操做系統最高版本的kernel 爲準
./configure --with-kernel-dir=/usr/src/kernels/2.6.32-642.1.1.el6.x86_64

6.2 將相關開機自啓服務

開機自啓服務

chkconfig haproxy on
chkconfig keepalived on

haproxy 內部的狀態頁面與驗證

stats  uri  /stats   #haproxy 狀態頁面

stats auth admin:admin   #haproxy登錄驗證用戶名密碼

相關文章
相關標籤/搜索