基於keepalive+LVS的高可用集羣來實現web服務負載均衡集羣的架構

架構環境:

RedHat Linux Enterprise 5.8           keepalive                        LVS-DR

注意:1、事先配置好yum源,利用yum進行相關的軟件安裝,其可以很好的解決依賴關係

            yum利用DVD光盤配置即可!其詳細配置可以參考我的博文“Linux系統常用的軟件管理工具rpm、yum及軟件源碼編譯安裝”

    2、事先關閉掉相關的iptables規則和selinux


1
2
3
4
[root@node1 ~]# getenforce  #查看selinux的設置permissive|
[root@node1 ~]# setenforce 0|1  #關閉或開啓selinux功能
[root@node1 ~]# vim /etc/selinux/config  #selinux的配置文件
SELINUX=disabled|permissive|enforcing #禁止|禁用|啓用selinux

相關服務和名字的定義:

1
2
3
4
5
Director:負載調度集羣的主機,也簡稱DR
VIP:Virtual IP,向外提供服務的IP
RIP:Real Server IP,內部真正提供服務的
DIP:與內部主機通信的IP,在DR主機上
CIP:客戶端IP


一、架構設計

     利用keepalive來實現lvs的Directory Server的高可用集羣,然後在利用keepalive和lvs的高可用來實現web服務的負載均衡!其架構圖如下:

圖像 304

二、keepalive的介紹

⑴、keepalive的基本工作機制和應用場景

     keepalive是一個可以提供vrrp已經health-check功能的服務軟件,可以只用它提供雙機浮動的vip(vrrp虛擬路由功能),這樣可以簡單實現一個雙機熱備高可用功能。同時我們還可以利用LVS+Keepalived基於完整開源軟件的架構可以爲你提供一個負載均衡及高可用的服務器。

    在本博文中Keepalived的主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現。Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。

   Keepalived是一個基於VRRP協議來實現的WEB 服務高可用方案,可以利用其來避免單點故障。一個WEB服務至少會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),但是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候,備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。

⑵、VRRP協議

    上面我們提到keepalive利用vrrp來進行health-check功能的,那麼VRRP到底是什麼那?我們下面來說說VRRP協議吧!

    VRRP:Virtual Router Redundancy Protocol,是虛擬路由冗餘協議,通過此協議我們可以把多個路由器做成一個虛擬路由器,從而來保證其中某個路由宕掉的時候不會造成我們內部外出網絡的全部中斷。

    VRRP中的各個路由器都有一個唯一的標識VRID,其範圍爲0-255,路由器對外表現爲唯一的虛擬MAC地址,地址的格式爲00-00-5E-00-01-[VRID]。主控路由器負責對ARP請求用該MAC地址做應答。這樣,無論如何切換,保證給終端設備的是唯一一致的IP和MAC地址,減少了切換對終端設備的影響。其中的VRID中的0和255是保留的,0用於IP地址所有者主動放棄主控者角色時使用,255用於VRRP路由器的IP地址和虛擬路由器的接口IP地址相同時所擁有!

    由於VRRP協議比較複雜,這裏一兩句也介紹不清楚,而我理解的也不深,只是一點點而已,但是這並不影響我們下面的使用,所有還望各位諒解不能在此詳細介紹,如果有意深入瞭解可以下載附件內的“h3c_vrrp介紹.pdf”。

三、RS上相關軟件的安裝和配置

⑴、web服務的安裝和配置

1
2
3
web1和web2上分別配置相應的ip地址
RIP1:172.16.7.3/16
RIP2:172.16.7.4/16

  1、在web1上安裝httpd服務並配置RIP和VIP,注意由於是基於LVS的DR模型,我們需要設置本機VIP不能響應外部主機的arp請求。

安裝httpd

1
2
yum install httpd –y #安裝httpd
echo "web1.chris.com" > /var/www/html/index.html  #添加主頁內容

