基于KeepAlived雙主模型的高可用LVS的實現


簡介

KeepAlived是網絡協議VRRP(Virtual Route Redundancy Protocol 虛擬路由冗余協議)協議的實現。
KeepAlivedLinux集群管理中保證集群高可用的一個服務軟件,其功能是用來防止單點故障。具體來說,其作用是檢測服務器的狀態,如果有一臺web服務器宕機,或工作出現故障,KeepAlived將會檢測到,并將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后KeepAlived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。
KeepAlived的工作原理
通過了解VRRP協議來了解KeepAlived的工作原理。
VRRP協議:Virtual Route Redundancy Protocol 虛擬路由冗余協議。是一種容錯協議,保證當主機的下一跳路由出現故障時,由另一臺備用路由器來代替出現故障的路由器進行工作,從而保持網絡通信的連續性和可靠性。這些路由器組成了一個虛擬路由器,其中包含一個Master 路由器和多個 Backup 路由器。主機將虛擬路由器當作默認網關。一個虛擬路由器可以擁有一個或多個IP 地址。


實驗實現基于KeepAlived雙主模型的高可用LVS

需求分析

如下圖所示

基于KeepAlived雙主模型的高可用LVS的實現.jpg
FQDN IP
images.king.com VIP1
192.168.1.100
app.king.com VIP2
192.168.1.200

當客戶端訪問images.king.com的時候,是通過VIP1訪問,最終后端提供服務的是WEBSRV1和WEBSRV2;當客戶端訪問app.king.com的時候,是通過VIP2訪問,后端提供服務的是WEBSRV3和WEBSRV4。當用戶訪問其中一個站點的時候,單個LVS服務器可以提供負載均衡,將前端的請求調度到后端的兩臺WEBSRV上,但是一臺LVS無法避免單點失敗的問題,所以考慮用兩臺LVS服務器配合KeepAlived來實現高可用性。同時,企業提供兩個站點的服務,如果每個站點都采用兩臺LVS來實現高可用性,那么需要四臺LVS,成本比較高,而且正常情況下,有兩臺LVS服務器處于空閑中。可以考慮采用KeepAlived + LVS 雙主模型的方式來實現這種需求。
雙主模型。即針對VIP1,LVS1是MASTER,LVS2是BACKUP,此時,VIP1漂在LVS1上面,LVS1負責調度后端的WEBSRV1和WEBSRV2。針對VIP2,LVS2是MASTER,LVS1是BACKUP,此時,VIP2漂在LVS2上面,LVS2負責調度后端的WEBSRV3和WEBSRV4。當LVS1或者LVS2服務器出現故障的時候,那么此時出故障的LVS上面的VIP將漂移到另一臺LVS上面,并且原來負責的兩臺后端WEBSRV將由正常的LVS接管。這就是大致的實現過程。

實驗環境準備

確保所有虛擬機(centos7.3)上面的防火墻和selinux處于關閉狀態。
各節點時間必須同步
找一臺機器A與國內一臺常用的NTP服務器同步時間,企業里面其他的機器與A機器同步時間。
各節點之間通過主機名互相通信,建議使用/etc/hosts文件實現
各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信

實驗過程

一、配置客戶端CLIENT

vim /etc/hosts
# 添加下面兩行
192.168.1.100     images.king.com
192.168.1.200     app.king.com

二、在WEBSRV1和WEBSRV2上面
WEBSRV2的配置和WEBSRV1的配置大致相同,下面以WEBSRV1為例介紹一下。

# 如果沒有安裝httpd就安裝
yum install httpd
# 啟動服務
systemctl start httpd
# 準備頁面,如果是WEBSRV2,就把WEBSRV1 改為WEBSRV2
echo "WEBSRV1 images" > /var/www/html/index.html
# 準備RS腳本
vim lvs_dr_rs.sh
#!/bin/bash
vip=192.168.1.100
mask='255.255.255.255'
dev=lo:1
case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $dev $vip netmask $mask broadcast $vip up
    route add -host $vip dev $dev
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*) 
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac
# 執行RS腳本
bash lvs_dr_rs.sh start
# 查看回環網卡上面是否綁定了vip  192.168.1.100
ip a

三、在WEBSRV3和WEBSRV4上面
WEBSRV4的配置和WEBSRV3的配置大致相同,下面以WEBSRV3為例介紹一下。

