天天看點

Haproxy的負載均衡、動靜分離、狀态監控、近期網絡架構

一、Haproxy的簡介

    Haproxy的官網站點:http://haproxy.com/

    HAProxy提供高可用性、負載均衡以及基于TCP和HTTP應用的代 理,支援虛拟主機,它是免費、快速并且可靠的一種解決方案。HAProxy特别适用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運作在目前的硬體上,完全可以支援數以萬計的并發連接配接。并且它的運作模式使得它可以很簡單安全的整合進您目前的架構中, 同時可以保護你的web伺服器不被暴露到網絡上。

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

                                                                                       摘自[百度百科]

二、Haproxy的工作模式

<a href="http://s3.51cto.com/wyfs02/M00/53/C8/wKioL1RwGirTYixDAAENO0C4xYo238.jpg" target="_blank"></a>

大緻的意思就是:可以分為兩部分,

第一部分是網際網路,包括網際網路上衆多的路由裝置、Firewall等;

第二部分是本地的網絡架構,包括Firewall,proxy、Web server,Database等

Haproxy的注釋Local balanceer in proxy mode -- 工作在代理模下是一個負載均衡的功能

通過Haproxy代理後端的Web server群集,如果需要與資料庫互動,有Web server與Database建立連接配接。

三、Haproxy的安裝和配置說明

CentOS 6.4系統中yum源提供的Haproxy的版本為1.5.2,在這裡我們直接用yum安裝

1、安裝haproxy

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<code># yum -y install haproxy</code>

<code># rpm -ql haproxy                    #可以檢視yum安裝Haproxy生成了哪些檔案</code>

<code>/etc/haproxy</code>

<code>/etc/haproxy/haproxy</code><code>.cfg            </code><code>#haproxy的配置檔案</code>

<code>/etc/logrotate</code><code>.d</code><code>/haproxy</code>

<code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/haproxy</code>            <code>#haproxy的服務腳本檔案</code>

<code>/usr/bin/halog</code>                     

<code>/usr/bin/iprange</code>

<code>/usr/sbin/haproxy</code>

<code>/usr/share/doc/haproxy-1</code><code>.5.2</code>

<code>/usr/share/doc/haproxy-1</code><code>.5.2</code><code>/acl-content-sw</code><code>.cfg</code>

<code>/usr/share/doc/haproxy-1</code><code>.5.2</code><code>/acl</code><code>.fig</code>

<code>/usr/share/doc/haproxy-1</code><code>.5.2</code><code>/haproxy</code><code>.cfg</code>

<code>/usr/share/doc/haproxy-1</code><code>.5.2</code><code>/internals</code>

<code>/usr/share/haproxy</code>

<code>/usr/share/haproxy/400</code><code>.http         </code><code>#400錯誤的狀态碼頁面</code>

<code>/usr/share/haproxy/403</code><code>.http         </code><code>#403錯誤的狀态碼頁面</code>

<code>/usr/share/haproxy/408</code><code>.http         </code><code>#408錯誤的狀态碼頁面</code>

<code>/usr/share/haproxy/500</code><code>.http         </code><code>#500錯誤的狀态碼頁面</code>

<code>/usr/share/haproxy/502</code><code>.http         </code><code>#502錯誤的狀态碼頁面</code>

<code>/usr/share/haproxy/503</code><code>.http         </code><code>#503錯誤的狀态碼頁面</code>

<code>/usr/share/haproxy/504</code><code>.http         </code><code>#504錯誤的狀态碼頁面</code>

<code>/usr/share/man/man1/halog</code><code>.1.gz      </code><code>#可以直接使用man halog檢視指令的使用文法</code>

<code>/usr/share/man/man1/haproxy</code><code>.1.gz    </code><code>#可以直接使用man haproxy檢視指令的使用文法</code>

<code>/var/lib/haproxy</code>

<code>.....</code>

2、haproxy的配置檔案說明

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

<code># cd /etc/haproxy/</code>

<code># cp haproxy.cfg haproxy.cfg.bak</code>

<code># vim haproxy.cfg</code>

<code>**********************************************************************</code>

<code>#---------------------------------------------------------------------</code>

<code># Example configuration for a possible web application.  See the</code>

<code># full configuration options online.</code>

<code>#</code>

<code>#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt</code>

<code># Global settings    </code>

<code>global    </code><code>#全局配置檔案</code>

