Keepalived+HAproxy實現高可用負載均衡

獵手家園發表於2016-05-02

總概:

      Keepalived是一個類似於layer3, 4 & 5交換機制的軟體,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web伺服器的狀態,如果有一臺web伺服器當機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web伺服器

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

這裡我利用HAproxy對多臺redis伺服器進行負載,然後用Keepalived對HAproxy進行監控:

     (主)伺服器A:10.10.51.231

     (從)伺服器B:10.10.51.232

      VIP:10.10.51.230

      Keepalived監控A、B上的HAproxy,利用Keepalived的VIP漂移技術,若A、B上的HAprox都工作正常,則VIP與優先順序別高的伺服器(主伺服器)繫結,當主伺服器當掉時,則與從伺服器繫結,而VIP則是暴露給外部訪問的ip;HAproxy利用Keepalived生產的VIP對多臺redis(從)進行讀負載,當某臺redis當掉,則將其移除,回覆後加入叢集。

 

一、安裝keepalived

1、下載後解壓 tar zxvf keepalived-1.2.7.tar.gz 到任意目錄

[root@Centos-Server ~]# tar zxvf keepalived-1.2.7.tar.gz -C /usr/local/keepalived

解壓後,進入keepalived目錄

[root@Centos-Server ~]# cd /usr/local/keepalived
[root@Centos-Server ~]# ./configure
[root@Centos-Server ~]# make && make install

注:若這裡報錯提示沒有裝openssl,則執行[root@Centos-Server ~]# yum –y install openssl-devel安裝,若還有其他的包沒裝,則執行yum命令進行安裝。

2、配置keepalived

