天天看點

Haproxy 基礎詳解及動靜分離配置

 1 工作在ISO 七層 根據http協定(或者工作在ISO四層 根據tcp協定) 提供web服務的負載均衡排程器

<code>負載均衡排程器分類</code>

<code>工作在四層:</code>

<code>#  lvs</code>

<code>工作在七層:</code>

<code>#  nginx   (web,http reverse proxy,cache)</code>

<code>#  haproxy (http reverse proxy,tcp proxy)</code>

<code>#     tcp:  實作MySQL的讀寫中讀的負載均衡</code>

<code>#  ats     (apache traffic  server)</code>

<code>#  perlbal</code>

<code>#  pound</code>

<code>#  squid</code>

<code>#  varnish</code>

<code>  </code><code>以上程式都可以實作服務的向外拓展;</code>

haproxy特性

    haproxy 目前版本為1.3  1.4,下面我們介紹1.4版本的特性

<code># 用戶端側的長連接配接(client-side keep-alive)</code>

<code># TCP加速(TCP speedups)</code>

<code># 響應池(response buffering)</code>

<code># RDP協定</code>

<code># 基于源的粘性(source-based stickiness)</code>

<code># 更好的統計資料接口(a much better stats interfaces)</code>

<code># 更詳細的健康狀态檢測機制(more verbose health checks)</code>

<code># 基于流量的健康評估機制(traffic-based health)</code>

<code># 支援HTTP認證</code>

<code># 伺服器管理指令行接口(server management from the CLI)</code>

<code># 基于ACL的持久性(ACL-based persistence)</code>

<code># 日志分析器</code>

官網站點:haproxy.1wt.eu

haproxy 架構圖

haproxy.cfg 配置檔案詳解

<code> </code><code>安裝  </code>

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

<code> </code><code>配置檔案路徑</code>

<code> </code><code>/etc/haproxy/haproxy</code><code>.cfg</code>

<code>(1)配置由兩部分組成</code>

<code> </code><code>#global settings: 對haproxy程序自身屬性的設定----------全局設定段</code>

<code> </code><code>#proxies: 對代理的設定 -----------------代理設定段</code>

<code>  </code><code>defaults</code>

<code>  </code><code>frontend</code>

<code>  </code><code>backend</code>

<code>  </code><code>listen</code>

<code>  </code><code>其中defaults為proxies提供預設屬性,frontend接受用戶端的請求,backend連接配接後端的上遊伺服器(類似于nginx的upstream),listen是特定的frontend與backend的組合</code>

<code>(2)定義一個完整的代理的方式:</code>

<code>(3)defaults段分析</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             </code> 

<code>#  option   httpclose:使用短連接配接</code>

<code>#  option   redispath:使用cookie保持會話,如果後端的server當機,則使用redispath 重定向另一個路徑繼續保持會話;</code>

<code>#  option   http-server-close  :當keep-alive逾時時,使用該選項在伺服器上關閉會話   </code>

<code>#  timeout  connect  :haproxy轉發到後邊upstream server 時等待的時長</code>

<code>#  timeout  client   :用戶端非活動狀态的逾時時長</code>

<code>#  timeout  server   :  haproxy和後邊的伺服器段保持一個會話,當背景伺服器down掉後,haproxy等待的逾時時間</code>

<code>#  timeout-keep-alive:定義保持連接配接模式的逾時時長      </code>

<code>#  timeout-check     : 建立狀态檢測時間的逾時時間</code>

<code>#  maxconn           :每一個server最大并發連接配接數</code>

負載均衡排程方法

<code>格式:balance  roundrobin| static-rr| leastconn | </code><code>source</code> <code>| uri | uri_param | hdr(&lt;name&gt;) | rdp-cookie(name)</code>

<code>排程方法解析</code>

<code>#roundrobin :屬于權重輪詢 (動态)  支援伺服器活動時修改其權重,伺服器下線後重新上線時支援慢啟動</code>

<code>#static-rr :  屬于權重輪詢(靜态)不支援伺服器活動時修改,需要重新開機服務才能生效</code>

<code>#             老伺服器重新上線上時,立刻會收到大批量的請求</code>

<code>#leastconn :支援動态修改權重,慢啟動</code>

<code>#source    :預設為(靜态)方法,hash/ 源ip 取模算法,支援hash-type調整為動态</code>

<code>#uri       :預設為(靜态)方法,hash/weight 取模算法,支援hash-type來調整</code>

<code>#url-params:預設為(靜态)方法,hash/wgith 算法,支援hash-type調整</code>

<code>#hdr (&lt;name&gt;):預設為靜态方法, 先對&lt;name&gt;做hash計算然後 hash/weight 計算,支援hash-type調整</code>

<code>排程方法的使用總結</code>

<code>#1、排程衆多的MySQL從伺服器,用什麼排程方法?</code>

<code>   </code><code>leastconn</code>

