基於keepalived 實現VIP轉移,lvs,nginx的高可用


一、Keepalived 高可用集群的解決方案

二、VRRP的有限狀態機

三、利用keepalived 實現主從VIP的切換

四、 實現在狀態轉變的時候自定義進行通知,

五、 實現負載均衡

六:實現nginx的高可用

一、Keepalived 高可用集群的解決方案

183501583.png

最初的誕生是為ipvs提供高可用的, 在后端的 realserver接收不到主節點的信息之后, keepalived能夠自己調用ipvsadm命令生成規則,能夠自動實現,將 主節點的 VIP以及ipvs規則“拿過來”,應用在從節點上,繼續為用戶服務 。 還可以實現對后端 realserver的健康狀況做檢測。

keepalived在一個節點上啟動之后,會生成一個Master主進程,這個主進程又會生成兩個子進程,分別是VRRP Stack(實現vrrp協議的) Checkers(檢測ipvs后端realserver的健康狀況檢測)

二、VRRP的有限狀態機

183601870.png

VRRP雙方節點都啟動以后,要實現狀態轉換的,剛開始啟動的時候,初始狀態都是BACKUP,而后向其它節點發送通告,以及自己的優先級信息,誰的優先級高,就轉換為MASTER,否則就還是BACKUP,這時候服務就在狀態為MASTER的節點上啟動,為用戶提供服務,如果,該節點掛掉了,則轉換為BACKUP,優先級降低,另一個節點轉換為MASTER,優先級上升,服務就在此節點啟動,VIP,VMAC都會被轉移到這個節點上,為用戶提供服務,

實驗環境:

虛擬主機版本:

CentOS6.4-i686

兩個節點:

node1.limian.com 172.16.6.1

node2.limian.com 172.16.6.10

准備

1、節點一:

同步時間:

[root@node1 ~]# ntpdate 172.16.0.1

安裝keepalived

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

2、節點二做同樣的工作

三、利用keepalived 實現主從VIP的切換

3.1我們修改下keepalived的配置文件:

[root@node1 ~]# cd /etc/keepalived/ [root@node1 keepalived]# cp keepalived.conf keepalived.conf.back //先給配置文件備份一下 [root@node1 keepalived]# vim keepalived.conf

3.2全局階段