<code>    </code><code># to have these messages end up in /var/log/haproxy.log you will</code>

<code>    </code><code># need to:     #配置日志</code>

<code>    </code><code>#</code>

<code>    </code><code># 1) configure syslog to accept network log events.  This is done</code>

<code>    </code><code>#    by adding the '-r' option to the SYSLOGD_OPTIONS in</code>

<code>    </code><code>#    /etc/sysconfig/syslog    #修改syslog配置檔案</code>

<code>    </code><code># 2) configure local2 events to go to the /var/log/haproxy.log</code>

<code>    </code><code>#   file. A line like the following can be added to</code>

<code>    </code><code>#   /etc/sysconfig/syslog    #定義日志裝置</code>

<code>    </code><code>#    local2.*                       /var/log/haproxy.log</code>

<code>    </code><code>log         127.0.0.1 local2        </code><code>#日志配置,所有的日志都記錄本地,通過local2輸出</code>

<code>    </code><code>chroot      </code><code>/var/lib/haproxy</code>        <code>#改變haproxy的工作目錄</code>

<code>    </code><code>pidfile     </code><code>/var/run/haproxy</code><code>.pid    </code><code>#指定pid檔案的路徑</code>

<code>    </code><code>maxconn     4000                    </code><code>#最大連接配接數的設定</code>

<code>    </code><code>user        haproxy                 </code><code>#指定運作服務的使用者</code>

<code>    </code><code>group       haproxy                 </code><code>#指定運作服務的使用者組</code>

<code>    </code><code>daemon</code>

<code>    </code><code># turn on stats unix socket</code>

<code>    </code><code>stats socket </code><code>/var/lib/haproxy/stats</code>

<code># common defaults that all the 'listen' and 'backend' sections will</code>

<code># use if not designated in their block</code>

<code>defaults</code>

<code>    </code> 

<code>    </code><code>mode                    http                  </code><code>#預設使用協定,可以為{http|tcp|health} http:是七層協定 tcp:是四層 health:隻傳回OK</code>

<code>    </code><code>log                     global                </code><code>#全局日志記錄</code>

<code>    </code><code>option                  httplog               </code><code>#詳細記錄http日志</code>

<code>    </code><code>option                  dontlognull           </code><code>#不記錄空日志</code>

<code>    </code><code>option http-server-close                      </code><code>#啟用http-server-close</code>

<code>    </code><code>option forwardfor       except 127.0.0.0</code><code>/8</code>    <code>#來自這些資訊的都不forwardfor</code>

<code>    </code><code>option                  redispatch            </code><code>#重新分發,ServerID對應的伺服器當機後,強制定向到其他運作正常的伺服器</code>

<code>    </code><code>retries                 3                      </code><code>#3次連接配接失敗則認為服務不可用</code>

<code>    </code><code>timeout http-request    10s                    </code><code>#預設http請求逾時時間</code>

<code>    </code><code>timeout queue           1m                     </code><code>#預設隊列逾時時間</code>

<code>    </code><code>timeout connect         10s                    </code><code>#預設連接配接逾時時間</code>

<code>    </code><code>timeout client          1m                     </code><code>#預設用戶端逾時時間</code>

<code>    </code><code>timeout server          1m                     </code><code>#預設伺服器逾時時間</code>

<code>    </code><code>timeout http-keep-alive 10s                    </code><code>#預設持久連接配接逾時時間</code>

<code>    </code><code>timeout check           10s                    </code><code>#預設檢查時間間隔</code>

<code>    </code><code>maxconn                 3000                   </code><code>#最大連接配接數</code>

<code># main frontend which proxys to the backends</code>

<code>frontend  main *:5000</code>

<code>    </code><code>#定義ACL規則以如".html"結尾的檔案;-i:忽略大小寫</code>

<code>    </code><code>acl url_static       path_beg       -i </code><code>/static</code> <code>/images</code> <code>/javascript</code> <code>/stylesheets</code>

<code>    </code><code>acl url_static       path_end       -i .jpg .gif .png .css .js</code>

<code>    </code><code>use_backend static          </code><code>if</code> <code>url_static    </code><code>#調用後端伺服器并檢查ACL規則是否被比對</code>

<code>    </code><code>default_backend             app              </code><code>#用戶端通路時預設調用後端伺服器位址池</code>

<code># static backend for serving up images, stylesheets and such</code>