配置RIP和設置arp不能被外部主機解析此處使用腳本vipset.sh進行設置,腳本如下:

###########################################################

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
#!/bin/bash  
#   
# Script to start LVS DR real server.   
# description: LVS DR real server   
#   
.  /etc/rc.d/init.d/functions
VIP=172.16.7.5                #VIP地址  
host=`/bin/hostname`          #定義host變量
case "$1" in  
start)                        #start的時候設置本機arp不被外部主機解析   
       # Start LVS-DR real server on this machine.   
        /sbin/ifconfig lo down   
        /sbin/ifconfig lo up   
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore   
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce   
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore   
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask  255.255.255.255 up
              #配置vip在lo:0,並且設置廣播地址和子網掩碼,此處使用32位是保證此vip不能與其他地址通信。  
        /sbin/route add -host $VIP dev lo:0      #增加路由
;;  
stop)                                                         #stop的時候恢復到系統的初始化arp參數
        # Stop LVS-DR real server loopback device(s).  
        /sbin/ifconfig lo:0 down   
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore   
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce   
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore   
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;  
status)
        # Status of LVS-DR real server.  
        islothere=`/sbin/ifconfig lo:0 | grep $VIP`   
        isrothere=`netstat -rn | grep "lo:0" | grep $VIP`   
        if [ ! "$islothere" -o ! "isrothere" ];then   
            # Either the route or the lo:0 device   
            # not found.   
            echo "LVS-DR real server Stopped."   
        else   
            echo "LVS-DR real server Running."   
        fi   
;;   
*)   
            # Invalid entry.   
            echo "$0: Usage: $0 {start|status|stop}"   
            exit 1   
;;   
esac

############################################################

在web1上執行此腳本,來完成vip和arp參數的設置

sh vipset.sh

然後查看相關IP參數信息

ifconfig

圖像 306

2、在web2上安裝httpd服務並配置RIP和VIP,注意由於是基於LVS的DR模型,我們需要設置本機VIP不能響應外部主機的arp請求。

安裝httpd

1
2
yum install httpd –y #安裝httpd
echo "web2.chris.com" > /var/www/html/index.html #添加主頁內容

配置RIP和設置arp不能被外部主機解析此處使用腳本vipset.sh進行設置,基本內容與web1上使用的腳本相同!

圖像 308

四、DR上相關軟件的安裝和配置

⑴、ipvsadm軟件安裝,用於後面的ipvs規則的查看。

1
2
yum –y install ipvsadm  #安裝用戶空間工具ipvsadm
ipvsadm –L –n            #查看系統ipvs規則

⑵、安裝keepalive軟件和設置相關配置

1、安裝keepalive軟件,這裏使用的是已經製作好的rpm包進行安裝,如需要請在博文附件內下載。

1
2
3
4
5
6
7
8
9
DS1和DS2上都進行keepalive的安裝:
兩種方法:
        源碼編譯安裝:
        configure [--enable-vrrp] [--disable-snmp|--enable-snmp]
        make
        make install
rpm包安裝:
我這裏利用以及編譯製作好的rpm包進行安裝
yum -y --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm   #不校驗並自動安裝

圖像 309

至此我們的keepalive軟件就安裝完畢了,簡單吧~下面來看看keepalive的配置文件吧

⑵、keepalive配置文件的詳解

keepalive的配置文件是/etc/keepalived/keepalived.conf,其文件內分爲:全局配置、vrrp配置、lvs配置、服務程序監控檢查

------------------------------------------------------------------------------

全局配置:

1
2
3
4
5
6
7
8
9
10
11
12
! Configuration File for keepalived              #註釋
global_defs {                                          #全局配置,配置參數爲{}內的內容  
   notification_email {                               #keepalive服務服務信息通知郵箱,可以爲多個   
   }   
   notification_email_from [email protected]  #發送信息的時候的發送郵箱   
   smtp_server 192.168.200.1                   #smtp服務器   
   smtp_connect_timeout 30                      #連接smtp超時時間   
   router_id LVS_DEVEL                            #keepalive服務器的ID標識,注意每個服務                                                                 要有一個獨立的標識   
}

