Keepalived 基礎

VRRP 簡介

  • VRRP通過一種競選協議動態地將路由任務交給LAN中虛擬路由器中的某臺VRRP路由器
  • VRRP路由器是一臺實現了VRRP協議(運行VRRPD程序)的物理路由器
  • 虛擬路由器是由多臺VRRP物理路由器組成的邏輯路由器,對外看起來就像一臺路由器
  • 虛擬路由器中,只有一臺MASTER物理路由器工作,其他都是BACKUP
  • MASTER路由器一直髮送VRRP廣播,MASTER不可用後(BACKUP收不到廣播),其餘BACKUP會根據優先級競選出一臺MASTER
  • MASTER擁有虛擬路由器IP地址及其它路由配置

全局配置

  • 全局定義
    global_defs {
        notification_email {
            [email protected] #keepalived發生事件時通知該email
            ...
        }
        notification_email_from [email protected]
        smtp_server 127.0.0.1 #smtp服務器
        smtp_connect_timeout 30
        router_id my_hostname #機器標識
        default_interface eth0 #設置靜態地址默認綁定的端口,默認是eth0
        vrrp_mcast_group4 #VRRP 的組播IPV4地址,默認224.0.0.18
        vrrp_mcast_group6 #VRRP 的組播IPV4地址,默認ff02::12
        vrrp_version 2|3 #設置默認的VRRP版本,默認是2
        script_user <username> [groupname] #設置運行腳本默認用戶和組,如果沒有指定,則默認用戶爲keepalived_script(需要該用戶存在),否則爲root用戶,默認groupname同username
        enable_script_security #如果腳本路徑的任一部分對於非root用戶來說,都具有可寫權限,則不會以root身份運行腳本
    }
    
  • 靜態地址和路由,不隨 vrrpd instance 的開/關變化
    static_ipaddress {
        $ip/$mask dev $interface #ip命令規則
        ...
    }
    static_routes {
        $dest_ip/$dest_mask via $dest_gateway dev $interface #ip命令規則
        ...
    }
    
  • 一般服務器都配置了網絡信息,所以通常無需配置靜態地址和路由,如果不指定 dev,則使用 default_interface

VRRPD 配置

  • VRRP檢查腳本(vrrp_script)
    vrrp_script <SCRIPT_NAME> {
        scrip "/path/to/script-file" #可執行的腳本的絕對路徑
        interval <INTEGER> #腳本執行的間隔,單位是秒,默認爲1s
        timeout <INTEGER> #指定在多少秒後,腳本被認爲執行失敗
        weight <-254 --- 254> #調整優先級,默認爲2
        #如果腳本執行成功(退出狀態碼爲0),weight大於0,則priority增加
        #如果腳本執行失敗(退出狀態碼爲非0),weight小於0,則priority減少
        #其他情況下,priority不變
        rise <INTEGER> #執行成功多少次才認爲是成功
        fall <INTEGER> #執行失敗多少次才認爲失敗
        user <USERNAME> [GROUPNAME] #運行腳本的用戶和組
        init_fail #假設腳本初始狀態是失敗狀態
    }
    
  • VRRP同步組(sync group)
    vrrp_sync_group VG_1 {
        group {
            inside_network #實例名
            ...
        }
        notify_master /path/to/master.sh #切換到master時執行該腳本
        notify_backup /path/to/backup.sh #切換到backup時執行該腳本
        notify_fault  /path/to/fault.sh #出錯時執行該腳本
        notify /path/to/notify.sh #該腳本會在notify_*腳本後執行,默認3個參數:$1(GROUP|INSTANCE),$2(group或instance名字),$3(MASTER|BACKUP|FAULT)
        smtp_alert #發送郵件通知
    }
    
  • VRRP實例(instance)配置
    vrrp_instance inside_network {
        state MASTER #初始狀態
        interface eth0 #綁定的網卡
        dont_track_primary #忽略VRRP的interface錯誤(默認不設置)
        track_interface { #這裏的任一網卡出現問題,都會進入FAULT狀態
            eth0
            eth1 weight <-254 - 254>
            ...
        }
        track_script { #這裏的任一腳本返回碼非0,都會進入FAULT狀態
            <SCRIPT_NAME>
            <SCRIPT_NAME> weight <-254-254>
            ...
        }
        mcast_src_ip <IPADDR> #多播包發送源地址,默認網卡當前ip
        garp_master_delay 10 #切換到MASTER後,延遲arp請求
        virtual_router_id 1 #VRID標記(0..255)
        priority 100 #高優先級競選爲MASTER,MASTER高於BACKUP至少50
        advert_int 1 #檢查間隔,默認1秒
        authentication {
            auth_type PASS #密碼認證
            auth_pass 1111
        }
        virtual_ipaddress { #漂移地址,符合ip命令規則
            $vip/$vmask dev $interface
            ...
        }
        virtual_routes { #隨地址一同漂移的路由,符合ip命令規則
            $dest_ip/$dest_mask via $dest_gateway dev $interface
            ...
        }
        nopreempt #BACKUP配置,且優先級比其他高
        preempt_delay 300 #搶佔延遲,默認5分鐘
        debug #Debug級別
        lvs_sync_daemon_interface #lvn syncd綁定的網卡
    }
    