<code>backend static                    </code><code>#定義後端伺服器</code>

<code>    </code><code>balance     roundrobin        </code><code>#定義算法;基于權重進行輪詢</code>

<code>    </code><code>server      static 127.0.0.1:4331 check    check:啟動對後端server的健康狀态檢測</code>

<code># round robin balancing between the various backends</code>

<code>backend app</code>

<code>    </code><code>balance     roundrobin</code>

<code>    </code><code>server  app1 127.0.0.1:5001 check</code>

<code>    </code><code>server  app2 127.0.0.1:5002 check</code>

<code>    </code><code>server  app3 127.0.0.1:5003 check</code>

<code>    </code><code>server  app4 127.0.0.1:5004 check</code>

3、haproxy的指令詳解

<code># haproxy -h</code>

<code>HA-Proxy version 1.5.2 2014</code><code>/07/12</code>

<code>Copyright 2000-2014 Willy Tarreau &lt;[email protected]&gt;</code>

<code>Usage : haproxy [-f &lt;cfgfile&gt;]* [ -vdVD ] [ -n &lt;maxconn&gt; ] [ -N &lt;maxpconn&gt; ]</code>

<code>        </code><code>[ -p &lt;pidfile&gt; ] [ -m &lt;max megs&gt; ] [ -C &lt;</code><code>dir</code><code>&gt; ]</code>

<code>        </code><code>-</code><code>v</code> <code>displays version ; -vv shows known build options.</code>

<code>        </code><code>-d enters debug mode ; -db only disables background mode.</code>

<code>        </code><code>-dM[&lt;byte&gt;] poisons memory with &lt;byte&gt; (defaults to 0x50)</code>

<code>        </code><code>-V enters verbose mode (disables quiet mode)</code>

<code>        </code><code>-D goes daemon ; -C changes to &lt;</code><code>dir</code><code>&gt; before loading files.</code>

<code>        </code><code>-q quiet mode : don't display messages</code>

<code>        </code><code>-c check mode : only check config files and </code><code>exit</code>

<code>        </code><code>-n sets the maximum total </code><code># of connections (2000)</code>

<code>        </code><code>-m limits the usable amount of memory (</code><code>in</code> <code>MB)</code>

<code>        </code><code>-N sets the default, per-proxy maximum </code><code># of connections (2000)</code>

<code>        </code><code>-L </code><code>set</code> <code>local</code> <code>peer name (default to </code><code>hostname</code><code>)</code>

<code>        </code><code>-p writes pids of all children to this </code><code>file</code>

<code>        </code><code>-de disables epoll() usage even when available</code>

<code>        </code><code>-dp disables poll() usage even when available</code>

<code>        </code><code>-dS disables splice usage (broken on old kernels)</code>

<code>        </code><code>-dV disables SSL verify on servers side</code>

<code>        </code><code>-sf</code><code>/-st</code> <code>[pid ]* finishes</code><code>/terminates</code> <code>old pids. Must be last arguments.</code>

4、配置Haproxy的日志

<code>預設情況下,Haproxy沒有啟用日志檔案,但是我們可以根據haproxy的配置檔案做修改。</code>

<code>(1)修改系統日志的配置檔案</code>

<code># vim /etc/sysconfig/rsyslog</code>

<code>SYSLOGD_OPTIONS=</code><code>"-c 2 -r"</code>

<code>(2)增加日志裝置</code>

<code># vim /etc/rsyslog.conf </code>

<code>local2.*                                                </code><code>/var/log/haproxy</code><code>.log</code>

<code>(3)重新開機一下日志服務</code>

<code># /etc/init.d/rsyslog restart</code>

<code>關閉系統日志記錄器:                                       [确定]</code>

<code>啟動系統日志記錄器:                                       [确定]</code>

<code>(4)檢視日志記錄資訊</code>

<code># tail -f /var/log/haproxy.log</code>

四、Haproxy負載均衡web

1、一個配置示例:

Haproxy-Server:192.168.0.105

Apache1-Client:192.168.0.102

Apache2-Client:192.168.0.106

<code># Global settings</code>

<code>global</code>

<code>    </code><code># need to:</code>

<code>    </code><code>#    /etc/sysconfig/syslog</code>

<code>    </code><code>#   /etc/sysconfig/syslog</code>

<code>    </code><code>log         127.0.0.1 local2</code>