-----------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vrrp的配置:
vrrp_instance VI_1 {                           # 定義vrrp組,VI_1代表第一個組  
    state MASTER                                 #角色,master|backup,當state指定的instance的初始化狀態,在兩臺DS都啓動以後,馬上發生競選,優先級高的成爲MASTER,所以這裏的MASTER並不是表示此臺服務器一直是MASTER   
    interface eth0                                  #綁定網卡   
    virtual_router_id 51                          #VRID標記(1-244)   
    priority 100                                      #優先級   
    advert_int 1                                     #檢查時間間隔,默認爲1s   
    authentication {                                # 認證   
        auth_type PASS                            #認證機制,PASS代表字符串   
auth_pass 1111                            #字符串
    }  
    virtual_ipaddress {                             #指定漂移地址,此處既VIP,可以指定多個。   
        192.168.200.16   
        192.168.200.17   
        192.168.200.18   
    }   
}

-------------------------------------------------------------------------------------

LVS的配置:lvs的配置包括兩部分,虛擬主機組和虛擬主機,這些配置都會在傳遞給ipvsadm作爲參數的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
62
63
64
65
66
67
68
69
70
71
72
73
virtual_server 192.168.200.100 443 {       #設置VIP port   
    delay_loop 6                                        #多少秒檢查一次real server的健康狀態    
    lb_algo rr                                             #調度算法    
    lb_kind NAT                                          #lvs模型    
    nat_mask 255.255.255.0                       #虛擬VIP的掩碼    
    persistence_timeout 50                          #長連接時間    
    protocol TCP                                          #協議類型
    real_server 192.168.201.100 443 {          #定義real server   
        weight 1                                            #定義權重    
        SSL_GET {                                        #檢查web服務的SSL狀況    
            url {    
              path /    
              digest ff20ad2481f97b1754ef3e12ecd3a9cc    
            }    
            url {                                               #檢查服務器的web服務狀況    
              path /mrtg/    
              digest 9b3a0c85a887a256d6939da88aabd8cd    
            }    
            connect_timeout 3                            #連接超時時間    
            nb_get_retry 3                                 #重試次數    
            delay_before_retry 3                         #重試連接時間間隔    
        }    
    }    
}
⑶、keepalive在DS1和DS2上進行相關配置,並實現VIP的高可用和web集羣的負載均衡:
! Configuration File for keepalived
global_defs {  
   notification_email {   
     chris@localhost   
   }   
   notification_email_from root@localhsot   
   smtp_server 127.0.0.1   
   smtp_connect_timeout 30   
   router_id LVS_DEVEL   
}
vrrp_instance VI_1 {  
    state MASTER   
    interface eth0   
    virtual_router_id 51   
    priority 101   
    advert_int 1   
    authentication {   
        auth_type PASS   
        auth_pass chris   
    }   
    virtual_ipaddress {   
        172.16.7.5   
    }   
}
virtual_server 172.16.7.5 80 {  
    delay_loop 6   
    lb_algo rr   
    lb_kind DR   
    protocol TCP
    real_server 172.16.7.3 80 {  
        weight 2   
        TCP_CHECK {   
            connect_timeout 3   
            nb_get_retry 3   
            delay_before_retry 1   
            connect_port 80   
            }   
        }   
    real_server 172.16.7.4 80 {   
        weight 2   
          TCP_CHECK {   
            connect_timeout 3   
            nb_get_retry 3   
            delay_before_retry 1   
            connect_port 80   
            }   
        }   
}

圖像 311

圖像 313

然後把DS1上的keepalive.conf複製到DS2上,並把其中的stata改成BACKUP,priority修改爲100,其他的保存不變