LVS配置(不涉及lvs時無需下面配置)

  • 虛擬主機組
    virtual_server_group <STRING> {
        #VIP VPORT
        <IPADDR> <PORT>
        <IPADDR> <PORT>
        ...
        fwmark <INT>
    }
    
  • 虛擬主機3中配置
    #virtual_server IP port
    #virtual_server fwmark int
    #virtual_server group string
    virtual_server 192.168.1.229 80 { #配置一個virtual server
        delay_loop 3 #每隔3秒檢查一次RealServer是否可用
        lb_algo rr|wrr|lc|wlc|lblc|sh|dh #LVS調度算法
        lb_kind NAT|DR|TUN #LVS集羣模式
        persistence_timeout 120 #同一個客戶端IP在120秒內分到同一個RealServer
        persistence_granularity <NETMASK> #會話保持粒度,默認255.255.255.255,即根據每個客戶端IP做會話保持
        protocol TCP #協議
        ha_suspend
        virtualhost <string> #HTTP_GET健康檢查時使用的HOST}
        sorry_server <IPADDR> <PORT> #所有RS失效後連接該備用機
        real_server <IPADDR> <PORT> {
            weight 1 #默認1,0失效
            inhibit_on_failure #健康檢查失敗後將weight置0,不從IPVS中刪除
            notify_up <STRING> #檢測到service up後執行的腳本
            notify_down <STRING> #檢測到service down後執行的腳本
            #檢查方式,HTTP_GET|SSL_GET|TCP_CHECK
            HTTP_GET|SSL_GET {
                url {
                    path /
                    digest <STRING> #SSL檢查返回的摘要信息
                    status_code 200 #HTTP檢查返回的狀態碼
                }
                connect_port 80 #檢查端口
                bindto <IPADDR> #使用該地址發送健康檢查
                connect_timeout #連接超時時間
                nb_get_retry 3 #重連次數
                delay_before_retry 2 #重連間隔(秒)
            }
            TCP_CHECK {
                connect_port 80
                bindto <IPADDR>
                connect_timeout 4
            }
        }
    }
    

配置日誌文件

  • 修改服務啓動參數
    sed -i '/^KEEPALIVED_OPTIONS/d' /etc/sysconfig/keepalived
    echo 'KEEPALIVED_OPTIONS="-D -d -S 2"' >> /etc/sysconfig/keepalived
    
  • 修改 rsyslog 配置文件
    echo "local2.* /var/log/keepalived.log" >> /etc/rsyslog.conf
    
  • 重啓 rsyslog 服務
    systemctl restart rsyslog
    
  • 重啓 keepalived 服務
    systemctl restart keepalived
    

其他參考

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