自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HAProxy雙機高可用方案之HAProxy+Keepalived

原創(chuàng)
網(wǎng)絡(luò) 網(wǎng)絡(luò)優(yōu)化 網(wǎng)絡(luò)運維
由于公司的注冊用戶已超過八百萬了,而且每天都有持續(xù)增漲的趨勢,而PV/日已經(jīng)有向千萬靠擾的趨勢;原有的Web架構(gòu)越來越滿足不了我們的需求了,所以我們也考慮上能抗高并發(fā)的HAProxy來作為我們網(wǎng)站的最前端的負載均衡器...

【51CTO.com 獨家特稿】由于公司的注冊用戶已超過八百萬了,而且每天都有持續(xù)增漲的趨勢,而PV/日已經(jīng)有向千萬靠擾的趨勢;原有的Web架構(gòu)越來越滿足不了我們的需求了,所以我們也考慮上能抗高并發(fā)的HAProxy來作為我們網(wǎng)站的最前端的負載均衡器;因為我已經(jīng)在東莞的二個項目上面成功實施了HAProxy+Keepalived雙機方案,所以我在這里也嘗試在公司的網(wǎng)站上這種負載均衡高可用架構(gòu),即HAProxy+Keepalived。

HAProxy+Keepalived配置過程如下:

1. 做好整個環(huán)境的準(zhǔn)備工作。

兩臺服務(wù)器DELL 2950均要做好準(zhǔn)備工作,比如設(shè)置好hosts文件及進行ntpd對時。

網(wǎng)絡(luò)拓樸很簡單,如下所示:

ha1.cn7789.com eth0:203.93.236.145

ha2.cn7789.com eth0:203.93.236.142

網(wǎng)卡用其自帶的千兆網(wǎng)卡均可。

硬盤模式?jīng)]有要求,Raid0或Raid1均可。

網(wǎng)站對外的VIP地址是:203.93.236.149,這是通過Keepalived來實現(xiàn)的,原理請參考前面的章節(jié);同時這也是我們的網(wǎng)站的外網(wǎng)DNS對應(yīng)的IP。

2. HAProxy和Keepalived的安裝過程

關(guān)于此安裝過程,請大家參考前面的內(nèi)容,這里就不重復(fù)了,我們主要是注意關(guān)鍵位置的改動:

(1)首先是要建立HAProxy啟動、重啟、關(guān)閉等狀態(tài)腳本,我這里的HAProxy腳本為/root/haproxy,我們給它執(zhí)行權(quán)限,腳本內(nèi)容如下所示:

  1. #!/bin/sh  
  2. # chkconfig 35 on  
  3. # description: HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments.  
  4.  
  5. # Source function library.  
  6. if [ -f /etc/init.d/functions ]; then  
  7.   . /etc/init.d/functions  
  8. elif [ -f /etc/rc.d/init.d/functions ] ; then  
  9.   . /etc/rc.d/init.d/functions  
  10. else  
  11.   exit 0  
  12. fi  
  13.  
  14. # Source networking configuration.  
  15. . /etc/sysconfig/network  
  16.  
  17. # Check that networking is up.  
  18. [ ${NETWORKING} = "no" ] && exit 0  
  19.  
  20. [ -f /usr/local/haproxy/conf/haproxy.cfg ] || exit 1  
  21.  
  22. RETVAL=0 
  23.  
  24. start() {  
  25.   /usr/local/haproxy/sbin/haproxy -c -q -f /usr/local/haproxy/conf/haproxy.cfg  
  26.   if [ $? -ne 0 ]; then  
  27.     echo "Errors found in configuration file."  
  28.     return 1  
  29.   fi  
  30.  
  31.   echo -n "Starting HAproxy: "  
  32.   daemon /usr/local/haproxy/sbin/haproxy -D -f /usr/local/haproxy/conf/haproxy.cfg -p /var/run/haproxy.pid  
  33.   RETVAL=$?  
  34.   echo  
  35.   [ $RETVAL -eq 0 ] && touch /var/lock/subsys/haproxy  
  36.   return $RETVAL  
  37. }  
  38.  
  39. stop() {  
  40.   echo -n "Shutting down HAproxy: "  
  41.   killproc haproxy -USR1  
  42.   RETVAL=$?  
  43.   echo  
  44.   [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/haproxy  
  45.   [ $RETVAL -eq 0 ] && rm -f /var/run/haproxy.pid  
  46.   return $RETVAL  
  47. }  
  48.  
  49. restart() {  
  50.   /usr/local/haproxy/sbin/haproxy -c -q -f /usr/local/haproxy/conf/haproxy.cfg  
  51.   if [ $? -ne 0 ]; then  
  52.     echo "Errors found in configuration file, check it with 'haproxy check'."  
  53.     return 1  
  54.   fi  
  55.   stop  
  56.   start  
  57. }  
  58.  
  59. check() {  
  60.   /usr/local/haproxy/sbin/haproxy -c -q -V -f /usr/local/haproxy/conf/haproxy.cfg  
  61. }  
  62.  
  63. rhstatus() {  
  64.   status haproxy  
  65. }  
  66.  
  67. condrestart() {  
  68.   [ -e /var/lock/subsys/haproxy ] && restart || :  
  69. }  
  70.  
  71. # See how we were called.  
  72. case "$1" in  
  73.   start)  
  74.     start  
  75.     ;;  
  76.   stop)  
  77.     stop  
  78.     ;;  
  79.   restart)  
  80.     restart  
  81.     ;;  
  82.   reload)  
  83.     restart  
  84.     ;;  
  85.   condrestart)  
  86.     condrestart  
  87.     ;;  
  88.   status)  
  89.     rhstatus  
  90.  ;;  
  91.   check)  
  92.     check  
  93.     ;;  
  94.   *)  
  95.     echo $"Usage: haproxy {start|stop|restart|reload|condrestart|status|check}"  
  96.     RETVAL=1 
  97. esac  
  98.  
  99. exit $RETVAL 

