keepalived問題闡述及配置


keepalived問題闡述及配置

    <li style="font-size:18px;font-weight:bold">產生背景:一般來說,主機通過設置默認網關來與外部網絡聯系,網關出現問題時,主機與外部的網絡就會中斷。如果手動修改網關,那會經網絡管理員帶來無盡的麻煩,為了解決這個問題,給網關做備份。<br /><br />
    
     <li style="font-size:18px;font-weight:bold">VRRP是一種容錯協議,它保證當主機的下一跳路由器出現故障時,由另一台路由器來代替出現故障的路由器進行工作,從而保持網絡通信的連續性和可靠性。
     
    	相關術語:
    		虛擬路由:由一個Master路由器和多個Backup路由器組成。主機將虛擬路由器當作默認網關。
    		VRID:虛擬路由器的標識,有相同VRID的一組路由器構成一個虛擬路由器
    		Master:虛擬路由器中承擔報文轉發任務的路由器
    		Backup:Master路由器出現故障時,能夠代替Master路由器工作的路由器
    		虛擬IP地址:一個虛擬路由器可以擁有一個或多個IP地址
    		IP地址擁有者:接口IP地址與虛擬IP地址相同的路由器被稱為IP地址擁有者
    		虛擬MAC地址:一個虛擬路由器擁有一個虛擬MAC地址,虛擬MAC地址的格式為00-00-5E-00-01-VRID,路由器回應ARP請求使用的是虛擬MAC地址
    		優先級:VRRP根據優先級來確定虛擬路由器中每台路由器的地位。
    		<br /><br />
    		
    <li style="font-size:18px;font-weight:bold">虛擬路由器簡介:
    	VRRP將局域網內的一組路由器划分在一起,形成一個VRRP備份組,它在功能上相當於一台虛擬路由器,使用虛擬路由器號進行標識。<br /><br />
    	
    <li style="font-size:18px;font-weight:bold">VRRP工作過程:
    	(1)路由器通過發送免費ARP報文,將自己的虛擬MAC地址通知給與它連接的設備或者主機,從而承擔報文轉發任務
    	(2)	免費ARP,自問自答,虛擬ip拿走后,主動發送arp廣播,在自己回答,客戶機就會更新arp緩存,從而網絡中的主機感知不到Master路由器已經切換為另一台設備。
    	<br /><br />
    <li style="font-size:18px;font-weight:bold">VRRP Master 選舉機制:<br />
    	(1)如果VRRP報文中Master路由器的優先級高於自己的優先級,則路由器保持在Backup狀態。<br />
    	
    	一般主路由器處於Master狀態,備份路由器處於Backup狀態<br />
    	Master和Backup之間需要實時通信,Master路由器周期性地發送VRRP報文,在虛擬路由器中公布其配置信息(優先級等)和工作狀況。Backup路由器通過接收到VRRP報文的情況來判斷Master路由器是否工作正常,其過程中VRRP狀態上報機制如下(簡要):<br /><br />
    		
    		VRRP通告報文時間間隔定時器:<br />
    			I、如果Backup路由器在等待了3個時間間隔后,依然沒有收到VRRP通告報文,則認為自己是Master路由器,並對外發送VRRP通告報文,重新進行Master路由器的選舉。<br />
    			II、如果Master發現自己的鏈路不通,Master路由器主動放棄Master地位<br /><br />
    		
    		VRRP搶占延遲時間定時器:<br />
    			I、在性能不穩定的網絡中,Backup路由器可能因為網絡堵塞而在Master_Down_Interval期間內沒有收到Master路由器的報文,而主動搶占為Master位置,如果此時原Master路由器報文又到達了,就會出現虛擬路由器的成員頻繁的進行Master搶占現象。為了避免組內成員頻繁進行主備狀態轉換,特制定了延遲等待定時器,就是在時間間隔定時器后不立馬搶占,而是在等待延遲定時器,時間全都結束了,才會搶占Master。
    			
    		<br /><br />	
    <li style="font-size:18px;font-weight:bold">Backup搶占方式:<br />
    	(1)非搶占方式:只要Master路由器沒有出現故障,Backup路由器即使隨后被配置了更高的優先級也不會成為Master路由器<br />
    	(2)搶占式(默認):Backup一旦發現自己的優先級比當前Master路由器的優先級高,就會對外發送VRRP通告報文,導致備份組內路由器重新選舉Master路由器,並最終取代原有Master路由器。相應地,原Master路由器會變成Backup路由器
    	
    	<br /><br />
    	
    <li style="font-size:18px;font-weight:bold">認證方式:<br />
    	(1)無認證:不提供安全性保障<br />
    	(2)Simple(簡單字符認證):發送VRRP報文的路由器將認證字填入到VRRP報文中,而收到VRRP報文的路由器會將收到的VRRP報文中的認證字進行比較。如果認證字相同,則認為接收到的報文是合法的VRRP報文,否則認為接收到的報文是非法報文。
    	(3)	md5認證:
    	<br /><br />
    
    <li style="font-size:18px;font-weight:bold">VRRP虛擬轉發器監視功能:<br />
    	VRRP的監視接口能更好的擴充了備份功能,不僅能在備份組中的某路由器的接口出現故障時提供備份功能,還能在路由器的其它接口(比如連接上行鏈路的接口)不可用時提供備份功能,
    		路由器連接上行鏈路的接口出現故障時,備份組無法感知上行鏈路的故障,如果該路由器此時處於Master狀態,將會導致局域網內的主機無法訪問外部網絡。通過監視
    
  1. 問題:怎么完成維護模式keeplived切換(完成keepalived高可用)?

    答:我們一般進行主從切換測試時都是關閉keepalived或關閉接口,有沒有一種方法能夠實現在不關閉keepalived下或網卡接口來實現維護呢?在新版keepalived中,支持腳本vrrp_script,只需要創建個文本做引子,來讓腳本成功執行,就會自動進行主備切換了。

    (1)定義腳本

    vrrp_script chk_schedown {
            script "[ -e /etc/keepalived/down ] && exit 1 || exit 0"
            interval 1    //監控間隔
            weight -11    //主動減少優先級
            fall 2        //監控失敗次數
            rise 1        //監控成功次數
    }
    vrrp_script chk_nginx {
            script "`killall -0 nginx` && exit 0 || exit 1"  //測試能不能殺掉nginx,為1才會執行以下操作
            interval 1
            weight -11
            fall 2 
            rise 1
    }
    

    (2)執行腳本:在實例中調用執行

    track_script {
    	chk_schedown   //執行定義的腳本名稱
    	chk_nginx
    }
    


    在keepalived配置文件中直接寫后端服務器的負載均衡效果時,keepalived會自己調用lvs的api接口去寫規則,並且生效

    ~]# ip addr add 192.168.1.100 dev eth0  //此處添加VIP
    ~]# ip addr del 192.168.1.100 dev eth0  
    !Configuration File for keepalived
    

    global_defs {
    notification_email {
    localhost@root.com
    }
    notification_email_from root
    smtp_server 127.0.0.1 //郵件服務器地址
    smtp_connect_timeout 30
    router_id LVS_DEVEL //標識虛擬路由ID,主從得不同
    vrrp_mcast_group4 224.0.10.10 //組播地址,用來發送VRRP報文
    }
    vrrp_script chk_schedown {
    script "[ -e /etc/keepalived/down ] && exit 1 || exit 0"
    interval 1
    weight -11
    fall 2
    rise 1
    }
    vrrp_script chk_nginx { //此處檢測nginx只需在主上有即可,如果從上也有話,就會導致主上的nginx,down的一瞬間,又起來了,優先級混亂
    script "killall -0 nginx && exit 0 || exit 1"
    interval 1
    weight -11
    fall 2
    rise 1
    }

    vrrp_instance VI_1 { //實例
    state MASTER //模式配置,當前為Master
    interface eth0 //應用於哪個網卡
    virtual_router_id 10 //虛擬路由ID組,這個主從得相同
    priority 100 //優先級
    adver_int 1 //1秒一個報文
    authentication {
    auth_type PASS //簡單報文加密
    auth_pass 12345678

        }
        virtual_ipaddress {
                172.16.254.35    //VIP地址,也就是漂移地址
        }
    
        track_script {      	 //調用腳本
                chk_schedown
                chk_nginx
        }
    

    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    } //這三句是在狀態發生變換的時候,主動調用腳本來發郵件來通知管理員,同時啟動備用nginx

    //這里在添加一個實例就是雙主了,另一台state,virtual_router_id,auth_pass不同就行
    vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 11
    priority 91
    adver_int 1
    authentication {
    auth_type PASS
    auth_pass 12345687
    }
    virtual_ipaddress {
    172.16.254.36
    }

        track_script {
                chk_schedown
                chk_nginx
        }
    

    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
    }



    此段就相當於之前博客所寫的nginx的upstream和stream的集合,nginx模塊實現負載均衡效果,下面的語句直接接在上面的配置文件中,也就相當於upstream的效果,upstream配置截圖在下面:

    virtual_server 172.16.254.35 80 {    //定義的負載均衡的后端主機的IP及端口
            delay_loop 6      			//服務輪詢的時間間隔
            lb_algo wrr      			//輪詢算法為權重輪詢
            lb_kind DR        			//集群類型
            nat_mask 255.255.0.0     
            #persistence_timeout 50   	        //持久連接時長
            protocol TCP  				//協議類型,默認為TCP
    
        real_server 172.16.250.84 80 {  //后端服務器地址
                weight 2        //權重
                HTTP_GET {      //狀態檢測
                        url {
                                path /      
                                status_code 200  //狀態為200才算后端主機正常,也有tcp檢測,但是檢測效果不准確
                        }
                        connect_timeout 2   //連接超時
                        nb_get_retry 3      //嘗試幾次連接后斷定結果
                        delay_before_retry 1  //延遲1秒后嘗試
                }
        }
                }
        }
    
    
        real_server 172.16.252.113 80 {     //第二個后端服務器
                weight 1
                HTTP_GET {
                        url {
                                path /
                                status_code 200
                        }
                        connect_timeout 2
                        nb_get_retry 3
                        delay_before_retry 1
                }
    
        }
    
    
        sorry_server 127.0.0.1 80    //備用服務器,當后端服務器都掛了的時候,本機上能提供一個SORRY
    

    }



  2. nginx搭配最上面的配置實例,可實現雙主高可用負載
    events {
        worker_connections 1024;
    }
    http {
    upstream web {
            server 172.16.252.113;
            server 172.16.250.84;
            server 127.0.0.1:80 backup;
    }
    server {
            listen 80;
            server_name www.godilgence.com;
            index index.html;
            location / {
                    proxy_pass http://web;
            }
    }
    server {
            listen 127.0.0.1:80;
            index index.html;
            root /usr/share/nginx/html;
    }
    }
    
  3. 在之前的博文里寫的lvs-dr模式后端主機的配置實例
    #!/bin/bash
    

    VIP=172.16.254.35

    case $1 in
    start)
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    
    ip addr add dev lo:0 "$VIP"/32 >/dev/null
    ip route add $VIP dev lo:0
    ;;
    

    stop)
    ifdown lo:0
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    ;;
    

    status)
    a=ip a l lo:0 | grep $VIP
    b=ip route | grep lo:0 | grep $VIP

    if [ $a -a $b ];then
    	echo "Realserver is running."
    else
    	echo "Realserver is stopping."
    fi
    ;;
    

    *)
    echo "$0:Usage $0 {start|stop|staus} "
    esac



  4. 當主備模式發生變換的時候,郵件通知管理員,並將主備機器上的say sorry的web服務器打開
    #!/bin/bash
    VIP=172.16.254.35
    

    notify() {
    mailsubject="hostname to be $1:$VIP is floating."
    mailcontent="date +%F %H:%M:%S,vrrp transition,hostname changed to be $1"
    echo $mailsubject | mail -s "$mailcontent" root@localhost
    }

    case $1 in
    master)
    systemctl start nginx.service
    notify master
    ;;
    backup)
    systemctl start nginx.service
    notify backup
    ;;
    fault)
    systemctl stop nginx.service
    notify fault

    esac


免責聲明!

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



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