[root@Centos-Server ~]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
[root@Centos-Server ~]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@Centos-Server ~]# mkdir /etc/keepalived
[root@Centos-Server ~]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
[root@Centos-Server ~]# ln -s /usr/local/sbin/keepalived /usr/sbin/
[root@Centos-Server ~]# vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_haproxy {                        #Haproxy服務啟動
   script "/etc/keepalived/check_haproxy.sh"     #監控haproxy程式的指令碼, 根據自己的實際路徑放置
   interval 2
   weight -4
}
vrrp_instance VI_1 { state MASTER
#主機為MASTER,備機為BACKUP interface eth0 #監測網路埠,用ipconfig檢視 virtual_router_id 51 #主備機必須相同 priority 150 #主備機取不同的優先順序,主機要大。從伺服器上改為120 advert_int 1 #VRRP Multicast廣播週期秒數 authentication { auth_type PASS #VRRP認證方式 auth_pass 1111 #VRRP口令 主備機密碼必須相同 }
track_script {
#呼叫haproxy程式檢測指令碼 chk_haproxy } virtual_ipaddress { 10.10.51.230 #VIP 漂移地址 即叢集IP地址 } }
[root@Centos-Server ~]# vim /etc/keepalived/check_haproxy.sh

#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
   /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
   sleep 3
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then /etc/init.d/keepalived stop fi fi

此檔案root組讀寫許可權,並且允許程式執行此檔案。

[root@Centos-Server ~]# chmod 777 /etc/keepalived/check_haproxy.sh

 

三、安裝HAproxy

1、下載後解壓 tar zxvf haproxy-1.4.24.tar.gz 到任意目錄

解壓後,進入Haproxy目錄

[root@Centos-Server ~]# cd /usr/local/haproxy-1.4.24
[root@Centos-Server ~]# make TARGET=linux26 PREFIX=/usr/local/haproxy                               
[root@Centos-Server ~]# make install PREFIX=/usr/local/haproxy        #將Haproxy安裝到/usr/local/haproxy

2、配置HAproxy

[root@Centos-Server ~]# cd /usr/local/haproxy
[root@Centos-Server ~]# vim haproxy.cfg

注:這裡是沒有haproxy.cfg檔案的,可以回到安裝檔案目錄下將examples下的haproxy.cfg複製到usr/local/haproxy下。

[root@Centos-Server haproxy-1.5.11]# cp /usr/local/mypackages/haproxy-1.5.11/examples/haproxy.cfg /usr/local/haproxy
####################HAProxy配置中分成五部分內容,當然這些元件不是必選的,可以根據需要選擇部分作為配置。
#global  :引數是程式級的,通常和作業系統(OS)相關。這些引數一般只設定一次,如果配置無誤,就不需要再次配置進行修改
#defaults:配置預設引數的,這些引數可以被利用配置到frontend,backend,listen元件
#frontend:接收請求的前端虛擬節點,Frontend可以根據規則直接指定具體使用後端的 backend(可動態選擇)。
#backend :後端服務叢集的配置,是真實的伺服器,一個Backend對應一個或者多個實體伺服器。
#listen  :Frontend和Backend的組合體。

global
    log 127.0.0.1 local0    #日誌輸出配置,所有日誌都記錄在本機,透過local0輸出
    maxconn 4096            #限制單個程式的最大連線數
    chroot /usr/local/haproxy                 #Haproxy安裝目錄
    uid 99            #所屬執行使用者,預設99為nobody
    gid 99            #所屬執行使用者組,預設99為nobody
    daemon            #讓程式作為守護程式在後臺執行
    nbproc 1          #指定作為守護程式執行時的程式數
    pidfile /usr/local/haproxy/haproxy.pid    #將所有程式寫入pid檔案

defaults
    log global
    mode tcp                  #所處理的類別,預設採用http模式,可配置成tcp作4層訊息轉發
    maxconn 4096              #限制單個程式的最大連線數
    option httplog            #http 日誌格式 
    option dontlognull        #不記錄空連線
    option forwardfor         #如果後端伺服器需要獲得客戶端真實ip需要配置的引數,可以從Http Header中獲得客戶端ip
    option httpclose          #每次請求完畢後主動關閉http通道,haproxy不支援keep-alive,只能模擬這種模式的實現
    option abortonclose       #當伺服器負載很高的時候,自動結束掉當前佇列處理比較久的連線 
    option redispatch         #在連線失敗或斷開的情況下,允許當前會話被重新分發
    retries 3                 #設定在一個伺服器上鍊接失敗後的重連次數
    balance source            #表示根據請求源IP,這個跟Nginx的IP_hash機制類似,我們用其作為解決session問題的一種方法。
    timeout client 30s        #設定客戶端的最大超時時間(毫秒)
    timeout connect 5s        #設定等待連線到伺服器成功的最大時間
    timeout server 30s        #設定伺服器端的最大超時時間
    timeout check 5s          #心跳檢測時間

#前端代理 Redis
frontend Redis
    bind *:6379
    default_backend RedisServer

#後端分發 Redis
backend RedisServer
    mode tcp
    balance source
    server redis-233 10.10.51.233:6379 check inter 2000 fall 5
    server redis-234 10.10.51.234:6379 check inter 2000 fall 5
    server redis-235 10.10.51.235:6379 check inter 2000 fall 5


#前端代理 Web
frontend WebSite
    bind 10.10.51.230:80                            #這裡建議使用bind *:80的方式,要不然做叢集高可用的時候有問題,vip切換到其他機器就不能訪問了。
    acl WwwSite hdr(host) -i www.ccav.com           #acl後面是規則名稱,-i是要訪問的域名,如果訪問www.zhirs.com這個域名就分發到下面的webserver 的作用域。
    acl ImgSite hdr(host) -i res.ccav.com           #如果訪問img.baison.com.cn就分發到imgserver這個作用域。
    use_backend WwwSiteServer if WwwSite
    use_backend ImgSiteServer if ImgSite

#後臺分發 Web
backend WwwSiteServer
    mode http
    balance source                    #banlance roundrobin 輪詢,balance source 儲存session值,支援static-rr,leastconn,first,uri等
    option httpchk /index.html        #檢測檔案,如果分發到後臺index.html 訪問不到就不再分發給它
    server web01 10.10.51.241:80  check inter 2000 fall 3 weight 30
    server web02 10.10.51.242:80  check inter 2000 fall 3 weight 20
 
backend ImgSiteServer
    mode http
    option httpchk /index.html
    balance roundrobin
    server web03 10.10.51.243:80  check inter 2000 fall 3 weight 10


    # weight - 調節伺服器的負重
    # check - 允許對該伺服器進行健康檢查
    # inter - 設定連續的兩次健康檢查之間的時間,單位為毫秒(ms),預設值 2000(ms)
    # rise - 指定多少次連續成功的健康檢查後,可認定該伺服器處於可操作狀態,預設值 2
    # fall - 指定多少次不成功的健康檢查後,認為伺服器為當掉狀態,預設值 3
    # maxconn - 指定可被髮送到該伺服器的最大併發連線數

#狀態檢測
listen status 10.10.51.231:8080        #監控頁面的埠
    mode http
    stats enable
    stats refresh 10s                  #統計頁面自動重新整理時間
    stats uri /haproxy-admin           #監控頁面的訪問地址
    stats realm Haproxy\ Statistics    #統計頁面密碼框上提示文字
    stats auth ccav:123456             #統計頁面使用者名稱和密碼設定
    stats hide-version                 #隱藏統計頁面上HAProxy的版本資訊

3、加上日誌支援

[root@Centos-Server ~]# vim /etc/rsyslog.conf

#在最下邊增加
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
[root@Centos-Server ~]# vim /etc/sysconfig/rsyslog
修改: SYSLOGD_OPTIONS="-r -m 0" 

[root@Centos-Server ~]# service rsyslog restart        #重啟日誌服務

 

三、測試

1、啟動Keepalived:

[root@Centos-Server ~]# /usr/local/keepalived/bin/keepalived -D -f /etc/keepalived/keepalived.conf  #指定啟動配置檔案

正在啟動 keepalived: [確定]
#說明:Keepalived啟動後會去檢查HAproxy,若HAproxy未啟動,則啟動HAproxy,若啟動HAproxy失敗,則關閉Keepalived

2、啟動Haproxy

[root@Centos-Server ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg  #啟動
[root@Centos-Server ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`  #重啟
[root@Centos-Server ~]# killall haproxy  #停止

PS:haproxy啟動故障:Starting proxy cluster: cannot bind socket

[root@Centos-Server ~]# /etc/sysctl.conf        #修改核心引數
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind=1                     #沒有就新增此條記錄

[root@Centos-Server ~]# sysctl -p               #儲存結果,使結果生效。

3、檢視keepalived狀況:

[root@alex]# service keepalived status

keepalived (pid  5420) 正在執行...

4、檢視HAproxy狀況:

[root@alex]# ps -aux|grep haproxy

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
nobody   5430  0.0  0.0  11980   944 ?  Ss  16:37   0:00 /usr/local/haproxy/sbin/haproxy –f /usr/local/haproxy/haproxy.conf
nobody   5431  0.0  0.0  11980   944 ?  Ss  16:37   0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
root      5618  0.0  0.0 103252   844 pts/2    S+   16:38   0:00 grep haproxy

Keepalived啟動後自動將HAproxy啟動了。

5、檢視Keepalived生成的VIP是否與主伺服器繫結

[root@alex]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet 10.10.51.230/32 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

VIP繫結OK!

6、開啟HAproxy的圖形管理介面:

瀏覽器輸入http://localhost:8080/haproxy-admin

使用者名稱:ccav   密碼:123456

這時候我們Kill掉HAproxy,Keepalived檢查到後會重新將HAproxy啟動。

[root@alex sysconfig]# killall haproxy

重新整理頁面,可以看到HAproxy的pid改變了。

7、這時我們將主伺服器上的keepalived當掉,看VIP是否漂移到了從伺服器上,從伺服器接管服務。

A、主伺服器上:

[root@Centos-Server ~]# killall keepalived
[root@Centos-Server ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

B、從伺服器上:

[root@Centos-Server ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:be:47:90 brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.232/24 brd 192.168.4.255 scope global eth6
    inet 10.10.51.230/32 scope global eth6
    inet6 fe80::a00:27ff:febe:4790/64 scope link
    valid_lft forever preferred_lft forever

VIP漂移OK!

8、這時候重啟主伺服器的Keepalived,檢視VIP是否漂移回來。

[root@Centos-Server ~]# service keepalived start
正在啟動 keepalived:                                      [確定]

[root@Centos-Server ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 08:00:27:42:71:2d brd ff:ff:ff:ff:ff:ff
    inet 10.10.51.231/24 brd 192.168.4.255 scope global eth5
    inet 10.10.51.230/32 scope global eth5
    inet6 fe80::a00:27ff:fe42:712d/64 scope link
    valid_lft forever preferred_lft forever

VIP漂移到主伺服器!

相關文章