keepalived實現lvs雙主架構及狀態切換的通知

理論部分:linux

    keepalived:爲lvs開發的(director: HA  ipvs rules, health check),可以爲LVS生成規則,並檢測後部real server的健康狀態。主要是在兩個或多個節點上實現vrrp協議選舉機制。主節點稱爲Master,從節點稱爲Backup。它也能夠爲其它服務作高可用。nginx

  

    vrrp 虛擬冗餘路由協議 (virtual redundent routing protocol),在兩臺或多臺設備上配置同一個虛擬IP地址和虛擬MAC地址,在實際工做時,這些設備根據某種法則選舉出一個主設備,當主設備故障時,其它設備會再根據某種法則選舉出另外一個主設備。這樣在一臺節點掛掉後,會有從節點設備頂上,就實現了路由設備的高可用。客戶端須要把網關配置成虛擬IP就能夠。web

    Keepalived在配置好所的節點同時啓動時,全部節點都工做在從節點模式,這時都沒法響應請求,全部節點會根據事先定義的優先級來計算出那個節點是主節點。優先級從1到255間的數值,數據越大優先級越高。當選舉了主節點後,主節點才能夠響應用戶的請求。不過只有主節點才能夠響應用戶的請求。在選舉主節點的過程當中,若是你們的優先級同樣,就會根據各自的IP來比較,IP大的優先級高。選舉出主節點後,主節點會每隔必定的時間向其它備節點通告心跳信息,通告時會帶有優先級。從節點在收到通告後,會拿到通告中的優先級和本身的優先級作比較,一但發現本身的優先級比心跳信息中的優先級高,就會取而代之成爲主節點。當掛掉的主節點從新上線,這時是否會把主節點搶過來,就須要事先定義Keepalived是否爲搶佔模式preempt 搶佔模式和nopreempt 非搶佔模式。在虛擬IP切換時會有切換時間,切換過程當中會形成沒法響應客戶端的請求。由於一個虛擬IP同時只能讓一臺設備工做,從設備只能作備份,爲了讓從也備也分攤一部分流量能夠作多組虛擬IP。每一個設備都是主節點,全部節點間相互作備份。每組虛擬路由間用虛擬路由器標示(VRID)。VRID用數據標識,1到255之間的數字。後端

Keepalived軟件的組件centos

    IPVS:用來和ipvs接×××互的工具,爲ipvs應用生成的規則。瀏覽器

    NETLINK:經過NETLINK組件來配置網絡接口,和監控網絡接口。bash

    IPVS wrapper:爲ipvs生成規則,並藉助Checkers監視後端的real server。服務器

    Nnetlink Reflector:向其它節點發送通告信息網絡

    VRRP Stack:Keepalived的VRRP實現app

    Checkers:用來爲ipvs生成的規則中的各real server健康狀態檢測的。能夠基於tcp檢測,能夠根據應用層協議檢測。

    WatchDog:用來檢測Keepalive各個工做組件的健康狀態。各個組件會每隔必定的時間向WatchDog通告下本身,若是長時間沒有收到通告,WatchDog會重啓這個沒有發送通告的組件。它存在的主要是用來實現不會由於Keepalived內部問題致使集羣不正常。


Keepalived 是一個輕量級調度器,適用場景:lvs , nginx代理,haproxy代理。


節點的狀態:

    master        主節點狀態

    backup      從狀態

    Initialized  初始化狀態,keepalived服務剛啓動時的狀態。

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

操做部分

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

實驗拓撲圖

spacer.gifwKiom1Qc_mii0qPQAAHEO_5QUxY750.jpg

實驗環境:

    1,4臺服務器操做系統爲centos6.5。

    2,兩臺webserver爲httpd,使用yum安裝。而且測試能夠正常訪問web服務。

    3,兩臺lvs節點keepalived使用yum安裝。

    4,lvs使用dr模式工做。

    5,客戶機是一臺win8。

    6,每一個lvs節點定義sorry server爲本機。

實驗目標:

    1,使用keepalived實現lvs的高可用,而且監測後端real server的健康狀態。

    2,瞭解keepalived的工做原理和適用場景。

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