global_defs {
   notification_email {                        //定義郵件服務的
        root@localhost //定義收件人,這里改為本機,只是測試使用 } notification_email_from kaadmin@localhost //定義發件人, smtp_server 127.0.0.1 //定義郵件服務器,一定不能使用外部地址 smtp_connect_timeout 30 //超時時間 router_id LVS_DEVEL }

3.3 定義 vrrp階段

 

vrrp_instance VI_1 {          //定義虛擬路由,VI_1 為虛擬路由的標示符,自己定義名稱
    state MASTER              //開啟后,該節點的優先級比另一節點的優先級高,所以轉化為MASTER狀態 interface eth0 //所有的通告等信息都從eth0這個接口出去 virtual_router_id 7 //虛擬路由的ID,而且這個ID也是虛擬MAC最后一段的來源,這個ID號一般不能大於255,且這個ID一定不能有沖突 priority 100 //初始優先級 advert_int 1 //通告的個數 authentication { //認證機制 auth_type PASS //認證類型 auth_pass 1111 //密碼,應該為隨機的字符串 } virtual_ipaddress { //虛擬地址,即VIP 172.16.6.100 } }

這樣我們主節點的配置文件就修改好了,需要復制到從節點上,再做適當的修改就可以使用了

[root@node1 keepalived]# scp keepalived.conf 172.16.6.1:/etc/keepalived/

3.4 登錄到從節點 ;

[root@node2 ~]# cd /etc/keepalived/
[root@node2 keepalived]# vim keepalived.conf vrrp_instance VI_1 { state BACKUP //修改從節點的狀態,主節點為MASTER,從節點就為BACKUP interface eth0 virtual_router_id 7 priority 99 //修改優先級,注意從節點的優先級一定要小於主節點 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.6.100 } }

3.5然后在主節點啟動服務

[root@node1 keepalived]# service keepalived start [root@node1 ~]# ip addr show //查看我們定義的VIP

184053712.png

3.6在從節點啟動服務

[root@node2 keepalived]# service keepalived start

把主節點上的服務停掉,看VIP會不會到從節點上

[root@node2 ~]# ip addr show

184225729.png

3.7在主節點上啟動服務

 

[root@node1 ~]# service keepalived start [root@node1 ~]# ip addr show //檢測結果發現VIP轉移到了主節點

注:

 

默認情況下ARRP工作在“搶占模式”下,如果發現一個節點的服務停止了,另一個節點會立即把VIP和VMAC“搶過來”,如果在“非搶占模式”下,無論你的優先級過高,一個節點服務停止,另一個節點也不會“搶”VIP和VMAC,除非這個節點掛了,兩一個節點才會“搶”。

 

四、 實現在狀態轉變的時候自定義進行通知,

 

4.1這需要依賴於腳本來完成

 

主節點

 

[root@node1 ~]# cd /etc/keepalived/
[root@node1 keepalived]# vim notify.sh //編寫腳本 #!/bin/bash vip=172.16.6.100 contact='root@localhost' thisip=`ifconfig eth0 | awk '/inet addr:/{print $2}' | awk -F: '{print $2}'` Notify() { mailsubject="$thisip is to bi $vip master" mailbody="vrrp transaction, $vip floated to $thisip" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master exit 0 ;; backup) notify backup exit 0 ;; fault) notify fault exit 0 ;; *) echo 'Usage: `basename $0` {master|backup|fault}' exit 1 ;; esac [root@node1 keepalived]# chmod +x notify.sh [root@node1 keepalived]# ./notify.sh master [root@node1 keepalived]# mail //查看有沒有收到通知 Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 1 message 1 new >N 1 root Wed Sep 25 14:54 18/668 "172.16.6.10 is to bi 172.16.6.100 mas" &

轉換狀態查看是否會收到通知

 

[root@node1 keepalived]# ./notify.sh backup
[root@node1 keepalived]# ./notify.sh fault [root@node1 keepalived]# mail Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 3 messages 2 new 1 root Wed Sep 25 14:54 19/679 "172.16.6.10 is to bi 172.16.6.100 mas" >N 2 root Wed Sep 25 14:57 18/668 "172.16.6.10 is to bi 172.16.6.100 mas" N 3 root Wed Sep 25 14:57 18/668 "172.16.6.10 is to bi 172.16.6.100 mas" &

說明腳本正常工作,那么去編輯配置文件

 

[root@node1 keepalived]# vim keepalived.conf

在全局階段添加

 

vrrp_script chk_mantaince_down{   //定義可以手動控制狀態的腳本
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 //檢查時間間隔 weight -2 //如果檢測失敗,優先級-2 }

在 vrrp階段添加如下幾行

 

track_script {     //引用定義的腳本
       chk_mantaince_down
    }
  notify_master"/etc/keepalived/notify.sh master" notify_backup"/etc/keepalived/notify.sh backup" notify_fault"/etc/keepalived/notify.sh fault"

 

4.2將該腳本復制到另一個節點,

 

[root@node1 keepalived]# scp notify.sh 172.16.6.1:/etc/keepalived/

並在配置文件中相應的位置添加相同內容

 

兩個節點都重啟服務

 

4.3讓主節點變成從節點

root@node1 keepalived]# touch down

通過監控,發現主節點立即變成從節點,並收到一封郵件

 

[root@node1 keepalived]# tail -f /var/log/messages You have new mail in /var/spool/mail/root

五、 實現負載均衡

 

5.1 編輯配置文件

 

[root@node1 keepalived]# vim keepalived.conf
#####負載均衡階段################# virtual_server 172.16.6.100 80 { //指定VIP和端口 delay_loop 6 //延遲多少個周期再啟動服務,做服務檢測 lb_algo rr loadbalance 負載均衡調度算法 lb_kind DR 類型 nat_mask 255.255.0.0 掩碼 persistence_timeout 0 持久連接時間 protocol TCP //協議 real_server 172.16.6.11 80 { //定義后端realserver的屬性 weight 1 HTTP_GET { //定義檢測的方法 url { //檢測的URL path / status_code 200 //獲取結果的狀態碼 } connect_timeout 3 //連接超時時間 nb_get_retry 3 //嘗試次數 delay_before_retry 3 //每次嘗試連接的等待時間 } } real_server 172.16.6.12 80 { //定義后端realserver的屬性 weight 1 HTTP_GET { //定義檢測的方法 url { //檢測的URL path / status_code 200 //獲取結果的狀態碼 } connect_timeout 3 //連接超時時間 nb_get_retry 3 //嘗試次數 delay_before_retry 3 //每次嘗試連接的等待時間 } } }

5.2、在從節點上做同樣的修改

 

5.3重啟服務並用ipvsadm命令檢測是否會生成規則

 

[root@node1 keepalived]# service keepalived restart [root@node1 keepalived]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.6.100:80 rr [root@node1 keepalived]#

但是為什么沒有我們定義的兩個 realserver呢?那是因為沒啟動虛擬機呢,健康狀況檢測沒通過,就不會顯示了,我們去啟動一個虛擬機,並啟動服務即可。

 

並執行如下命令,做lvs負載均衡的DR模型

 

#ifconfig lo:0 172.16.6.11 broadcast 172.16.6.11 netmask 255.255.255.255 up #route add -host 172.16.6.11 dev lo:0 #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

注:

 

1、后端的realserver的數量可以添加多台,但是需要在主節點的配置文件中給出相應的配置,並在添加的realserver上執行相關命令即可

 

2、盡管keepalived可以自行添加ipvs規則,實現負載均衡,但是無法實現動靜分離,在生產環境中我們要根據場景選擇最佳的方案。

 

六:實現nginx的高可用

 

6.1前提

 

兩個節點上都裝上nginx服務,並確保httpd沒啟用

 

# netstat -tunlp //確保80端口沒占用

 

# service nginx start

 

6.2為每個節點的 nginx編輯一個頁面,以便於效果更直觀一些

 

[root@node1 ~]# vim /usr/share/nginx/html/index.html //節點1 172.16.6.10 [root@node2 ~]# vim /usr/share/nginx/html/index.html //節點2 172.16.6.1

6.3確保nginx可以正常訪問

 

184735882.png

 

6.4然后停掉服務,

 

[root@node1 keepalived]# vim notify.sh //修改腳本,讓它可以監測nginx服務,並可以啟動或關閉服務
################## case "$1" in master) notify master /etc/rc.d/init.d/nginx start exit 0 ;; backup) notify backup /etc/rc.d/init.d/nginx stop exit 0 ;; fault) notify fault /etc/rc.d/init.d/nginx stop exit 0 ;; ######################################

6.5同步腳本到節點2

 

[root@node1 keepalived]# scp notify.sh 172.16.6.1:/etc/keepalived/

6.6在主節點上

 

[root@node1 keepalived]# touch down [root@node1 keepalived]#ss -tunl //發現80端口未被監聽 [root@node1 keepalived]# rm -f down [root@node1 keepalived]#ss -tunl //發現80端口已經被監聽

引用:http://www.tuicool.com/articles/eu26Vz


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM