keepalived概述

keepalived

    Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,可以利用其來避免單點故障。一個mysql或lvs或nginx服務會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),但是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候,備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。

    vrrp協議完成地址流動;

    爲vip地址所在的節點生成ipvs規則(在配置文件中預先定義);

    爲ipvs集羣的各RS做健康狀態檢測;

    基於腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集羣事務;    


HA Cluster配置前提:    

    (1) 各節點時間必須同步;

    ntp, chrony

    (2) 確保iptables及selinux不會成爲阻礙;

    (3) 各節點之間可通過主機名互相通信(對KA並非必須);

        建議使用/etc/hosts文件實現; 

    (4) 各節點之間的root用戶可以基於密鑰認證的ssh服務完成互相通信;(並非必須)


安裝keepalived

    CentOS 6.4以後再base倉庫中就已經提供了keepalived軟件包,因此可直接使用yum -y install keepalived安裝即可


程序環境:

    配置文件:/etc/keepalived/keepalived.conf

    主程序:/usr/sbin/keepalived

    

配置文件講解

    keepalived有三類配置區域,注意不是三種配置文件,是一個配置文件裏面三種不同類別的配置區域,全局配置(Global Configuration)、VRRPD配置、LVS配置


##########################全局配置#############################

global_defs {
   notification_email {
        root@localhost     #指定keepalived在發生故障切換時需要發送的Email地址,可定義多個
   }
   notification_email_from keepalived@localhost    #指定故障切換時的發件人地址
   smtp_server 127.0.0.1                            #指定smtp服務器地址
   smtp_connect_timeout 30                          #指定smtp連接超時時間
   router_id LVS_DEVEL                            #運行keepalived機器的一個標識
   vrrp_mcast_group4 224.0.0.9                      #指定ipv4組播地址
}


##########################VRRP配置##################################

vrrp_instance VI_1 {
    state MASTER                  #指定在當前VRRP示例的狀態MASTER|BACKUP,如果設置了nopreempt這個值不起作用,主備靠priority決定
    interface eth0                 #設置實例綁定的網卡
    virtual_router_id 51              ##VRID標記 ,路由ID,可通過#tcpdump vrrp查看
    priority 100                  #優先級,高優先級競選爲master
    advert_int 1                  #檢查間隔,默認1秒
    nopreempt                    #非搶佔(因爲默認如果master掛的時候,backup會頂上,當master再好的時候,會再切回去,這樣就會造成兩次
                            #斷開,加上nopreempt的時候,及時master又好了,依舊不會切換,但是要注意兩個state 都要是backup)  
                                 
        preempt_delay 300           #搶佔式模式下,節點上線後觸發新選舉操作的延遲時長;                                                     
    authentication {                #設置認證         
        auth_type PASS             #認證方式                           
        auth_pass 1111             #認證密碼
    }   
    
    virtual_ipaddress {              #設置vip
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }   
    
    track_interface {               #配置要監控的接口,一旦出現故障則轉爲FAULT狀態
		eth0
		eth1
		...
	}
	notify_master <STRING>|<QUOTED-STRING>     #當前節點成爲主節點時觸發的腳本;
	notify_backup <STRING>|<QUOTED-STRING>     #當前節點轉爲備節點時觸發的腳本;
	notify_fault <STRING>|<QUOTED-STRING>      #當前節點轉爲“失敗”狀態時觸發的腳本;
}


################################LVS配置##################################

virtual_server 192.168.200.100 443 {          #VIP 端口
    delay_loop 6                              #健康檢查時間間隔
    lb_algo rr                                 #lvs調度算法lrr|wrr|lc|wlc|lblc|sh|dh
    lb_kind NAT                              #負載均衡轉發規則NAT|DR|TUN
    nat_mask 255.255.255.0                     #nat掩碼
    persistence_timeout 50                     #會話保持時間
    protocol TCP                              #使用的協議
    
    sorry_server <IPADDR> <PORT>              #備用服務器地址,所有realserver失效後啓用
    
    real_server 192.168.201.100 443 {          #RIP地址,端口
        weight 1                             #權重,默認爲1,0失效
        inhibit_on_failure                     ##在服務器健康檢查失效時,將其設爲0,而不是直接從ipvs中刪除
        notify_up <STRING>|<QUOTED-STRING>    #在檢測到server up後執行腳本
        notify_down <STRING>|<QUOTED-STRING>    #在檢測到server down後執行腳本
        
        HTTP_GET|SSL_GET {
            url {                                
              path <URL_PATH>             #定義要監控的URL
              status_code <INT>            #判斷上述檢測機制爲健康狀態的響應碼
              digest <STRING>                    #判斷上述檢測機制爲健康狀態的響應的內容的校驗碼;
            }   
            connect_timeout <INTEGER>            #連接請求的超時時長
            nb_get_retry <INT>                    #重試次數
            delay_before_retry <INT>            #重試之前的延遲時長
            connect_ip <IP ADDRESS>            #向當前RS的哪個IP地址發起健康狀態檢測請求
            connect_port <PORT>                #向當前RS的哪個PORT發起健康狀態檢測請求
              bindto <IP ADDRESS>                #發出健康狀態檢測請求時使用的源地址
              bind_port <PORT>                    #發出健康狀態檢測請求時使用的源端口
        }   
        
        TCP_CHECK {
			connect_ip <IP ADDRESS>            #向當前RS的哪個IP地址發起健康狀態檢測請求
			connect_port <PORT>                #向當前RS的哪個PORT發起健康狀態檢測請求
			bindto <IP ADDRESS>                #發出健康狀態檢測請求時使用的源地址;
			bind_port <PORT>                    #發出健康狀態檢測請求時使用的源端口;
			connect_timeout <INTEGER>            #連接請求的超時時長;
		}
    }   
}




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