圖像 312

至此我們的DS高可用已經設置完了,啓動keepalive測試下效果吧

DS1和DS2上分別開啓keepalive服務

service keepalived start

圖像 315

此時利用vip訪問一下我們的web服務,看看能否正常不吧

圖像 318

下面模擬一下DS1宕掉吧~看看其vip能否否自動漂移

在DS1上停止keepalive服務

service keepalived stop

圖像 316

DS2上查看下地址是否漂移過來了吧!

圖像 317

此時的vip進行web訪問

圖像 319

五、web服務的高可用集羣

    通過上面的相關配置,我們利用keepalive實現了DS的高可用,然後利用LVS的DR模型實現了web服務的負載均衡,那下面我們就通過keepalive的相關功能來實現web服務的高可用!這裏keepalive通過調用相關的腳本進行對服務器的相關操作!其架構圖如下

圖像 320

⑴在DS1和DS2上分別安裝httpd服務,並設設置主頁內容

yum –y install httpd

echo "DS1.chris.com" > /var/www/html/index.html

啓動服務進行測試

service httpd start

圖像 321

⑵、配置keepalive服務

1、利用上面實驗已經安裝好的keepalive進行設置,這裏不再重新安裝,所以配置之前先把keepalive服務關掉:service keepalived stop

相關配置如下:(配置腳本在附件內-keepalive.conf-webha)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
! Configuration File for keepalived
global_defs {  
   notification_email {   
         [email protected]   
         chrinux@126.com   
   }   
   notification_email_from [email protected]   
   smtp_connect_timeout 3   
   smtp_server 127.0.0.1   
   router_id LVS_DEVEL   
}
vrrp_script chk_httpd {  
    script "killall -0 httpd"    #kill -0是模擬kill httpd服務,並不是真的kill,只是檢查其服務是否存在   
    interval 2   
        # check every 2 seconds   
    weight -2   
        if failed, decrease 2 of the priority   
    fall 2   
        # require 2 failures for failures   
    rise 1   
        # require 1 sucesses for ok   
}
vrrp_script chk_schedown {  
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"        #利用/etc/keepalive/下的down文件是否存在來進行服務的關閉   
   interval 2                                                                         #每2秒檢查一次   
   weight –2                                                                         #如果存在,權重-2   
}
vrrp_instance VI_1 {  
    interface eth0
    state MASTER
    priority 101
    virtual_router_id 51
garp_master_delay 1
    authentication {  
        auth_type PASS   
        auth_pass password   
    }
    track_interface {  
       eth0   
    }   
        # optional, monitor these as well.   
        # go to FAULT state if any of these go down.
    virtual_ipaddress {  
        172.16.7.5/16 dev eth0 label eth0:0           #配置虛擬VIP,並指定端口和別名   
    }   
        #addresses add|del on change to MASTER, to BACKUP.   
        #With the same entries on other machines,   
        #the opposite transition will be occuring.   
        #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
    track_script {  
        chk_httpd   
        chk_schedown   
    }
    notify_master "/etc/keepalived/httpd.sh master"  
    notify_backup "/etc/keepalived/httpd.sh backup"   
    notify_fault "/etc/keepalived/httpd.sh fault"   
}

然後把此配置文件複製到DS2 上,並修改其中的

state BACKUP              #修改其爲從服務器

priority 100                  #修改優先權低於主服務器的

圖像 322

