高可用集群(HA)之Keeplived原理+配置過程


原理-->
通過vrrp協議,定義虛擬路由,在多個服務節點上進行轉移.
通過節點優先級,將初始虛擬路由到優先級高的節點上,checker工作進程檢測到主節點出問題時,則降低此節點優先級,從而實現了虛擬路由的重新選擇.
通過notify定義通知腳本,在重新選擇時,發送通知郵件.
故,根據vrrp的運行機制,那么keepalived的默認工作機制就是一主多從.

vrrp狀態轉移機制圖:

若需要雙主,則需要在節點前,添加兩組vip和vmac,然后將客戶端分成兩份,一份指向vip1,一份指向vip2,vip1對應節點A,vip2對應節點B,並通過dns的A記錄,來將客戶的請求,均分到兩個節點上,並通過節點反向代理給上游服務器
功能-->
最初就是為了給IPVS提供高可用,並且可以自動調用ipvsadm添加規則,當然規則信息是又keepalived的配置文件定義的,后來也可以為其他輕量級的調度器(nginx等)提供高可用,不過在非ipvs服務中,需要調用vrrp_script來判定
核心組件-->master進程+vrrp+checkers
master進程基於watchdog來查看子進程的狀態,子進程不停的通過內部套接字給主進程發送心跳信息,如果master沒收到,則kill掉對應的子進程,並重啟
子進程有兩個:
vrrp:虛擬冗余路由協議,作用就是將多個網關虛擬成一個虛擬網關(vip和vmac都是虛擬的),從而解決默認網關失效
checkers:檢查各項服務的可用性,,怎么檢測,則需要自己定義腳本
配置文件--> /etc/keepalived/keepalived.conf(每個節點都需要)
! Configuration File for keepalived
#****************************************全局配置段 ************************************
global_defs {
#定義接收郵箱
   notification_email {
        root@localhost
   }
#定義發送郵箱(可隨意,即便不存在也可以)
   notification_email_from admin@localhost
#定義郵件服務器
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
#******************************** 虛擬路由配置段:定義虛擬路由相關信 *************************************
#為keepalived定義服務檢測腳本,定義關鍵字就是 vrrp_script
vrrp_script chk_keepalived_down {
#如果存在down文件,則返回1(表示keepalived服務失效),否則返回0(表示服務沒有失效)
    script "[ -e /etc/keepalived/down ] && exit 1 || exit 0"
#檢測間隔1秒
    interval 1
#如果失效,權重減2
    weight -2
}

#為nginx提供高可用
vrrp_script chk_nginx {
#檢測nginx是否存在,如果存在返回0,如果不存在返回1
    script "killall -0 nginx"
#檢測間隔時間
    interval 1
#如果失敗,權重減2
    weight 2
#失敗檢測次數
    fall 2
#成功檢測次數
    rise 1
}

#定義vrrp實例VI_1(即一個虛擬路由器)
vrrp_instance VI_1 {
#若權重高,則定義此實例為主(主從區別),從為BACKUP
    state MASTER
#定義接口(便於從哪個網卡進行宣告,從而進行優先級選舉)
    interface eth0
#定義vrrp虛擬路由唯一標識,即確定vmac
    virtual_router_id 51
#初始權重(主從區別),從需要比此數據小
    priority 100
#通告
    advert_int 1
#認證機制,防止未知設備,成為節點
    authentication {
#認證類型:密碼
        auth_type PASS
#認證密鑰隨機字符串
        auth_pass 1111
    }
#定義vip
    virtual_ipaddress {
        10.10.10.2
    }
#追蹤腳本
    track_script {
    chk_keepalived_down
    chk_nginx
    }
}


#為ipvs提供高可用,需要與vip相同(也可以根據防火牆標識來定義,virtual_server fwmark int)
virtual_server 10. 10. 10. 2 80 {
    delay_loop 6
#負載均衡算法,若使用wrr,則real server中的權重不能相同
    lb_algo rr 
#負載均衡模式
    lb_kind DR
#vip掩碼
    net_mask 255.255.255.0
#持久連接
    persistence_timeout 50
#負載均衡協議
    protocol TCP
#類似於fail_back
    sorry_server 192. 168. 200. 200 80
#定義第一個真實服務器
    real_server 192. 168. 200. 2 80 {
#權重
        weight 1
#real server的狀態信息檢測,定義http判定,並使用HTTP_GET方法檢測(也可以使用SSL_GET/TCP_CHECK檢測,其中TCP_CHECK檢測,僅僅只需要定義connect_timeout就可以了)
        HTTP_GET {
            url { 
                path /
                status_code 200
            }
#超時時間
            connect_timeout 3
#重試次數
            nb_get_retry 3
#重試等待間隔時間
            delay_before_retry 3
        }
    }
#定義第二個真實服務器
    real_server 192. 168. 200. 3 80 {
        weight 1
        HTTP_GET {
            url { 
                path /
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}



1、如何在狀態轉換時進行通知?(需要自己寫腳本來進行通知)
/etc/keepalived/keepalived.conf中vrrp_instance上下問中定義通知腳本:
notify_master|backup|fault指切換到master|backup|fault時執行的腳本,使用絕對路徑
notify_master "/path/to/master.sh master"
notify_backup " /path/to/ backup.sh backup"
notify_fault " /path/to/ fault.sh fault"
master腳本示例如下--> 轉換成master時發郵件通知:
#!/bin/bash
#
vip = 192. 168. 1. 250
contact = 'root@localhost'
thisip = `ifconfig eth0 | awk -F : '/inet addr/{print $2}' | awk '{print $1}' `
notify(){
#定義郵件內容
    mailbody = "vrrp transaction:vrrp changed the keepalived service to $1."
    subject = "$thisip is to be $1."
    echo $mailbody | mail -s "$subject" $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
2、如何配置IPVS高可用(安裝ipvsadm,查看ipvs規則 負載均衡集群之LVS配置命令 ),ipvs高可用,keepalived已經提供了狀態通知腳本,不需要自行定義
/etc/keepalived/keepalived.conf中添加virtual_server上下文:
    virutal server
    realserver
         health check
配置格式如下-->
virtual_server vip port {
    lb_kind
    #定義負載均衡算法(rr,wrr,sh,dh,lblc,lc) 負載均衡集群之LVS算法和模型
    lb_algo
    real_server rip port {
         weight
         notify_up "up.sh"
         notify_down "down.sh"
     }          
}
配置示例-->
virtual_server 10. 10. 10. 2 80 {
    delay_loop 6
#負載均衡算法
    lb_algo rr
#負載均衡模式
    lb_kind DR
#持久連接
    persistence_timeout 50
#負載均衡協議
    protocol TCP
#類似於fail_back
    sorry_server 192. 168. 200. 200 80
#定義第一個真實服務器
    real_server 192. 168. 200. 2 80 {
#權重
        weight 1
#定義http判定,並使用get方法
        HTTP_GET {
            url {
              path /
              status_code 200
            }
#超時時間
            connect_timeout 3
#重試次數
            nb_get_retry 3
#重試等待間隔時間
            delay_before_retry 3
        }
    }
#定義第二個真實服務器
    real_server 192. 168. 200. 3 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
              }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
3、如何對某特定服務器做高可用?(這里以nginx為例)
關鍵點:監控服務和追蹤服務,具體查看上面的配置文件
4、如何實現基於多虛擬路由的master/master模型
定義兩個vrrp_instance即可,需要注意的是vmac標識不能一樣






免責聲明!

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



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