Haproxy負載平衡+Keepalived高可用web群集

來源:互聯網
上載者:User

標籤:serve   over   echo   pch   source   gnu   密碼   alt   叢集   

一、HAProxy1.haproxy簡介
  • HAProxy 是一款提供高可用性、負載平衡以及基於TCP(第四層)和HTTP(第七層)應用的代理軟體,支援虛擬機器主機,它是免費、快速並且可靠的一種解決方案。

  • HAProxy是一個使用C語言編寫的自由及開放原始碼軟體

  • HAProxy特別適用於那些負載特大的web網站,這些網站通常又需要會話保持或七層處理。HAProxy運行在當前的硬體上,完全可以支援數以萬計的並發串連。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web伺服器不被暴露到網路上。

  • HAProxy實現了一種事件驅動, 單一進程模型,此模型支援非常大的並發串連數。多進程或多執行緒模式受記憶體限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千並發串連。事件驅動模型因為在有更好的資源和時間管理的使用者空間(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程式通常擴充性較差。這就是為什麼他們必須進行最佳化以 使每個CPU時間片(Cycle)做更多的工作。

  • HAProxy 支援串連拒絕 : 因為維護一個串連的開啟的開銷是很低的,有時我們很需要限制×××蠕蟲(attack bots),也就是說限制它們的串連開啟從而限制它們的危害。 這個已經為一個陷於小型DDoS×××的網站開發了而且已經拯救

  • HAProxy 支援全透明代理(已具備硬體防火牆的典型特點): 可以用用戶端IP地址或者任何其他地址來串連後端伺服器. 這個特性僅在Linux 2.4/2.6核心打了cttproxy補丁後才可以使用. 這個特性也使得為某特殊伺服器處理部分流量同時又不修改伺服器的地址成為可能。

  • 包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在內的知名網站,及亞馬遜網路服務系統都使用了HAProxy。

  • Haproxy是目前比較流行的一種叢集調度工具,同類叢集調度工具有很多,如LVS和Nginx,相比較而言,LVS效能最好,但是搭建相對複雜,Nginx的upstream模組支援叢集功能,但是對叢集節點健全狀態檢查功能不強,效能沒有Haproxy好。

缺點:只能支援TCP和HTTP的軟體

Haproxy官網:http://www.haproxy.org/

2.負載平衡常用調度演算法

LVS、Haproxy、Nginx最常用的調度演算法有三種,如下所述

  • RR(Round Robin)。RR演算法是最簡單最常用的一種演算法,即輪詢調度。例如,有三個節點A、B、C,第一個使用者訪問會被指派到節點A,第二個使用者訪問會被指派到節點B,第三個使用者訪問會被指派到節點C,第四個使用者訪問繼續指派到節點A,輪詢分配訪問請求實現負載平衡效果。此演算法還有一種加權輪詢,即根據每個節點的權重輪詢分配訪問請求

  • LC(Least Connections)。LC演算法即最小串連數演算法,根據後端的節點串連數大小動態分配前端請求。例如,有三個節點A、B、C,各節點的串連數分別為A:4、B:5、C:6,此時如果有第一個使用者串連請求,會被指派到A上,串連數變為A:5、B:5、C:6 ;第二個使用者請求會繼續分配給A上,串連數變為A:6、B:5、C:6 ;再有新的請求會配置給B,每次將新的請求指派給串連數最小的節點伺服器。由於實際情況下A、B、C的串連數會動態釋放,很難出現一樣串連數的情況,因此此演算法相比較RR演算法有很大改進,是目前用到比較多的一種演算法

  • SH(Source Hashing)。SH即基於來源訪問調度演算法,此演算法用於一些有Session會話記錄在伺服器端的情境,可以基於來源的IP、Cookie等做叢集調度。例如,使用基於源IP的叢集調度演算法,有三個節點A、B、C,第一個使用者第一次訪問被指派到A,第二個使用者第一次訪問被指派到了B,當第一個使用者第二次訪問時會被繼續指派到A,第二個使用者第二次訪問時依舊會被指派到B,只要負載調度器不重啟,第一個使用者訪問都會被指派到A,第二個使用者訪問都會被指派到B,實現叢集的調度。此調度演算法好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量超大,影響業務使用
3.Haproxy的日誌
  • Haproxy的日誌預設是輸出到系統的syslog中,查看起來不是非常方便,為了更好地管理Haproxy的日誌,我們在生產環境中一般單獨定義出來,定義的方法如下所述

  • 修改Haproxy設定檔中關於日誌配置的選項,修改為下面的配置
    log  /dev/log    local0  infolog  /dev/log    local0  notice

    這兩行配置是將原本的log 127.0.0.1配置項修改,主要是將Haproxy的info及notice日誌分別記錄到不同的記錄檔中
    然後重啟Haproxy,完成Haproxy配置

  • 修改rsyslog配置
    為了便於管理,將Haproxy下相關的配置獨立定義到haproxy.conf,並放到/etc/rsyslog.d/下,rsyslog啟動時會自動載入此目錄下的所有設定檔
    [[email protected] ~]# touch /etc/rsyslog.d/haproxy.conf[[email protected] ~]# vim /etc/rsyslog.d/haproxy.conf

加入下面的內容:

if ($programname == ‘haproxy‘ and $syslogseverity-text == ‘info‘) then -/var/log/haproxy/haproxy-info.log& ~if ($programname == ‘haproxy‘ and $syslogseverity-text == ‘notice‘) then -/var/log/haproxy/haproxy-notice.log& ~

這部分配置是將Haproxy的info日誌記錄到/var/log/haproxy/haproxy-info.log下,將notice日誌記錄到/var/log/haproxy/haproxy-notice.log下,其中“& ~”表示當日誌寫入到記錄檔後,rsyslog停止處理這個資訊。這裡配置的文法是使用rainerscript指令碼語言寫的

  • 當然也可用用另一種解決方式,修改/etc/rsyslog.conf設定檔,在設定檔中加入如下兩行:
    local0.info                                             /var/log/haproxy-info.loglocal0.notice                                           /var/log/haproxy-notice.log

    這樣也可以實現上面相同的效果

  • 測試日誌資訊
    在用戶端訪問http://192.168.1.10/test.html後,可以使用tail -f /var/log/haproxy/haproxy-info.log即時查看Haproxy的訪問請求日誌資訊
    [[email protected] ~]# tail -f /var/log/haproxy/haproxy-info.log Sep  9 22:30:05 localhost haproxy[2634]: 192.168.1.30:1165 [09/Sep/2015:22:30:02.202] webcluster webcluster/inst2 0/0/0/1/3255 200 256 - - CD-- 0/0/0/0/0 0/0 "GET /test.html HTTP/1.1"
4.Haproxy的參數最佳化

關於Haproxy的參數最佳化,以下列舉了幾個關鍵的參數,並對各參數的生產環境的最佳化建議做了說明

參數 參數說明 最佳化建議
maxconn 最大串連數 此參數根據應用的實際情況進行調整,推薦使用10 240
daemon 守護進程模式 Haproxy可以使用非守護進程模式啟動,生產環境建議使用守護模式啟動
nbproc 負載平衡的並發進程數 建議與當前伺服器CPU核心數相等或為其2倍
retries 重試次數 此參數主要用於對叢集節點的檢查,如果節點多,且並發量大,設定為2次或3次;在伺服器節點不多的情況下,可以設定為5次或6次
option http-server-close 主動關閉http請求選項 建議在生產環境中使用此選項,避免由於timeout時間設定過長導致http串連堆積
timeout http-keep-alive 長連線逾時時間 此選項設定長連線逾時時間,具體參考應用自身特點設定,可以設定為10s
timeout http-request http請求逾時時間 建議此時間設定為5~10s,增加http串連釋放速度
timeout client 用戶端逾時時間 如果訪問量過大,節點響應慢,可以將此時間設定短一些,建議設定為1min左右就可以了
二、haproxy+keepalived部署環境

五台伺服器,兩台Web、兩台Haproxy,都將網卡設定為vmnet1;剩餘一台為網關,需兩塊網卡,第一塊vmnnet1、第二塊橋接

HOST OS IP Package
web01 Centos6.7_64 192.168.1.30 httpd
web02 Centos6.7_64 192.168.1.40 httpd
Haproxy+Keepalived-1 Centos6.7_64 192.168.1.10 haproxy、keepalived
Haproxy+Keepalived-2 Centos6.7_64 192.168.1.20 haproxy、keepalived
Gateway Centos6.7_64 192.168.1.1 iptables
部署Web-1

1.配置IP地址

vim /etc/sysconfig/network-scrips/ifcfg-eth0DEVICE=eth0TYPE=EthernetONBOOT=yesNM_CONTROLLED=noBOOTPROTO=staticIPADDR=192.168.1.30NETMASK=255.255.255.0GATEWAY=192.168.1.1
/etc/init.d/network restart

2.配置安裝YUM

rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo[local]name=localbaseurl=file:///mntgpgcheck=0

3.部署httpd

yum -y install httpd && echo "This is Web1" >/var/www/html/index.html
/etc/init.d/httpd start && chkconfig --level 35 httpd on
部署Web-2

1.配置IP地址

vim /etc/sysconfig/network-scrips/ifcfg-eth0DEVICE=eth0TYPE=EthernetONBOOT=yesNM_CONTROLLED=noBOOTPROTO=staticIPADDR=192.168.1.40NETMASK=255.255.255.0GATEWAY=192.168.1.1
/etc/init.d/network restart

2.配置安裝YUM

rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo[local]name=localbaseurl=file:///mntgpgcheck=0
mount /dev/cdrom /mnt

3.部署httpd

yum -y install httpd && echo "This is Web2" >/var/www/html/index.html
/etc/init.d/httpd start && chkconfig --level 35 httpd on
部署Haproxy+Keepalived-1

1.配置IP

vim /etc/sysconfig/network-scrips/ifcfg-eth0DEVICE=eth0TYPE=EthernetONBOOT=yesNM_CONTROLLED=noBOOTPROTO=staticIPADDR=192.168.1.10NETMASK=255.255.255.0GATEWAY=192.168.1.1
/etc/init.d/network restart

2.配置YUM並安裝依賴包

rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo[local]name=localbaseurl=file:///mntgpgcheck=0
mount /dev/cdrom /mnt
yum -y install kernel-devel openssl-devel popt-devel  pcre-devel bzip2-devel

3.安裝keepalived

tar zxvf keepalived-1.2.2.tar.gz -C /usr/src/
cd /usr/src/keepalived-1.2.2/
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
make && make install
chkconfig --add keepalived && chkconfig --level 35 keepalived on

4.編輯HA設定檔

vim /etc/keepalived/keepalived.confglobal_defs {    router_id HA_TEST_R1    ##本伺服器的名稱}vrrp_instance VI_1 {        ##定義VRRP熱備執行個體    state MASTER        ##MASTER表示主伺服器    interface eth0      ##承載VIP地址的物理介面    virtual_router_id 1     ##虛擬路由器的ID號    priority 100        ##優先順序,數值越大優先順序越高    advert_int 1        ##通告間隔秒數(心跳頻率)    authentication {        ##認證資訊        auth_type PASS      ##認證類型        auth_pass 123456    ##密碼字串    }    virtual_ipaddress {  192.168.1.254     ##指定漂移地址(VIP)    }}

5.編譯安裝Haproxy

tar zxvf haproxy-1.4.24.tar.gz -C /usr/src/
cd /usr/src/haproxy-1.4.24/
make TARGET=linux26                         //linux26代表為kernel2.6的版本(uname -r)
make install

6.編輯Haproxy設定檔

mkdir /etc/haproxy    //建立軟體設定檔目錄
cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy    //將haproxy.cfg檔案複製到設定檔目錄

Haproxy設定檔通常分為三個部分,即global、defaults和listen。global為全域配置、defaults為預設配置、listen為應用組件配置

vim /etc/haproxy/haproxy.cfg#\ this config needs haproxy-1.1.28 or haproxy-1.2.1global    log 127.0.0.1   local0          //全域日誌配置,並指定記錄記錄層級    log 127.0.0.1   local1 notice    //notice為記錄層級,通常有24個層級    #log loghost    local0 info    maxconn 4096                //最大串連數    uid 99                  //運行使用者,預設nobody    gid 99                  //運行組,預設nobody    daemon                  //以守護進程方式運行haproxy    #debug    #quietdefaults    log global              //應用全域日誌配置    mode    http                //預設的模式{tcp|http|health}    option  httplog             //啟用日誌記錄HTTP請求    option  dontlognull         //啟動該項,日誌將不會記錄空串連    retries 3               //串連後端伺服器的失敗重連次數    maxconn 2000                //每個進程可用的最大串連數    contimeout  5000            //連線逾時時間    clitimeout      50000           //用戶端逾時時間    srvtimeout  50000           //伺服器逾時時間listen  webcluster 192.168.1.254:80    option httpchk GET /index.html    //檢查伺服器的index.html檔案    balance roundrobin          //制定負載平衡演算法    server  inst1 192.168.1.30:80 check inter 2000 fall 3       //定義後端伺服器的IP    server  inst2 192.168.1.40:80 check inter 2000 fall 3

7.啟動Haproxy服務

cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
mkdir /usr/share/haproxy
/etc/init.d/keepalived start
/etc/init.d/haproxy start
chkconfig --level 35 haproxy on
部署Haproxy+Keepalived-2

1.配置IP

vim /etc/sysconfig/network-scrips/ifcfg-eth0DEVICE=eth0TYPE=EthernetONBOOT=yesNM_CONTROLLED=noBOOTPROTO=staticIPADDR=192.168.1.20NETMASK=255.255.255.0GATEWAY=192.168.1.1
/etc/init.d/network restart

2.配置YUM並安裝依賴包

rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo[local]name=localbaseurl=file:///mntgpgcheck=0
mount /dev/cdrom /mnt
yum -y install kernel-devel openssl-devel popt-devel  pcre-devel bzip2-devel

3.安裝keepalived

tar zxvf keepalived-1.2.2.tar.gz -C /usr/src/
cd /usr/src/keepalived-1.2.2/
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/
make &&make install
chkconfig --add keepalived && chkconfig --level 35 keepalived on

4.編輯HA設定檔

scp [email protected]:/etc/keepalived/keepalived.cfg /etc/keepalived/
vim /etc/keepalived/keepalived.confglobal_defs {    router_id HA_TEST_R2    ##本伺服器的名稱}vrrp_instance VI_1 {        ##定義VRRP熱備執行個體    state BACKUP        ##MASTER表示主伺服器    priority 10         ##優先順序,數值越大優先順序越高

5.編譯安裝Haproxy

tar zxvf haproxy-1.4.24.tar.gz -C /usr/src/
cd /usr/src/haproxy-1.4.24/
make TARGET=linux26
make install

6.編輯Haproxy設定檔

mkdir /etc/haproxy/
scp [email protected]:/etc/haproxy/haproxy.conf /etc/haproxy/

7.編寫shell指令碼

cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
mkdir /usr/share/haproxy && chkconfig --level 35 haproxy on
vim /root/haproxy.sh#!/bin/bashA=$(netstat -utpln | grep 80 | wc -l)/sbin/ip a | /bin/grep 192.168.1.254 &>/dev/nullif [ $? -eq 0 ] && [ $A -eq 0 ]then  /etc/init.d/haproxy restart  echo "Haproxy啟動中"else  /etc/init.d/haproxy stopfi
chmod +x /root/haproxy.sh
crontab -e  */1 * * * *  /root/haproxy.sh
scp /root/haproxy.sh [email protected]:/root
chmod +x /root/haproxy.sh (第一個調度器,192.168.1.10)
crontab -e  */1 * * * *  /root/haproxy.sh (第一個調度器,192.168.1.10)
Gateway

充當路由器角色

1.配置IP

vim /etc/sysconfig/network-scrips/ifcfg-eth0DEVICE=eth0TYPE=EthernetONBOOT=yesNM_CONTROLLED=noBOOTPROTO=staticIPADDR=192.168.1.1NETMASK=255.255.255.0
cp /etc/sysconfig/network-scrips/ifcfg-eth0 /etc/sysconfig/network-scrips/ifcfg-eth1
vim /etc/sysconfig/network-scrips/ifcfg-eth1DEVICE=eth0TYPE=EthernetONBOOT=yesNM_CONTROLLED=noBOOTPROTO=dhcp
/etc/init.d/network restart

2.開啟路由轉寄

vim /etc/sysctl.conf 7 net.ipv4.ip_forward = 1
sysctl -p

3.編寫防火牆規則

/etc/init.d/iptables stop
iptables -t nat -I PREROUTING -d 192.168.10.139 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.254:80
/etc/init.d/iptables save && chkconfig --level 35 iptables on

4.訪問測試

IE → 192.168.10.139

可以測試調度器的高可用和web群集的負載平衡

參考的網址:
http://blog.51cto.com/painting/1693259
http://www.ttlsa.com/linux/haproxy-study-tutorial/
https://baike.baidu.com/item/haproxy/5825820

Haproxy負載平衡+Keepalived高可用web群集

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.