基於Keepalived實現LVS雙主高可用集羣

前言

前面說過基於heartbeat的LVS高可用方案,今天帶來另一種解決方案:基於Keepalived實現LVS雙主高可用集羣。什麼是Keepalived呢,keepalived觀其名可知,保持存活,在網絡裏面就是保持在線了, 也就是所謂的高可用或熱備,用來防止單點故障的發生。本文將詳細講述Keepalived工作原理及高可用解決方案的實現。

相關介紹

Keepalived簡介

Keepalived採用VRRP(virtual router redundancy protocol,虛擬路由冗餘協議)熱備份協議,以軟件的方式實現linux服務器的多機熱備功能。VRRP是針對路由器的一種備份解決方案——由多臺路由器組成一個熱備組。通過共用的虛擬IP地址對外提供服務;每個熱備組內同一時刻只有一臺主服務器提供服務,其他服務器處於冗餘狀態,若當前在線的服務器失敗,其他服務器會自動接替(優先級決定接替順序)虛擬IP地址,以繼續提供服務。

工作原理

Keepalived組件介紹

core:keepalived的核心,複雜主進程的啓動和維護,全局配置文件的加載解析等

check:負責healthchecker(健康檢查),包括了各種健康檢查方式,以及對應的配置的解析包括LVS的配置解析

vrrp:VRRP子進程,VRRP子進程就是來實現VRRP協議的

libip*:LVS相關


wKioL1V_oFXj-IgtAACUoeU32Uk238.gif

由圖可知,兩個子進程都被系統WatchDog看管,兩個子進程各自負責自己的事,healthchecker子進程負責檢查各自服務器的健康程度,例如HTTP,LVS等等,如果healthchecker子進程檢查到MASTER上服務不可用了,就會通知本機上的VRRP子進程,讓他刪除通告,並且去掉虛擬IP,轉換爲BACKUP狀態。

高可用解決方案

實驗拓撲

wKioL1V_4wXzKIbEAAFaRuGMwlU686.jpg

配置過程

HA集羣配置前提

時間同步、基於主機名互相通信、SSH互信

請確保兩個節點時間同步,可用ntpdate向時間服務器同步

[root@node1 ~]# ntpdate cn.pool.ntp.org

基於主機名互相通信

[root@node1 ~]# vim /etc/hosts
  
172.16.10.123   node1.scholar.com node1
172.16.10.124   node2.scholar.com node2
  
[root@node1 ~]# vim /etc/sysconfig/network
HOSTNAME=node1.scholar.com
  
[root@node1 ~]# uname -n
node1.scholar.com
  
#兩個節點都需如上操作

SSH互信

