天天看點

Haproxy+Keepalived主主高可用

介紹

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 &gt; </code><code>/proc/sys/net/ipv4/ip_local_port_range</code>

<code>echo</code> <code>30 &gt; </code><code>/proc/sys/net/ipv4/tcp_fin_timeout</code>

<code>echo</code> <code>4096 &gt; </code><code>/proc/sys/net/ipv4/tcp_max_syn_backlog</code>

<code>echo</code> <code>262144 &gt; </code><code>/proc/sys/net/ipv4/tcp_max_tw_buckets</code>

<code>echo</code> <code>262144 &gt; </code><code>/proc/sys/net/ipv4/tcp_max_orphans</code>

<code>echo</code> <code>300 &gt; </code><code>/proc/sys/net/ipv4/tcp_keepalive_time</code>

<code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/tcp_tw_recycle</code>

<code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/tcp_timestamps</code>

<code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/tcp_ecn</code>

<code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/tcp_sack</code>

<code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/tcp_dsack</code>

12、測試,關閉任意一台keepalived,或者拔掉任意keepalived的網線。img和www域名通路正常。

本文轉自 張玉坡 51CTO部落格,原文連結:http://blog.51cto.com/fighter/1254815