<code>#2、排程web圖檔伺服器組,用什麼排程方法?</code>

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

<code>#3、排程web圖檔伺服器組,用什麼排程方法?</code>

<code>   </code><code>source</code> <code>或者 cookie</code>

<code>#4、排程web緩存伺服器組,用什麼排程方法?</code>

<code>   </code><code>uri</code>

<code>    </code><code>hash</code><code>-</code><code>type</code><code>:</code>

<code>      </code><code>map-based (預設的靜态的</code><code>hash</code><code>表)</code>

<code>      </code><code>consistent(動态的一緻性</code><code>hash</code><code>) ---------在後端的cache伺服器上使用,否則會導緻伺服器的加入或者退出時 伺服器群癱瘓</code>

haproxy 的工作模式 (使用mode參數)

<code>http :http協定  --------haproxy的價值展現于此</code>

<code>#      對應用層資料做深入分析,是以支援7層的過濾、處理、轉換等機制;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              </code> 

<code>tcp  :haproxy在用戶端和upstream server之間建立一個全雙工的連接配接</code>

<code>#      不會對應用層協定做任何檢查</code>

<code>#      SSL 、MySQL、SSL等都應該使用此模式;</code>

<code>#      預設模式!</code>

指定haproxy日志

<code># log global : 使用全局配置中定義的日志伺服器;</code>

<code># log &lt;address&gt; &lt;facility&gt; [&lt;level&gt;  [&lt;minlevel&gt;]]</code>

<code># capture request header &lt;HEADER&gt;  len &lt;LENGTH&gt;</code>

<code># capture resopense header &lt;HEADER&gt;  len &lt;LENGTH&gt;</code>

<code>執行個體:在frontend中定義一個日志</code>

<code>(1)編輯rsyslog.conf</code>

<code>#vim  /etc/rsyslog.conf  在日志伺服器上先定義一個日志</code>

<code> </code><code>local3.*    </code><code>/var/log/hawebsrv</code><code>.log</code>

<code>#service rsyslog restart</code>

<code>(2)編輯haproxy.cfg</code>

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

<code>  </code><code>frontend websrv</code>

<code>  </code><code>log 127.0.0.1 local3</code>

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

<code>  </code><code>default_backend  webservers</code>

<code> </code><code>#serivce  haproxy reload</code>

<code>(3)haproxy伺服器測試</code>

<code>  </code><code>#tail /var/log/hawebsrv.log</code>

haproxy中的ACL

<code>格式:acl &lt;aclname&gt;  &lt;criterion&gt; [flags] [oprator] &lt;value&gt;    </code>

<code>                                                                                                                                                                                                                                                                                                                                                                  </code> 

<code>      </code><code>value:   支援整數或者整數範圍</code>

<code>                </code><code>支援字元串</code>

<code>                </code><code>支援正規表達式</code>

<code>                </code><code>支援ip位址和網絡位址</code>

<code>ACL例子</code>

<code># acl url_static  path_beg  /static /images  /img /css                </code>

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

<code># acl host_www    hdr_beg(host) -i  www         </code>

<code># acl  host_static  hdr_beg(host) -i  img. video. download. ftp.  </code>

<code># use_backend   static  if  host_static  or host_www or url_static</code>

<code># use_backend   www  if  host_www</code>

<code>實作通路控制     </code>

<code>http-request:7層過濾   (借助于定義好的acl實作)</code>

<code>tcp-request: 4層過濾    (借助于定義好的acl實作)</code>

haproxy 動靜分離的實作

 架構圖

 1、 環境配置

<code>haproxy伺服器配置</code>

<code> </code><code>外網網卡</code>

<code># ifconfig eth0 172.16.13.2/16 up</code>

<code># route add default gw 172.16.0.1</code>

<code> </code><code>内網網卡</code>

<code># ifconfig eth1 192.168.20.1/24 up</code>

<code>兩台上遊伺服器配置</code>

<code>server1 配置</code>

<code># ifconfig eth0 192.168.20.11/24</code>

<code># route add default gw 192.168.20.1</code>

<code> </code><code>提供頁面</code>

<code># vim /var/www/html/index.html</code>

<code> </code><code>&lt;h1&gt;node1.linux.com&lt;</code><code>/h1</code><code>&gt;</code>

<code># service httpd start</code>

<code>server2配置</code>

<code># ifconfig eth0 192.168.20.12/24 up</code>

<code># vim  /var/www/html/index.html</code>

<code>  </code><code>&lt;h1&gt;node2.linux.com&lt;h1&gt;</code>

<code># service  httpd start</code>

2、  安裝配置haproxy

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

<code># vim /etc/haproxy/haproxy.cfg  編輯配置檔案自定義一個backend和frontend,注釋原有的内容</code>

<code>frontend  websrv *:80        </code>

<code>  </code><code>default_backend   webservers</code>

<code>backend   webservers</code>

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

