天天看點

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

在這裡我們要講Keepalived的使用,在講Keepalived之前,我們要先講講VRRP的使用。因為Keepalived加入VRRP功能,使得現在的Keepalived具有伺服器運作檢測功能與HA Cluster功能。

一、VRRP定義

VRRP(Virtual Routing Redundent Protocol):虛拟路由備援協定,它是一種協定,将多态實體裝置組合成一台虛拟裝置。

   1、備份組中路由器的優先級

在一個備份組中,有一個主(master),多個從(slave),當主伺服器(master)當機了,從伺服器就要取而代之,但是那麼多從服務哪個取代呢?它有一個根據優先級的選舉協定,優先級高的誰就成為主的了,或者讓它工作在搶占模式下,誰反應快,誰就成為主的了。是以它是一主多從的工作機制,但是多個從平時都不上線,這就造成了資源的浪費,是以我們常見的就是一主一從,實際它是可以實作一主多從的。

VRRP優先級的取值範圍為0~255(數值越大表名優先級越高),可配置的範圍是1~254,優先級0為形同保留,255則是系統保留給IP位址擁有者,當路由器為IP位址擁有者時,其優先級始終為255,是以,當備份組記憶體在IP位址擁有者時,隻要其工作正常,則為Master路由器。

在一個實體裝置上,可以配置多個組,靠組ID差別不同的組。在同一個組内,所有的工作都在同一個組内工作的。

   2、VRRP工作過程

(1)路由器使用VRRP功能後,會根據優先級确定自己在備份中的角色。優先級高的為Master,低的為Backup,Master定義發送VRRP通告封包,通知備份組中的其它路由器自己工作正常。Backup則啟動定時器等待通告封包的到來。

(2)在搶占模式下,當Backup收到VRRP通告的封包後,會拿自己的優先級比較通報封包中的優先級,如果大于通告封包中的優先級,則成為Master ,如果小于通告封包中的優先級,則還是Backup。

(3)在非搶占模式下,隻要Master路由器沒有出現問題,備份組中的路由器始終保持着自己原來的狀态,即使後來有的Backup有更高的優先級也不會成為Master。

(4)如果Backup的定時逾時後仍然沒有收到Master路由器發送來的VRRP通告封包,則認為Master已經無法正常工作了,此時Backup會認為自己是Master,并對外發送VRRP通告封包,備份組内的路由會根據優先級選舉出來Master,承擔封包的轉發功能。

二、Keepalived定義及主要功能

Keepalived:最初目的為ipvs提供高可用功能的,是以我們實作ipvs高可用的時候我們使用Keepalived來配置更簡

主要提供三個功能

  1、IP:對IP位址實作飄移,依賴于ARRP協定

  2、lvs:重新啟用一份ipvs規則

  3、health check:健康檢查

三、配置安裝Keepalived實作LVS服務的高可用

我們這裡使用四台虛拟機,其中HA1和HA2當做高可用的Web服務,另外兩個做成real server。這裡我們要先在HA1和HA2上面安裝keepalived,這個軟體我們這些下載下傳到本地了,大家配置了上官網上下載下傳(keepalived-1.2.7-5.el5.i386.rpm)   軟體包,因為安裝這個包還需要解決依賴關系,是以這裡我們還需要安裝yum庫,安裝完成後我們就開始安裝keepalived。

1、安裝yum庫

我們這裡用挂載CD光牒來安裝yum庫,進而安裝開發環境,需要安裝Development Libraries和Development Tools,但是Development Tools預設都安裝過了,是以我們這裡安裝一個就行了。安裝完成後開發環境就安裝成功了。

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

[root@localhost ~]# mkdir /mnt/cdrom    ###建立cdrom目錄
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom  ###挂載CD光牒(當場有效,開機無效)
[root@localhost ~]# vim /etc/fstab  ###在配置檔案中挂載CD光牒(當場無效,開機有效)
/dev/cdrom              /mnt/cdrom              ext3    defaults        0 0
[root@localhost ~]# cd /etc/yum.repos.d/  ###進入yum.repos.d目錄下面
[root@localhost yum.repos.d]# vim server.repo  ###編輯server.repo
[base]
name=Server
baseurl=file:///mnt/cdrom/Server
enabled=1
gpgcheck=0
[root@localhost yum.repos.d]# yum groupinstall "Development Libraries"      

2、安裝keepalived