[root@node1 ~]# ssh-keygen -t rsa -P ''
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2
[root@node2 ~]# ssh-keygen -t rsa -P ''
[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
[root@node1 ~]# date; ssh node2 'date' #測試
Tue Jun 16 13:31:39 CST 2015
Tue Jun 16 13:31:39 CST 2015

安裝所需程序

[root@node1 ~]# yum install keepalived -y

#兩個節點都需安裝

配置keepalived

[root@node1 ~]# vim /etc/keepalived/keepalived.conf 

vrrp_instance VI_1 {        #定義VRRP實例,實例名自定義
    state MASTER            #指定Keepalived的角色,MASTER爲主服務器,BACKUP爲備用服務器
    interface eth0          #指定HA監測的接口
    virtual_router_id 51    #虛擬路由標識(1-255),在一個VRRP實例中主備服務器ID必須一樣
    priority 100            #優先級,數字越大越優先,主服務器優先級必須高於備服務器
    advert_int 1            #設置主備之間同步檢查時間間隔,單位秒
    authentication {        #設置驗證類型和密碼
        auth_type PASS      #驗證類型
        auth_pass ab007     #設置驗證密碼,同一實例中主備密碼要保持一致
    }
    virtual_ipaddress {     #定義虛擬IP地址
        192.168.12.23
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 61
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass sr200
    }
    virtual_ipaddress {
        192.168.13.23
    }
}

virtual_server 192.168.12.23 80 {    #設置虛擬服務器
    delay_loop 6                     #設置健康狀態檢查時間
    lb_algo rr                       #設置負載調度算法
    lb_kind DR                       #設置LVS實現負載均衡的機制
    nat_mask 255.255.255.0           #設置掩碼
    persistence_timeout 50           #會話保持時間
    protocol TCP                     #指定轉發協議類型
    sorry_server 127.0.0.1 80        #設置應急服務器        
    real_server 172.16.10.125 80 {   #後端服務器節點
        weight 1                     #設置服務節點的權重
        HTTP_GET {                   #設置檢測方式
            url {
              path /
              status_code 200        #設定返回狀態碼爲200表示Realserver存活
            }
            connect_timeout 2        #設置響應超時時間
            nb_get_retry 3           #設置超時重試次數
            delay_before_retry 1     #設置超時重試間隔
        }
    }
  real_server 172.16.10.126 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}  

virtual_server 192.168.13.23 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP 
    sorry_server 127.0.0.1 80       
    real_server 172.16.10.125 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 172.16.10.126 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

將配置文件同步給另一個節點

[root@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/
keepalived.conf                                           100% 2196     2.1KB/s   00:00

修改另一個節點配置文件

[root@node2 ~]# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ab007
    }
    virtual_ipaddress {
        192.168.12.23
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass sr200
    }
    virtual_ipaddress {
        192.168.13.23
    }
}

#其他配置不變

Real Server配置

配置內核參數及VIP

wKioL1V_3QDD8_z2AAGja8oSVwM260.jpg

準備測試頁面

wKiom1V_2_zDUQjMAABlq1BSRog135.jpg

#兩個RS節點都執行以上操作

測試頁面

wKioL1V_3knw7NMsAABe5ZfHagA704.jpg

keepalived節點準備應急頁面

wKiom1V_3tGDY1w3AABbX2m87MA224.jpg

#兩節點都需執行此操作

測試

啓動keepalived

wKiom1V_4hDQrbFTAABrvguRyWc873.jpg

查看兩節點的ip和ipvs規則情況

wKiom1V_4o7D8tT2AALE8Yvdzyw679.jpg

wKiom1V_4uXgoHVUAALElLkr1us510.jpg

#兩個節點各生成了兩組規則,因爲VIP只有一組,所以只有一組生效

訪問測試

wKiom1V_5W3ytb2RAACNkDzdVls362.jpg

wKioL1V_5y3iKwqoAACNjcpL5CQ079.jpg

wKioL1V_59aD84jqAACRGnQv-0k068.jpg

wKiom1V_50DBlGrzAACTTCEdDtw075.jpg

模擬其中一個主節點故障

[root@node1 ~]# service keepalived stop

再次查看兩節點的ip和ipvs規則情況

wKiom1V_6OXQiHalAAIQh1tToDQ703.jpg

wKioL1V_6qjgMK-1AALkiAmXecQ956.jpg

由此可見,一個主節點掛掉以後所有的VIP和ipvs規則都會轉移到另一個節點,所以訪問也不會受到任何影響,這裏就不再測試。如果故障節點重新上線,資源還會再次回到工作節點。

下面我們模擬兩個RS節點全部故障,看一下sorry_server是否可以工作

[root@scholar ~]# service httpd stop

#兩個RS全部停止服務

查看ipvs規則

wKiom1V_6ozyHRXlAADpS-wYOX4829.jpg

real server已全部下線,應急服務器上線

wKiom1V_68iiDdUnAACLex9DzBI745.jpg

wKioL1V_7YagFSFqAACKPYnN4vw313.jpg

sorry_server響應成功,至此,基於Keepalived實現LVS雙主高可用集羣實驗完成

The end

基於Keepalived實現LVS雙主高可用解決方案就說到這裏了,通過實驗可以看出使用keepalived構建LVS羣集更加簡便易用,如果實驗過程中遇到問題可留言交流。以上僅爲個人學習整理,如有錯漏,大神勿噴~~~

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