<code>  </code><code>server     node1  192.168.20.11:80  check</code>

<code>  </code><code>server     node2   192.168.20.12:80   check</code>

 3、 用戶端測試

此時說明 haproxy伺服器将客戶的請求以roundrobin算法 反向代理給後端的伺服器!

4、啟用全局日志功能

<code>(一)編輯rsyslog.conf</code>

<code>#vim  /etc/rsyslog.conf  開啟如下行</code>

<code># Provides UDP syslog reception</code>

<code>$ModLoad imudp</code>

<code>$UDPServerRun 514</code>

<code># Provides TCP syslog reception</code>

<code>$ModLoad imtcp</code>

<code>$InputTCPServerRun 514</code>

<code>添加日志</code>

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

<code>                                                                                                                                                                                                                                  </code> 

<code>#service rsyslog restart 重新開機服務</code>

<code>(二)編輯haproxy.cfg</code>

<code> </code><code># vim  /etc/haproxy/haproxy.cfg 開啟如下行</code>

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

<code> </code><code># service  haproxy restart  重新開機服務</code>

<code>(三)日志檢視</code>

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

接下來讓我們來拓展haproxy的功能

5 、排程算法 uri的實作

<code>1)後端伺服器 server1 與 server2 同時建立多個頁面</code>

<code>server1</code>

<code>#cd /var/www/html/</code>

<code># for i in {1..10}; do echo "&lt;h1&gt;node1.test$i&lt;/h1&gt;"  &gt;  test$i.html; done</code>

<code>server2 方法同 server1</code>

<code>2)更改haproxy.cfg的配置檔案中的排程算法</code>

<code>  </code><code>balance uri</code>

<code>3)用戶端測試</code>

<code># http://172.16.13.2/test1.html</code>

基于172.16.13.2/test1.html 該uri,haproxy伺服器反向代理至背景伺服器至同一台伺服器server2

  6、基于cookie實作會話綁定

<code>1)編輯haproxy.cfg配置檔案</code>

<code>#vim  /etc/haproxy/haproxy.cfg  内容如下</code>

<code>frontend websrv</code>

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

<code>   </code><code>default_backend  webservers</code>

<code>backend  webservers</code>

<code>   </code><code>cookie node insert nocache</code>

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

<code>   </code><code>server  node1  192.168.20.11:80 check  cookie node1</code>

<code>   </code><code>server  node2  192.168.20.12:80 check  cookie node2</code>

<code>2)用戶端測試</code>

<code>#http://172.16.13.2/test1.html</code>

上圖可見,基于cookie實作了用戶端的請求與後端伺服器server2的會話綁定。

7、haproxy管理界面---stats enable

<code># vim /etc/haproxy/haproxy.cfg 增加一個listen段,如下所示</code>

<code>listen statspage   </code>

<code>bind *:8009    -------偵聽端口   </code>

<code>stats </code><code>enable</code>   <code>-------開啟stats   </code>

<code>stats hide-version -----隐藏版本   </code>

<code>stats auth admin:admin ----登入驗證資訊   </code>

<code>stats admin </code><code>if</code> <code>TRUE    ----實作在管理界面上對所有backend伺服器管理   </code>

<code>stats uri </code><code>/admin</code><code>?stats ----登入的uri路徑</code>

8、haproxy動靜分離的實作

<code>1)server2 伺服器安裝php</code>

<code>#yum -y install php php-mysql</code>

<code>提供php動态頁面</code>

<code>#vim /var/www/html/index.php</code>

<code>&lt;h1&gt;node2.linux.com&lt;</code><code>/h1</code><code>&gt;</code>

<code>&lt;?php</code>

<code>     </code><code>phpinfo();</code>

<code>?&gt;</code>

<code>                                         </code> 

<code>2)重新配置haproxy配置檔案</code>

<code>#vim  /etc/haproxy/haproxy.cfg   定義frontend  和 backend</code>

<code>frontend websrvs</code>

<code>    </code><code>bind *:80</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 .html</code>

<code>    </code><code>acl host_static      hdr_beg(host)  -i img. video. download. </code><code>ftp</code><code>. imags. videos.</code>

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

<code>    </code><code>use_backend static          </code><code>if</code> <code>url_static or host_static</code>

<code>    </code><code>use_backend dynamic         </code><code>if</code> <code>url_php</code>

<code>    </code><code>default_backend             dynamic</code>

<code>         </code><code>backend static</code>

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

<code>    </code><code>server      node1 192.168.20.11:80  check maxconn 30000   </code>

<code>                                                   </code> 

<code>         </code><code>backend dynamic</code>

<code>    </code><code>server  node2 192.168.20.12:80 check maxconn  1000</code>

<code># service haproxy restart</code>

<code>3) 用戶端測試 動靜分離</code>

 如圖所示:靜态頁面由server1伺服器顯示,動态頁面由server2 顯示。  

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