#p#

(2)/usr/local/haproxy/conf/haproxy.cfg文件的內(nèi)容如下所示(兩臺HAProxy機器的配置內(nèi)容一樣):

  1. global  
  2.         log 127.0.0.1   local0  
  3.         maxconn 65535  
  4.         chroot /usr/local/haproxy  
  5.         uid 99   
  6.         gid 99  
  7.         daemon  
  8.         nbproc 8  
  9.         pidfile /usr/local/haproxy/haproxy.pid  
  10.         debug  
  11.  
  12. defaults    
  13.          log     127.0.0.1       local3    
  14.          mode   http    
  15.          option httplog    
  16.          option httpclose    
  17.          option dontlognull    
  18.          option forwardfor    
  19.          option redispatch    
  20.          retries 2    
  21.          maxconn 2000    
  22.          stats   uri     /haproxy-stats    
  23.          contimeout      5000    
  24.          clitimeout      50000    
  25.          srvtimeout      50000    
  26.  
  27. frontend www.1paituan.com  
  28.          bind *:80  
  29.          mode http   
  30.          option httplog  
  31.          log global   
  32.          default_backend phppool   
  33.  
  34. backend phppool  
  35.         balance source    
  36.         option httpchk HEAD /index.jsp HTTP/1.0  
  37.         server web1  203.93.236.147:80 weight 5  check inter 2000 rise 2 fall 3   
  38.      server  web2  203.93.236.146:80 weight 3  check inter 2000 rise 2 fall 3 

配置文件建議寫成這種frontend(前臺)和backend(后臺)的形式,方便我們根據(jù)需求也可以利用HAProxy的正則做成動靜分離或根據(jù)特定的文件名后綴(比如.php或.jsp)訪問指定的phppool池或javapool池(Nginx也能實現(xiàn)此項功能),我們還可以指定靜態(tài)服務(wù)器池,讓客戶端對靜態(tài)文件(比如bmp或jsp或html)訪問我們的Nginx靜態(tài)服務(wù)器,所以前后臺的模型也是非常有用的,不喜歡frontend(前臺)和backend(后臺)的朋友可以對比下以前沒有采用這種模式的配置文件,內(nèi)容如下:

  1. global  
  2.         log 127.0.0.1   local0  
  3.         maxconn 65535  
  4.         chroot /usr/local/haproxy  
  5.         uid 99  
  6.         gid 99  
  7.         daemon  
  8.         nbproc 8  
  9.         pidfile /usr/local/haproxy/haproxy.pid  
  10.         debug  
  11.  
  12. defaults  
  13.          log     127.0.0.1       local3  
  14.          mode   http  
  15.          option httplog  
  16.          option httpclose  
  17.          option dontlognull  
  18.          option forwardfor  
  19.          option redispatch  
  20.          retries 2  
  21.          maxconn 2000  
  22.          balance source  
  23.          stats   uri     /haproxy-stats  
  24.          contimeout      5000  
  25.          clitimeout      50000  
  26.          srvtimeout      50000  
  27.  
  28. listen  www.1paituan.com  
  29.         bind *:80  
  30.         mode http  
  31.         option httplog  
  32.         log global  
  33.         option httpchk HEAD /index.jsp HTTP/1.0  
  34.         server web1  203.93.236.147:80 weight 5  check inter 2000 rise 2 fall 3  
  35.         server web2  203.93.236.146:80 weight 3  check inter 2000 rise 2 fall 3 

HAProxy的正則功能雖然沒Nginx強大靈活,但也是非常有用的;大家可以參考下面的文檔來熟悉下HAProxy的正則寫法,這些對于我們以后的工作幫助還是很大的,內(nèi)容如下:

####################acl策略定義#########################
#如果請求的域名滿足正則表達式返回true -i是忽略大小寫
acl denali_policy hdr_reg(host) -i ^(
www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
#如果請求域名滿足trade.gemini.taobao.net 返回 true -i是忽略大小寫
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
#在請求url中包含sip_apiname=,則此控制策略返回true,否則為false
acl invalid_req url_sub -i sip_apiname=
#在請求url中存在timetask作為部分地址路徑,則此控制策略返回true,否則返回false
acl timetask_req url_dir -i timetask
#當(dāng)請求的header中Content-length等于0時返回 true
acl missing_cl hdr_cnt(Content-length) eq 0
######################acl策略匹配相應(yīng)###################
#當(dāng)請求中header中Content-length等于0 阻止請求返回403
block if missing_cl
#block表示阻止請求,返回403錯誤,當(dāng)前表示如果不滿足策略invalid_req,或者滿足策略timetask_req,則阻止請求。
block if !invalid_req || timetask_req
#當(dāng)滿足denali_policy的策略時使用denali_server的backend
use_backend denali_server if denali_policy
#當(dāng)滿足tm_policy的策略時使用tm_server的backend
use_backend tm_server if tm_policy
#reqisetbe關(guān)鍵字定義,根據(jù)定義的關(guān)鍵字選擇backend
reqisetbe ^Host:\ img dynamic
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic
reqisetbe ^[^\ ]*\ /admin/stats stats
#以上都不滿足的時候使用默認(rèn)mms_server的backend
default_backend mms_server
Keepalived的配置過程比較簡單,這里略過,大家可以參考我們前面的配置,配置成功后我們可以分別在二臺機器上啟動HAProxy及Keepalived服務(wù)(建議在Screen模式下開啟HAProxy服務(wù),不熟悉Sreen用法的朋友建議熟悉下)。

#p#

3.替HAProxy添加日志支持

我們編輯/etc/syslog.conf文件, 添加內(nèi)容如下:

local3.*        /var/log/haproxy.log 
local0.*        /var/log/haproxy.log

我們編輯/etc/sysconfig/syslog文件,修改內(nèi)容如下:

SYSLOGD_OPTIONS="-r -m 0" 

然后重啟syslog服務(wù),命令如下:

service syslog restart

4.驗證此架構(gòu)及注意事項

我們可以關(guān)閉主HAProxy機器或重新啟動,看在此過程中,VIP地址有沒有正確的轉(zhuǎn)移到從HAProxy機器上,影響我們訪問網(wǎng)站沒,以上步驟我自己測試過多次,而且線上環(huán)境的穩(wěn)定運行,證明HAProxy+Keeaplived雙機方案確實是有效的。

關(guān)于HAProxy+Heartbeat這種負載均衡高可用架構(gòu),有些情況我也跟大家說明一下:

◆在此HAProxy+Keepalivp負載均衡高可用架構(gòu)中,我們是如何解決session的問題呢?我們這里采用的是它自身的balance source機制,它跟Nginx的ip_hash機制原理類似,是讓客戶機訪問時始終訪問后端的某一臺真實的web服務(wù)器,這樣讓session就固定下來了;

◆option httpchk HEAD /index.jsp HTTP/1.0 是網(wǎng)頁監(jiān)控,如果HAProxy檢測不到Web的根目錄下沒有index.jsp,就會產(chǎn)生503報錯。

◆有網(wǎng)友配置HAProxy時喜歡用listen 203.93.236.141:80這樣的格式,這樣其實不好,做負載均衡高可用時由于從機分配不到VIP地址,會導(dǎo)致從機啟動不了,我建議用bind *:80的方式代替。

◆HAProxy的并發(fā)監(jiān)控暫時沒有Nginx中的相關(guān)模塊,但可以考慮用SHELL命令或自行開發(fā)PHP或JSP程序來監(jiān)控。

5.HAProxy的監(jiān)控頁面

我們可以在地址欄輸入http://www.1paituan.com/haproxy-stats/,顯示界面如下(HAProxy自帶的監(jiān)控頁面,也是我非常喜歡的功能之一):
 

作者介紹:

余洪春(撫琴煮酒·微博),《構(gòu)建高可用Linux服務(wù)器》一書作者,一拍網(wǎng)系統(tǒng)架構(gòu)師、資深項目管理工程師,ChinaUnix集群和高可用版版主。

【51CTO.com獨家特稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載!合作媒體轉(zhuǎn)載請注明原文出處及出處!】

責(zé)任編輯:佟健 來源: 51CTO.com
相關(guān)推薦

2011-09-30 13:02:10

51CTO博客一周熱門Web架構(gòu)

2018-08-24 08:51:10

haproxykeepalived均衡器

2023-10-13 18:57:22

2020-10-28 11:20:18

RabbitMQHAProxy運維

2011-09-22 10:48:20

MySQL集群HAProxy

2015-10-21 12:58:58

keepalived集群Linux

2022-07-22 20:00:01

高可用路由

2024-05-21 13:03:45

2023-11-09 07:58:50

2023-05-15 08:20:56

2019-12-24 14:28:00

KeepalivedNginxTomcat

2012-02-15 00:15:48

2019-09-03 10:19:58

Kubernetes本地負載命令

2025-03-31 10:40:52

2010-05-05 22:58:46

2024-01-31 09:11:16

HaproxyHttpTCP

2012-05-07 10:17:48

2011-12-02 10:10:34

RedisFailover

2012-02-15 23:09:16

haproxyserver

2010-12-08 08:57:11

keepalivedMySQL-HA
點贊
收藏

51CTO技術(shù)棧公眾號