<code>    </code><code>chroot      </code><code>/var/lib/haproxy</code>

<code>    </code><code>pidfile     </code><code>/var/run/haproxy</code><code>.pid</code>

<code>    </code><code>maxconn     4000</code>

<code>    </code><code>user        haproxy</code>

<code>    </code><code>group       haproxy</code>

<code>    </code><code>mode                    http</code>

<code>    </code><code>log                     global</code>

<code>    </code><code>option                  httplog</code>

<code>    </code><code>option                  dontlognull</code>

<code>    </code><code>option http-server-close</code>

<code>    </code><code>option forwardfor       except 127.0.0.0</code><code>/8</code>

<code>    </code><code>option                  redispatch</code>

<code>    </code><code>retries                 3</code>

<code>    </code><code>timeout http-request    10s</code>

<code>    </code><code>timeout queue           1m</code>

<code>    </code><code>timeout connect         10s</code>

<code>    </code><code>timeout client          1m</code>

<code>    </code><code>timeout server          1m</code>

<code>    </code><code>timeout http-keep-alive 10s</code>

<code>    </code><code>timeout check           10s</code>

<code>    </code><code>maxconn                 30000</code>

<code>listen stats</code>

<code>    </code><code>mode http</code>

<code>    </code><code>bind 0.0.0.0:1080</code>

<code>    </code><code>stats </code><code>enable</code>

<code>    </code><code>stats hide-version</code>

<code>    </code><code>stats uri     </code><code>/haproxyadmin</code><code>?stats</code>

<code>    </code><code>stats realm   Haproxy\ Statistics</code>

<code>    </code><code>stats auth    admin:123456</code>

<code>    </code><code>stats admin </code><code>if</code> <code>TRUE</code>

<code>frontend http-</code><code>in</code>

<code>    </code><code>bind *:80</code>

<code>    </code><code>log global</code>

<code>    </code><code>option httpclose</code>

<code>    </code><code>option logasap</code>

<code>    </code><code>option dontlognull</code>

<code>    </code><code>capture request  header Host len 20</code>

<code>    </code><code>capture request  header Referer len 60</code>

<code>    </code><code>default_backend servers</code>

<code>frontend healthcheck</code>

<code>    </code><code>bind :1099</code>

<code>    </code><code>option forwardfor</code>

<code>backend servers</code>

<code>    </code><code>balance roundrobin</code>

<code>    </code><code>server websrv1 192.168.0.102:80 check maxconn 2000</code>

<code>    </code><code>server websrv2 192.168.0.106:80 check maxconn 2000</code>

2、啟動Haproxy服務

<code># service haproxy start</code>

<code>正在啟動 haproxy:                                         [确定]</code>

3、浏覽器通路

單獨通路Apache1:192.168.0.102

<a href="http://s3.51cto.com/wyfs02/M00/53/CA/wKioL1RwMNjRicJhAADYLGQ6DcA929.jpg" target="_blank"></a>

單獨通路Apache2:192.168.0.106

<a href="http://s3.51cto.com/wyfs02/M00/53/CC/wKiom1RwMF2wp7cVAADauWnSFrk034.jpg" target="_blank"></a>

多次重新整理通路Haproxy:192.168.0.105

多次重新整理Haproxy的website,會切換到後端不同的webserver主機上。

<a href="http://s3.51cto.com/wyfs02/M01/53/CA/wKioL1RwMNiQBz_SAADWTNm43hg230.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/53/CC/wKiom1RwMF2DCah8AADjp38HsUI779.jpg" target="_blank"></a>

五、Haproxy的狀态監控

1、Haproxy的監控頁面

<code>listen stats                            </code><code>#關聯前端和後端定義一個完整的代理</code>

<code>    </code><code>mode http                           </code><code>#設定代理協定</code>

<code>    </code><code>bind 0.0.0.0:1080                   </code><code>#綁定相應的端口</code>

<code>    </code><code>stats </code><code>enable</code>                        <code>#開啟Haproxy統計狀态</code>

<code>    </code><code>stats refresh 3s             </code><code>#統計頁面自動重新整理時間間隔</code>

<code>    </code><code>stats hide-version                  </code><code>#隐藏代理伺服器版本</code>

<code>    </code><code>stats uri     </code><code>/haproxyadmin</code><code>?stats   </code><code>#通路的url</code>