# yum -y--nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm
# rpm -qlkeepalived   ###檢視配置檔案
/etc/keepalived   ###配置檔案目錄
/etc/keepalived/keepalived.conf    ###主配置檔案
/etc/keepalived/keepalived.conf.haproxy_example   ###自己設定的主配置檔案将haproxy配置成高可用功能了
/etc/keepalived/notify.sh   ###這裡我們設定的腳本,網上下載下傳是沒有的。
# scpkeepalived-1.2.7-5.el5.i386.rpm node1:/root  ###把下載下傳的軟體包給前HA2發過去。      
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

   3、檢視并解釋配置檔案。

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

四、配置real server

     我們需要設定IP位址與director在同一個網段内,首先我們要先關閉selinux,然後安裝http伺服器進行通路測試,然後編輯網頁,網頁編輯完成後我們就要開啟服務,下來進行網頁測試。

#setenforce0   ###關閉selinux
# yum installhttpd   ###安裝http服務
# vim  /var/www/html/index.html  ###編輯網頁
# service httpdrestart  ###開啟服務      
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

我們這裡使用的是一個腳本,此腳本隻需要在real server中使用就行了。

# vim start.sh###編輯腳本,腳本内容如下:

#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions
VIP=172.16.58.1
host=`/bin/hostname`
case "$1" in
start)
       # 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
        /sbin/route add -host $VIP dev lo:0
;;
stop)
        # 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      
## chmod +x start.sh
# ./start.sh start
# ifconfig (顯示的是隻是添加的内容)      
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型
# scp start.sh172.16.58.10:/root/  ###将腳本複制到另一個real server上進行執行。      

五、修改主配置檔案

1、修改HA1中的keepalived的配置檔案

下面我們就去HA1和HA2中修改主配置檔案,我們在修改主配置檔案的時候首先就是要将主配置檔案複制一份,然後在修改,這樣避免出錯後,無法修改。

