介紹
HAProxy是高性能的代理伺服器,其可以提供7層和4層代理,具有healthcheck,負載均衡等多種特性,性能卓越,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名網際網路公司在使用。
KeepAlived是一個高可用方案,通過VIP(即虛拟IP)和心跳檢測來實作高可用。其原理是存在一組(兩台)伺服器,分别賦予Master,Backup兩個角色,預設情況下Master會綁定VIP到自己的網卡上,對外提供服務。Master,Backup會在一定的時間間隔向對方發送心跳資料包來檢測對方的狀态,這個時間間隔一般為2秒鐘,如果Backup發現Master當機,那麼Backup會發送ARP包到網關,把VIP綁定到自己的網卡,此時Backup對外提供服務,實作自動化的故障轉移,當Master恢複的時候會重新接管服務。
我們的keepalived主主的應用場景:因為我們需要同時為主域名和圖檔伺服器域名同時提供分發請求,是以用到了Haproxy+keepalived主主模式。
預設情況下,第一台負載均衡器主要分發www.baison.com.cn的請求,第二台負載均衡器主要分發img.baison.com.cn的請求。任意一台當機都不會影響網站分發。這樣不會導緻伺服器浪費。
<a target="_blank" href="http://blog.51cto.com/attachment/201307/180551128.png"></a>
VIP1=192.168.150.222 (www.baison.com.cn)
VIP2=192.168.150.223 (img.baison.com.cn)
haproxy01=192.168.150.110
haproxy02=192.168.150.112
web1=192.168.158.116
web2=192.168.158.117
web3=192.168.158.118
img1=192.168.158.119
img2=192.168.158.120
安裝配置過程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<code>1、安裝配置過程,(兩台Haproxy的安裝配置步驟一樣)</code>
<code>haproxy下載下傳位址:http:</code><code>//haproxy</code><code>.1wt.eu</code><code>/download/1</code><code>.4</code><code>/src/haproxy-1</code><code>.4.24.</code><code>tar</code><code>.gz</code>
<code>#cd /usr/local/src</code>
<code>#wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz</code>
<code>#tar xf haproxy-1.4.24.tar.gz</code>
<code>#cd haproxy-1.4.24</code>
<code>#make TARGET=linux26 ARCH=x86_64</code>
<code>#編譯參數參考README,其中TARGET是指定核心版本,ARCH指定CPU架構,</code>
<code>#make install</code>
<code>2、安裝完畢後,建立配置檔案和啟動檔案。</code>
<code>#mkdir /etc/haproxy</code>
<code>#cp examples/haproxy.cfg /etc/haproxy</code>
<code>#cp examples/haproxy.init /etc/init.d/haproxy</code>
<code>#chmod +x /etc/init.d/haproxy</code>
<code>#ln -s /usr/local/sbin/haproxy /usr/sbin/</code>
3、編輯配置檔案(兩台Haproxy配置檔案相同)
16
17
18
19
20
21
22
23
24
25
26
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
<code># vim /etc/haproxy/haproxy.cfg</code>
<code># this config needs haproxy-1.1.28 or haproxy-1.2.1</code>
<code>global</code>
<code> </code><code>log 127.0.0.1 local0 </code><code>#日志輸出配置,所有日志都記錄在本機,通過local0輸出</code>
<code> </code><code>log 127.0.0.1 local1 notice </code>
<code> </code><code>#log loghost local0 info </code>
<code> </code><code>maxconn 65535 </code><code>#最大連接配接數</code>
<code> </code><code>chroot </code><code>/usr/local/</code> <code>#改變目前工作目錄。</code>
<code> </code><code>uid 99 </code><code>#所屬使用者的uid</code>
<code> </code><code>gid 99 </code><code>#所屬運作的gid</code>
<code> </code><code>daemon </code><code>#以背景形式運作haproxy</code>
<code>defaults</code>
<code> </code><code>log global</code>
<code> </code><code>mode http</code>
<code> </code><code>#預設的模式mode { tcp|http|health },tcp是4層,http是7層,health隻會傳回OK</code>
<code> </code><code>option dontlognull</code>
<code> </code><code>option httplog</code>
<code> </code><code>retries 3 </code><code>#兩次連接配接失敗就認為是伺服器不可用</code>
<code> </code><code>option redispatch </code>
<code> </code><code>#當serverId對應的伺服器挂掉後,強制定向到其他健康的伺服器</code>
<code> </code><code>option abortonclose</code>
<code> </code><code>#當伺服器負載很高的時候,自動結束掉目前隊列處理比較久的連結</code>
<code> </code><code>maxconn 65535 </code><code>#預設的最大連接配接數</code>
<code>#timeout http-keep-alive 10s</code>
<code># timeout queue 1m</code>
<code> </code><code>contimeout 5000 </code><code>#連接配接逾時</code>
<code> </code><code>clitimeout 50000 </code><code>#用戶端逾時</code>
<code> </code><code>srvtimeout 50000 </code><code>#伺服器逾時</code>
<code> </code><code>timeout check 5s </code><code>#心跳檢測逾時</code>
<code> </code><code>stats refresh 30s </code><code>#統計頁面自動重新整理時間 </code>
<code> </code><code>stats uri </code><code>/stats</code> <code>#統計頁面url </code>
<code> </code><code>stats realm baison-</code><code>test</code><code>-Haproxy </code><code>#統計頁面密碼框上提示文本</code>
<code> </code><code>stats auth admin:admin123 </code><code>#統計頁面使用者名和密碼設定 </code>
<code> </code><code>stats hide-version </code><code>#隐藏統計頁面上HAProxy的版本資訊</code>
<code>frontend www</code>
<code> </code><code>bind :80</code>
<code> </code><code>#這裡建議使用bind *:80的方式,要不然做叢集高可用的時候有問題,vip切換到其他機器就不能通路了。</code>
<code> </code><code>acl web hdr(host) -i www.baison.com.cn</code>
<code> </code><code>#acl後面是規則名稱,-i是要通路的域名,如果通路www.baison.com這個域名就分發到下面的webserver 的作用域。</code>
<code> </code><code>acl img hdr(host) -i img.baison.com.cn</code>
<code> </code><code>#如果通路img.baison.com.cn就分發到imgserver這個作用域。</code>
<code> </code><code>use_backend webserver </code><code>if</code> <code>web</code>
<code> </code><code>use_backend imgserver </code><code>if</code> <code>img</code>
<code> </code>
<code>backend webserver </code><code>#webserver作用域</code>
<code> </code><code>balance roundrobin </code>
<code> </code><code>#banlance roundrobin 輪詢,balance source 儲存session值,支援static-rr,leastconn,first,uri等參數</code>
<code> </code><code>option httpchk </code><code>/index</code><code>.html</code>
<code> </code><code>#檢測檔案,如果分發到背景index.html通路不到就不再分發給它。</code>
<code>server web01 192.168.158.116:80 check inter 2000 fall 3 weight 20</code>
<code>server web02 192.168.158.117:80 check inter 2000 fall 3 weight 10</code>
<code>server web03 192.168.158.118:80 check inter 2000 fall 3 weight 10</code>
<code>backend imgserver</code>
<code> </code><code>mode http</code>
<code> </code><code>option httpchk </code><code>/index</code><code>.php</code>
<code> </code><code>balance roundrobin </code>
<code> </code><code>server img01 192.168.149.119:80 check inter 2000 fall 3</code>
<code> </code><code>server img02 192.168.149.120:80 check inter 2000 fall 3</code>
4、啟動Haproxy服務,檢視狀态。
<code>#service haproxy start</code>
<a target="_blank" href="http://blog.51cto.com/attachment/201307/183720241.png"></a>
5、安裝配置keepalived(兩台keepalived安裝步驟一樣)
<code>#tar zxvf -</code><code>1.2</code><code>.</code><code>7</code><code>.tar.gz</code>
<code>#cd keepalived-</code><code>1.2</code><code>.</code><code>7</code>
<code>#./configure --prefix=/usr/local/keepalived</code>
<code>#make</code>
<code>#make install</code>
<code>#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/</code>
<code>#cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/</code>
<code>#cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/</code>
<code>#mkdir /etc/keepalived</code>
<code>#cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/</code>
6、第一台keepalived配置檔案。第一台做192.168.150.222vip的master,192.168.150.223的backup。
<code>#vim /etc/keepalived/keepalived.conf</code>
<code>! Configuration File </code><code>for</code> <code>keepalived</code>
<code>global_defs {</code>
<code> </code><code>router_id LVS_DEVEL</code>
<code>}</code>
<code>vrrp_script chk_haproxy {</code>
<code> </code><code>script </code><code>"/usr/local/keepalived/check_haproxy.sh"</code>
<code> </code><code>interval 2</code>
<code> </code><code>weight 2</code>
<code>vrrp_instance VI_1 {</code>
<code> </code><code>state MASTER</code>
<code> </code><code>interface eth0</code>
<code> </code><code>virtual_router_id 51</code>
<code> </code><code>priority 100</code>
<code> </code><code>advert_int 1</code>
<code> </code><code>authentication {</code>
<code> </code><code>auth_type PASS</code>
<code> </code><code>auth_pass 5555</code>
<code> </code><code>}</code>
<code>track_script {</code>
<code> </code><code>chk_haproxy </code><code>#監測haproxy程序狀态</code>
<code> </code><code>virtual_ipaddress {</code>
<code> </code><code>192.168.150.222</code>
<code>vrrp_instance VI_2 {</code>
<code> </code><code>state BACKUP</code>
<code> </code><code>virtual_router_id 52</code>
<code> </code><code>priority 99</code>
<code> </code><code>auth_type PASS</code>
<code> </code><code>auth_pass 1111</code>
<code> </code><code>192.168.150.223 </code>
<code> </code><code>}</code>
7、第二台keepalived的配置檔案。
<code> </code><code>script </code><code>"/usr/local/keepalived/check_haproxy.sh"</code>
<code> </code><code>chk_haproxy </code><code>#監測haproxy程序狀态</code>
<code> </code><code>192.168.150.223 </code>
8、檢測腳本,為了防止haproxy服務關閉導緻keepalived不自動切換。
<code>#vim /usr/local/keepalived/check_haproxy.sh</code>
<code>#!/bin/bash</code>
<code>if</code> <code>[ $(</code><code>ps</code> <code>-C haproxy --no-header | </code><code>wc</code> <code>-l) -</code><code>eq</code> <code>0 ]; </code><code>then</code>
<code> </code><code>/etc/init</code><code>.d</code><code>/haproxy</code> <code>start</code>
<code>fi</code>
<code>sleep</code> <code>2</code>
<code> </code><code>/etc/init</code><code>.d</code><code>/keepalived</code> <code>stop</code>
9、啟動兩台keepalived和Haproxy服務。
<code>#servcie haproxy start</code>
<code>#service keepalived start</code>
10、檢視兩台伺服器的VIP
<code>#ip addr</code>
11、官網核心優化建議。
<code>echo</code> <code>1024 60999 > </code><code>/proc/sys/net/ipv4/ip_local_port_range</code>
<code>echo</code> <code>30 > </code><code>/proc/sys/net/ipv4/tcp_fin_timeout</code>
<code>echo</code> <code>4096 > </code><code>/proc/sys/net/ipv4/tcp_max_syn_backlog</code>
<code>echo</code> <code>262144 > </code><code>/proc/sys/net/ipv4/tcp_max_tw_buckets</code>
<code>echo</code> <code>262144 > </code><code>/proc/sys/net/ipv4/tcp_max_orphans</code>
<code>echo</code> <code>300 > </code><code>/proc/sys/net/ipv4/tcp_keepalive_time</code>
<code>echo</code> <code>1 > </code><code>/proc/sys/net/ipv4/tcp_tw_recycle</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/tcp_timestamps</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/tcp_ecn</code>
<code>echo</code> <code>1 > </code><code>/proc/sys/net/ipv4/tcp_sack</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/tcp_dsack</code>
12、測試,關閉任意一台keepalived,或者拔掉任意keepalived的網線。img和www域名通路正常。
本文轉自 張玉坡 51CTO部落格,原文連結:http://blog.51cto.com/fighter/1254815