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(<name>) | 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 (<name>):預設為靜态方法, 先對<name>做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 <address> <facility> [<level> [<minlevel>]]</code>
<code># capture request header <HEADER> len <LENGTH></code>
<code># capture resopense header <HEADER> len <LENGTH></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 <aclname> <criterion> [flags] [oprator] <value> </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><h1>node1.linux.com<</code><code>/h1</code><code>></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><h1>node2.linux.com<h1></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 "<h1>node1.test$i</h1>" > 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><h1>node2.linux.com<</code><code>/h1</code><code>></code>
<code><?php</code>
<code> </code><code>phpinfo();</code>
<code>?></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,如需轉載請自行聯系原作者