! Configuration File for keepalived     ###表示注釋資訊,#也表是注釋
global_defs {       ###這裡面都是全局預設
   notification_email {
        root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {    ###定義虛拟路由(可以定義多個虛拟路由組)
    state MASTER     ###狀态(有兩種,一種MASTER另一種BACKUP)【提示:隻在初始的時候定義主、從】
    interface eth0    ###在哪個接口上實作配置位址和完成選舉
    virtual_router_id 77    ###在VI_1下面定義的虛拟ID,必須要和别的人不一樣
    priority 101     ###優先級
    advert_int 1     ###多長時間通告一次(這裡是1秒鐘)
    authentication {   ###認證
        auth_type PASS     ###表示用字元串來認證
        auth_pass password   ###生成随機串(最好是随機的)
    }
    virtual_ipaddress {    ###提供虛拟IP(可以是一個,也可以是多個)
        172.16.58.1 
    }
}
virtual_server 172.16.58.1 80 {    ###定義虛拟伺服器,後面是VIP,最後面是端口【提示:可以定義多個叢集服務】
    delay_loop 6
    lb_algo wlc     ####負載均衡排程方法,rr為輪詢
    lb_kind DR    ###LVS的類型
    nat_mask 255.255.0.0
    protocol TCP   ###端口協定使用TCP
    real_server 172.16.58.8 80 {    ###real server位址,端口
        weight 1     ###權重
            url {
              path /   ###擷取web伺服器的根目錄,直接擷取首頁,顯示200正常,顯示404等為不正常
              status_code 200
            }
            connect_timeout 2    ###多長時間探測一次(2s),如果3s中後擷取不到,則為不健康
            nb_get_retry 3     ###在探測不健康的時候要嘗試幾次(3次)
            delay_before_retry 1   ###每一次嘗試之前要延遲多長時間 (1s)
        }
     virtual_server 172.16.58.1 80 {
        delay_loop 6
        lb_algo wlc
        lb_kind DR
        nat_mask 255.255.0.0
        protocol TCP
    real_server 172.16.58.10 80 {
        weight 1
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
}      

2、将HA1中配置檔案複制到HA2中

修改好配置檔案後,我們還需要将這個配置檔案複制到HA2一份,不隻是複制過去就行了,我們還需要修改配置檔案的。

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

   3、開啟兩個HA服務

#service keepalived start   ###啟動keepalived
#ip add show   ###檢視網絡狀态      
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

4、安裝ipvsadm (兩個服務上都要安裝)

# ip add show
# servicekeepalived restart  ###重新開機keepalived
# ipvsadm -L –n  ###檢視每一個real server對外所提供使用者請求的次數      
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

六、實作基于web服務的高可用叢集(在HA1和HA2上)

1、工作圖

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

簡述:當用戶端通過路由器通路我們的伺服器的時候,隻能通路到我們的MASTER伺服器上,當MASTER出現問題的時候,它的VIP會飄移到BACKUP上,會替代MASTER而成為MASTER的。

2、編輯網頁并進行測試

# service keepalived stop    ###停止keepalived
# yum -y install httpd   ###裝好web服務
# vim /var/www/html/index.html   ###編輯網頁
<h1>node1</h1>    ###HA1網頁内容
<h1>node2</h1>    ###HA2網頁内容
# service httpd start       ###啟動服務      

首先確定服務不會成為高可用叢集的故障,我們首先要啟動服務,然後進行測試。

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

   3、修改keepalived配置檔案并設定腳本

   這裡我們還需要将配置檔案中的内容修改,我們修改後的内容如下:

! Configuration File for keepalived
global_defs {
   notification_email {
         [email protected]
         [email protected]
   }
   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"
    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"
   interval 2
   weight -2
}
vrrp_instance VI_1 {
    interface eth0
        # interface for inside_network, bound by vrrp
    state MASTER
        # Initial state, MASTER|BACKUP
        # As soon as the other machine(s) come up,
        # an election will be held and the machine
        # with the highest "priority" will become MASTER.
        # So the entry here doesn't matter a whole lot.
    priority 101
        # for electing MASTER, highest priority wins.
        # to be MASTER, make 50 more than other machines.
    virtual_router_id 51
        # arbitary unique number 0..255
        # used to differentiate multiple instances of vrrpd
        # running on the same NIC (and hence same socket).
    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.58.1/16 dev eth0 label eth0:0
    }
        #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/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}
#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.58.2/16 dev eth0 label eth0:1
#    }
#    track_script {
#        chk_httpd
#        chk_mantaince_down
#    }
#
#    notify_master "/etc/keepalived/notify.sh master eth0:1"
#    notify_backup "/etc/keepalived/notify.sh backup eth0:1"
#    notify_fault "/etc/keepalived/notify.sh fault eth0:1"
#}      

開始的時候我就說過,我們這裡自己設定的有腳本,大家如果想配置,腳本的内容如下:

#vim notify.sh
腳本内容如下:
#!/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      

4、在HA2上編輯keepalived的配置檔案,完成後進行測試

# vim keepalived.conf      
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型
# service keepalived start   ###啟動keepalived
# ifconfig   ###在主伺服器上使用它      
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

這時候我們給HA1上使用了别名,我們使用别名通路一下。

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

   5、模拟MASTER出故障

這時候我們把主伺服器的Web伺服器停了,我們看看ip位址是否會飄移到從伺服器上。從下面的兩個圖可以看到,它真的轉移了,如果不相信我們可以測試下網頁,我們可以看到它的頁面内容也是我們原來設定從伺服器的内容。

# service httpd stop    ###停止主伺服器的Web服務      

主伺服器上:

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

從伺服器上:

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

  6、測試一下:

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

七、雙主模型

1、工作圖:

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

簡述:當用戶端發送通路上面的伺服器時,上面的伺服器比較繁忙,我們就要用兩台主機都進行工作,不過這裡我們要使用兩個虛拟IP位址,這兩個虛拟IP位址是不一樣的。我們這裡是兩個組,第一個組上面是主,下面是從,第二組下面是主,上面是從。如果有一個組中的MASTER挂了,它的VIP就會飄移到另一個組的上面。

2、修改配置檔案

在上面基于web服務的高可用叢集中,我們把keepalived配置檔案中的最下面#開頭的行開啟了,開啟後我們還要進行編輯,在HA1中将VI_2我們需要将state MASTER改為state BACKUP,我們把優先級改為100,隻要比MASTER的優先級小就行。内容如下:

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.58.2/16 dev eth0 label eth0:1
    }
    track_script {
        chk_httpd
        chk_mantaince_down
    }
    notify_master "/etc/keepalived/notify.sh master eth0:1"
    notify_backup "/etc/keepalived/notify.sh backup eth0:1"
    notify_fault "/etc/keepalived/notify.sh fault eth0:1"
}
# service keepalived restart   ###啟動keepalived伺服器
#ifconfig      

  3、檢視IP位址配置

   檢視HA1的IP位址配置:

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

檢視HA2的IP位址配置:

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

   4、測試:

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型
基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

   5、模拟HA1發生故障

# cd /etc/keepalived/
# touch down      

檢視HA2上IP位址配置:

基于Keepalived實作了LVS高可用及Web服務高可用包括主從模型和主主模型

   6、測試一下

我們會發現用172.16.58.6和172.16.58.7通路的都是由HA2傳回的結果。

繼續閱讀