# 如果沒有安裝httpd就安裝
yum install httpd
# 啟動服務
systemctl start httpd
# 準備頁面,如果是WEBSRV4,就把WEBSRV3 改為WEBSRV4
echo "WEBSRV3 app" > /var/www/html/index.html
# 準備RS腳本
vim lvs_dr_rs.sh
#!/bin/bash
vip=192.168.1.200
mask='255.255.255.255'
dev=lo:1
case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $dev $vip netmask $mask broadcast $vip up
    route add -host $vip dev $dev
    echo "The RS Server is Ready!"
    ;;
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;
*) 
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;
esac
# 執行RS腳本
bash lvs_dr_rs.sh start
# 查看回環網卡上面是否綁定了vip 192.168.1.200
ip a

四、配置LVS1的KeepAlived

# 安裝ipvsadm,用于查看ipvs規則
yum install ipvsadm 
# 查看一下,目前來說是空的
ipvsadm -Ln
# 安裝KeepAlived
yum install keepalived
# 配置keepalived
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from node1@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1 
   vrrp_mcast_group4 224.100.100.100
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 411fa9f6
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 192.168.1.100 80 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.1.14 80 {
        weight 2
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.15 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 66
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123fa9f6
    }
    virtual_ipaddress {
        192.168.1.200/24
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 192.168.1.200 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.1.16 80 {
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.66 80 {
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}
# MASTER和BACKUP切換的郵件通知腳本
cat /etc/keepalived/notify.sh
#!/bin/bash
        contact='root@localhost'
        notify() {
        mailsubject="$(hostname) to be $1, vip floating"
        mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
        echo "$mailbody" | mail -s "$mailsubject" $contact
        }
        case $1 in
        master)
        notify master
        ;;
        backup)
        notify backup
        ;;
        fault)
        notify fault
        ;;
        *)
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
        ;;
        esac
# keepalived記錄日志 ,修改/etc/sysconfig/keepalived對應的行
KEEPALIVED_OPTIONS="-D -S 2" 
# 在/etc/rsyslog.conf添加一行
local2.*                /var/log/keepalived.log
# 重啟日志服務
systemctl restart rsyslog
# 準備sorry server
yum install httpd
systemctl start httpd
echo sorry,server > /var/www/html/index.html
# 啟動keepalived服務
systemctl start keepalived

五、配置LVS2的KeepAlived
LVS2的配置大致和LVS1相同,主要是KeepAlived的配置不同,現將KeepAlived的配置說明如下。

cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from node2@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2 
   vrrp_mcast_group4 224.100.100.100
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 411fa9f6
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 192.168.1.100 80 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.1.14 80 {
        weight 2
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.15 80 {
        weight 1
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123fa9f6
    }
    virtual_ipaddress {
        192.168.1.200/24
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 192.168.1.200 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.1.16 80 {
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.66 80 {
        HTTP_GET {
            url {
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

}

六、在CLIENT上進行測試
測試一:
for i in {1..15};do curl images.king.com; done
for i in {1..15};do curl app.king.com; done
按照調度算法正常進行服務調度。
測試二:
for i in {1..50};do sleep 0.5; curl images.king.com;done
for i in {1..50};do sleep 0.5; curl app.king.com;done
斷開LVS1或者LVS2的網絡,兩個站點依然正常訪問。
此時,VIP1和VIP2集中在一臺正常工作的LVS上面。
測試三:
for i in {1..50};do sleep 0.5; curl images.king.com;done
停掉WEBSRV1或者WEBSRV2,images.king.com站點依然可以正常訪問。
for i in {1..50};do sleep 0.5; curl app.king.com;done
停掉WEBSRV3或者WEBSRV4,app.king.com站點依然可以正常訪問。
測試四:
for i in {1..50};do sleep 0.5; curl images.king.com;done
把WEBSRV1和WEBSRV2的httpd服務都停掉,發現顯示的是sorry,server,前端調度器充當了WEBSRV。
for i in {1..50};do sleep 0.5; curl app.king.com;done
把WEBSRV3和WEBSRV4的httpd服務都停掉,發現顯示的是sorry,server,前端調度器充當了WEBSRV。


至此,實驗介紹結束,不足之處,請多指正!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容