<code>    </code><code>stats realm   Haproxy\ Statistics   </code><code>#統計頁面認證時提示内容資訊</code>

<code>    </code><code>stats auth    admin:123456          </code><code>#設定登入使用者和密碼     </code>

<code>    </code><code>stats admin </code><code>if</code> <code>TRUE                 </code><code>#如果認證通過,則就可以打開stats</code>

2、通路監控頁面

(1)登陸監控頁面

admin/123456

<a href="http://s3.51cto.com/wyfs02/M02/53/CA/wKioL1RwM3eilyGVAAFLazQ1qcw644.jpg" target="_blank"></a>

(2)檢視監控頁面

<a href="http://s3.51cto.com/wyfs02/M02/53/CA/wKioL1RwNAHiKSM3AAk3jcCY9WM150.jpg" target="_blank"></a>

(3)模拟一下故障

<code># service httpd stop</code>

<code>停止 httpd:                                               [确定]</code>

(4)在次檢視監控頁面

<a href="http://s3.51cto.com/wyfs02/M02/53/CC/wKiom1RwNFDy-iQ0AAJkwsA7ySE639.jpg" target="_blank"></a>

六、Haproxy的動靜分離

注釋說明:

在這裡說明動靜分離的示範流程,後端分别三台負載均衡主機上放上同樣的頁面,靜态頁面index.html,動态頁面a.php;然後通路haproxy主機的靜态頁面和動态頁面,來判斷通路的是那台主機

1、動靜分離的主機配置設定

Haproxy:192.168.0.105 proxy

Apache1:192.168.0.102 static

Apache2:192.168.0.106 static

Nginx01:192.168.0.107 dynamic

2、浏覽器分别通路各個主機

<a href="http://s3.51cto.com/wyfs02/M00/53/CA/wKioL1RwPmfzyADHAADlewFBd-U290.jpg" target="_blank"></a>

Apache1:192.168.0.102 dynamic

<a href="http://s3.51cto.com/wyfs02/M00/53/CC/wKiom1RwPezDweGEAAI6yhvw3ks953.jpg" target="_blank"></a>

Apache1:192.168.0.106 static

<a href="http://s3.51cto.com/wyfs02/M01/53/CA/wKioL1RwPmejLKdTAAD9CAERs3o326.jpg" target="_blank"></a>

Apache1:192.168.0.106 dynamic

<a href="http://s3.51cto.com/wyfs02/M01/53/CC/wKiom1RwPezRRj0AAAFMOcYx8w0873.jpg" target="_blank"></a>

Nginx01:192.168.0.107 static

<a href="http://s3.51cto.com/wyfs02/M02/53/CA/wKioL1RwPmiwb7H-AAHHny5ngjA254.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/53/CC/wKiom1RwPezgaVq_AAKd8OyTKFs632.jpg" target="_blank"></a>

3、haproxy動靜分離的配置

<code>    </code><code>acl url_static  path_end -i .html .jpg .gif</code>

<code>    </code><code>acl url_dynamic path_end -i .php</code>

<code>    </code><code>use_backend lnmmp </code><code>if</code> <code>url_dynamic</code>

<code>    </code><code>server websrv1 192.168.0.102:80 check rise 2 fall 1 weight 2 maxconn 2000</code>

<code>    </code><code>server websrv2 192.168.0.106:80 check rise 2 fall 1 weight 2 maxconn 2000</code>

<code>backend lnmmp</code>

<code>    </code><code>balance </code><code>source</code>

<code>    </code><code>server websrv3 192.168.0.107:80 check rise 2 fall 1 maxconn 2000</code>

4、動靜分離通路測試

<a href="http://s3.51cto.com/wyfs02/M00/53/CB/wKioL1RwP5WDSfjjAAD4W8GHZqY597.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/53/CD/wKiom1RwPxqgc-ybAAD-q3Vo2Lg725.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/53/CB/wKioL1RwP5WD-NZPAAJ87xn_AF0588.jpg" target="_blank"></a>

七、近期網絡架構

<a href="http://s3.51cto.com/wyfs02/M01/53/CB/wKioL1RwS_Ky77adAAYSgiqjz2Y603.jpg" target="_blank"></a>

期望網友能夠指點架構的優缺點,後期将會釋出此博文

     本文轉自zys467754239 51CTO部落格,原文連結:http://blog.51cto.com/467754239/1581237,如需轉載請自行聯系原作者

繼續閱讀