2、增加服務控制腳本—httpd.sh,把其到到配置文件內定義的目錄/etc/keepalived/內,其腳本內容如下:(腳本在附件內-httpd.sh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash  
# Author: MageEdu <[email protected]>   
# description: An example of notify script   
#
ifalias=${2:-eth0:0}  
interface=$(echo $ifalias | awk -F: '{print $1}')   
vip=$(ip addr show $interface | grep $ifalias | awk '{print $2}')   
#contact='[email protected]'   
contact='root@localhost'
workspace=$(dirname $0)
notify() {  
    subject="$ip change to $1"   
    body="$ip change to $1 $(date '+%F %H:%M:%S')"   
    echo $body | mail -s "$1 transition" $contact   
}
case "$1" in  
    master)   
        notify master   
        exit 0   
    ;;   
    backup)   
        notify backup   
        /etc/rc.d/init.d/httpd restart   
        exit 0   
    ;;   
    fault)   
        notify fault   
        exit 0   
    ;;   
    *)   
        echo 'Usage: $(basename $0) {master|backup|fault}'   
        exit 1   
    ;;   
esac

⑶、在DS1和DS2上開啓keepalive服務,並進行查看相關信息

圖像 324

下面我們訪問一下web服務吧~使用vip地址!

圖像 325

下面假設DS1服務器宕掉了,看看vip是否能自動漂移並啓動DS2上的web服務,我們在腳本內定義了利用在/etc/keepalived/目錄下down文件是否存在來實現測試吧


圖像 326

看下DS2上和web服務

圖像 328

此此,我們的web服務的高可用集羣已經建立完成,當然這只是比較簡單的實驗測試,在實際的工作需要中我們可以把web服務的主頁放到一個共享存儲上,來保證web內容的一致性!

六、雙主模型

我們通過定義不同的vrrp_instance來實現兩個DS互爲雙主的架構:

vrrp_instance 1內:

        DS1爲主

        DS2爲從

vrrp_instance 2內:

         DS1爲從

         DS2爲主

其設置只需要在前面配置文件下增加如下內容即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vrrp_instance VI_2 {  
    interface eth0   
    state BACKUP  # BACKUP for slave routers   
    priority 100  100 for BACKUP   
    virtual_router_id 52   
    garp_master_delay 1
    authentication {  
        auth_type PASS   
        auth_pass password   
    }   
    track_interface {   
       eth0   
    }   
    virtual_ipaddress {   
        172.16.7.6/16 dev eth0 label eth0:1   
    }   
    track_script {   
        chk_httpd   
        chk_mantaince_down   
    }
    notify_master "/etc/keepalived/httpd.sh master eth0:1"  
    notify_backup "/etc/keepalived/httpd.sh backup eth0:1"   
    notify_fault "/etc/keepalived/httpd.sh fault eth0:1"   
}

圖像 331

然後配置DS2上的配置文件內增加如下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vrrp_instance VI_2 {  
    interface eth0   
    state MASTER  # BACKUP for slave routers   
    priority 101  100 for BACKUP   
    virtual_router_id 52   
    garp_master_delay 1
    authentication {  
        auth_type PASS   
        auth_pass password   
    }   
    track_interface {   
       eth0   
    }   
    virtual_ipaddress {   
        172.16.7.6/16 dev eth0 label eth0:1   
    }   
    track_script {   
        chk_httpd   
        chk_mantaince_down   
    }
    notify_master "/etc/keepalived/httpd.sh master eth0:1"  
    notify_backup "/etc/keepalived/httpd.sh backup eth0:1"   
    notify_fault "/etc/keepalived/httpd.sh fault eth0:1"   
}
圖像 333

然後重啓keepalive服務,查看DS1和DS2

圖像 336

測試web

圖像 337

此時可以把DS1宕掉,測試

圖像 339

圖像 340

此時測試web服務,其都是DS2上的了

圖像 341

至此我們實現了基於keepalive的web雙主高可用集羣!

       總結:通過以上實驗我們瞭解了keepalive實現高可用,並利用lVS實現web負載均衡的架構全部過程,最後利用keepalive的雙主模型實現了web服務的高可用架構!

      內容比較多,寫的比較亂,還望各位見諒,其中錯誤望各位指正~~謝謝

                                                                   chrinux—chris linux


本文出自 “Chris On the way” 博客,請務必保留此出處http://chrinux.blog.51cto.com/6466723/1201652

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章