配置大致過程:

    1,爲兩臺web服務器安裝啓動httpd服務,並配置vip。

    2,爲兩臺lvs服務器安裝並配置keepalived。

    3,測試各個配置是否正常工做

    4,爲兩臺keepalived配置狀態切換後的報警機制

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

首先保證兩臺服務器web訪問正常,sorry server也能夠正常做。

爲兩臺web服務器分別配置vip,先定義linux內核對於arp協議的響應方式。

# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore             
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

配置虛擬ip,而且指定請求是那個Ip,響應時就使用那個ip響應。

# ifconfig lo:0 192.168.1.16 netmask 255.255.255.255 broadcast 192.168.1.16
# ifconfig lo:1 192.168.1.18 netmask 255.255.255.255 broadcast 192.168.1.18
# route add -host 192.168.1.16 dev lo:0 # route add -host 192.168.1.18 dev lo:1

    注意: 爲了重啓後配置生效,須要把這些寫到配置文件中。或都寫一個腳本,開機自動設定配置信息也可。

爲兩臺lvs服務器分別安裝keepalived,而且編輯配置文件。

# yum -y install keepalived

第一個lvs的主配置文件內容以下。

! Configuration File for keepalived

global_defs {
   notification_email {
	admin@wukui.com
   }
   notification_email_from lvsadmin@wukui.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DIRECTOR
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 1
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	192.168.1.16/24
    }
}

virtual_server 192.168.1.16 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    net_mask 255.255.255.0

    real_server 172.16.2.10 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 172.16.2.17 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 2
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	192.168.1.18/24
    }
}

virtual_server 192.168.1.18 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 1
    protocol TCP
    sorry_server 127.0.0.1 80
    net_mask 255.255.255.0
    real_server 172.16.2.10 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 172.16.2.17 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
第二個lvs節點配置內容以下
! Configuration File for keepalived

global_defs {
   notification_email {
	admin@wukui.com
   }
   notification_email_from lvsadmin@wukui.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DIRECTOR
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	192.168.1.16/24
    }
}

virtual_server 192.168.1.16 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    net_mask 255.255.255.0

    real_server 172.16.2.10 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 172.16.2.17 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 2
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	192.168.1.18/24
    }
}

virtual_server 192.168.1.18 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 1
    protocol TCP
    sorry_server 127.0.0.1 80
    net_mask 255.255.255.0
    real_server 172.16.2.10 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 172.16.2.17 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
LVS兩臺節點配置好Keepalived後分別啓動。啓動命令:

# service keepalived start
        注:keepalived啓動後的詳細工做日誌都記錄在/var/log/messages中。可使用tail -f /var/log/messages 監視。
keepalived啓動後開啓作相應的測試工做:
    1,關閉其中一臺keepalived服務,到另外一臺節點上查看是否把資源轉移到了本機上。查看方法:
        使用:ip addr show 命令來查看vip是否配置在本地,或查看日誌的詳細記錄
    2,在客戶端瀏覽器分別訪問 192.168.1.16 和 192.168.1.18 ,肯定能夠訪問到。按上面的配置,lvs負載均衡有持久會話,因此大概在一分鐘之內同一個客戶端會一直打開一個real server的頁面。
    3,把後端全部real server 服務器的httpd進程關閉,而後再訪問vip,測試 sorry server是否能夠正常工做。

在上面的配置中尚未加入keepalived主從切換或都出現錯誤的報警通知。須要再兩臺節點的主配置文件中每一個實例中加入如下配置。這個配置根據實際狀況是否須要來配置。不少狀況下,監控軟件定義發送郵件報警級別設置不當,致使咱們運維人員收到的郵件過多,看不過來還不如不報警呢!下面爲示例:
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 2
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.18/24
    }
    notify_master "/bin/echo '節點1狀態切換到master' | mail -s '節點1狀態切換' root@localhost"
    notify_backup "/bin/echo '節點1狀態切換到backup' | mail -s '節點1狀態切換' root@localhost"
    notify_fault "/bin/echo '節點1狀態切換到fault' | mail -s '節點1狀態切換'root@localhost"
}
    測試,在命令行中使用mail命令查看郵件是否收到。這裏只是發給本機。
    根據節點狀態切換能夠觸發某一個操做,就能夠定義本身的腳原本完成不少任務,想向空間無限大!!!
相關文章
相關標籤/搜索