1. 程式人生 > >keepalived 1.3.0

keepalived 1.3.0

注意:以下內容是1.3.0以前的版本

第01節 Keepalived 的安裝

 yum -y install keepalived

第02節 Keepalived工作原理

keepalived 是一個類似於 layer3, 4 & 5 交換機制的軟體:

Layer3: Keepalived 使用 Layer3 的方式工作式時, Keepalived 會定期向伺服器群中的伺服器傳送一個 ICMP 的資料包(既我們平時用的 Ping 程式) , 如果發現某臺服務的 IP 地址沒有啟用,Keepalived 便報告這臺伺服器失效,並將它從伺服器群中剔除,這種情況的典型例子是某臺伺服器被非法關機。 Layer3 的方式是以伺服器的 IP 地址是否有效作為伺服器工作正常與否的標準。

Layer4:主要以 TCP 埠的狀態來決定伺服器工作正常與否。如 web server 的服務埠一般是80,如果 Keepalived 檢測到 80 埠沒有啟動,則 Keepalived 將把這臺伺服器從伺服器群中刪除。

Layer7:Layer5 就是工作在具體的應用層了,比 Layer3,Layer4 要複雜一點,在網路上佔用的頻寬也要大一些。 Keepalived 將根據使用者的設定檢查伺服器程式的執行是否正常,如果與使用者的設定不相符,則 Keepalived 將把伺服器從伺服器群中剔除。

Keepalived的作用與構建

1.管理 VIP。 VIP 會在 LVS 之間漂移

2.監控 LVS分發器

執行在主分發的 Keepalived 會以組播的形式向網路中宣告自己,即主分發器還活著,備用節點能收到。當備用節點,在一個時間單位中收不到組播,備用節點會認為主 LVS 掛了,開始接手主分發器工作,把 VIP 配給自己。

3.管理 RS

Keepalived 會每隔一個時間段去做一次類似於訪問的操作如:

探針: elinks http://192.168.3.64 –dump

VRRP/HSRP工作原理

虛擬路由冗餘協議(Virtual Router Redundancy Protocol,簡稱VRRP)是由IETF提出的解決區域網中配置靜態網關出現單點失效現象的路由協議。使用組播方式通訊。

VRRP是一種路由容錯協議,也可以叫做備份路由協議。一個區域網絡內的所有主機都設定預設路由(預設閘道器),當網內主機發出的目的地址不在本網段時,報文將被通過預設路由發往外部路由器,從而實現了主機與外部網路的通訊。當預設路由器down掉(即埠關閉)之後,內部主機將無法與外部通訊,如果路由器設定了VRRP時,那麼這時,虛擬路由將啟用備份路由器,從而實現全網通訊。

HSRP是思科私有協議。VRRP中只有三種狀態----初始狀態(Initialize)、主狀態(Master)、備份狀態(Backup),而HSRP 有六種狀態。

第03節 keepalived.conf

keepalived主要有三個模組,分別是core、check和vrrp。core模組為keepalived的核心,負責主程序的啟動、維護以及全域性配置檔案的載入和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模組是來實現VRRP協議的。

keepalived只有一個配置檔案keepalived.conf,裡面主要包括以下幾個配置區域,分別是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。

static_ipaddress和static_routes區域

static_ipaddress 和 static_routes 配置的是本節點的IP和路由資訊。如果你的機器上已經配置了IP和路由,那麼這兩個區域可以不用配置。其實,一般情況下你的機器都會有IP地址和路由資訊的,因此沒必要再在這兩個區域配置。

static_ipaddress {
    10.210.214.163/24 brd 10.210.214.255 dev eth0
    ...
}
static_routes {
    10.0.0.0/8 via 10.210.214.1 dev eth0
    ...
}

以上分別表示啟動/關閉keepalived時在本機執行的如下命令:

/sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
/sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
/sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
/sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0

注意: 請忽略這兩個區域,因為我堅信你的機器肯定已經配置了IP和路由。

1、全域性定義部分:

global_defs {
    notification_email {
        #email  [email protected] 
        #email  [email protected]
    }
    notification_email_from #email  [email protected]
    smtp_server #host  --localhost
    smtp_connect_timeout #num  --30
    lvs_id #string     --與lvs有關
    router_id #string  --標識當前節點名字,兩個節點的此項需要不相同。故障發生時,郵件通知會用到該值
    vrrp_mcast_group4 224.0.0.18 # optional, default 224.0.0.18

}

#預設的配置檔案中,使用第三方 smtp 伺服器,但這在現實中幾乎沒有意義,發不出郵件,我們將其挃定為 localhost, 我們也可以將通知資訊的傳送交給本地 sendmail 服務處理。 

2、VRRP例項定義部分

包含 vrrp_instance 和 vrrp_sync_group 區域。

vrrp_rsync_group用來定義vrrp_intance組,使得這個組內成員動作一致。舉個例子來說明一下其功能:

兩個vrrp_instance同屬於一個vrrp_rsync_group,那麼其中一個vrrp_instance發生故障切換時,另一個vrrp_instance也會跟著切換(即使這個instance沒有發生故障)。

vrrp_sync_group string {
    group {
        string
        string
    }
    notify_master /path_to_script/script_master.sh # 表示當切換到master狀態時,要執行的指令碼
        (or notify_master “ /path_to_script/script_master.sh <arg_list>)
    notify_backup /path_to_script/script_backup.sh # 表示當切換到backup狀態時,要執行的指令碼
        (or notify_backup “/path_to_script/script_backup.sh <arg_list>)
    notify_fault /path_to_script/script_fault.sh   # 表示切換出現故障時要執行的指令碼
        (or notify_fault “ /path_to_script/script_fault.sh <arg_list>)
    notify /path_to_script/script_fault.sh   #notify 表示任何一狀態切換時都會呼叫該指令碼,並且該指令碼在以上三個指令碼執行完成之後進行呼叫,keepalived會自動傳遞三個引數($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
}

vrrp_instance string {   # 定義一個例項,一個叢集就是一個例項。string可以改
    state MASTER|BACKUP  # 指定keepalived的角色,主節點和備用節點
    interface eth0       # 繫結虛擬 IP 的網路介面 ,並用來發VRRP包。
    #mcast_src_ip @IP
    #use_vmac            # 是否使用VRRP的虛擬MAC地址。
    track_interface {    # 監控以下網絡卡,如果任何一個不通就會切換到FALT狀態(可選)
        eth0
        eth1
    }
    #lvs_sync_daemon_interface string
    #garp_master_delay 10  # 當切為主狀態後多久更新ARP快取,預設5秒。
    virtual_router_id num  # VRRP 組名,兩個節點的設定必須一樣,以指明各個節點屬於同一VRRP組
    priority num           # 主節點的優先順序(1-254 之間),備用節點必須比主節點優先順序低 
    advert_int num         # 組播資訊傳送間隔,兩個節點設定必須一樣
    smtp_alert
    authentication {       # 設定驗證資訊,兩個節點必須一致 
        auth_type PASS|AH  # 認證型別有PASS和HA(IPSEC),推薦使用PASS(密碼只識別前8位)。
        auth_pass string
    }
    virtual_ipaddress {    # 最多可以設定20個IP。指定虛擬 IP, 兩個節點設定必須一樣
        10.210.214.253/24 brd 10.210.214.255 dev eth0
        192.168.1.11/24 brd 192.168.1.255 dev eth1
    }
    virtual_ipaddress_excluded { # Unlimited IP addresses
        @IP
        @IP
        @IP
    }
    virtual_routes {
        172.16.0.0/12 via 10.210.214.1
        192.168.1.0/24 via 192.168.1.1 dev eth1
        default via 202.102.152.1
    }
    notify_master /path_to_script/script_master.sh # 表示當切換到master狀態時,要執行的指令碼
        (or notify_master “ /path_to_script/script_master.sh <arg_list>)
    notify_backup /path_to_script/script_backup.sh # 表示當切換到backup狀態時,要執行的指令碼
        (or notify_backup “ /path_to_script/script_backup.sh <arg_list>)
    notify_fault /path_to_script/script_fault.sh   # 表示切換出現故障時要執行的指令碼
        (or notify_fault “ /path_to_script/script_fault.sh <arg_list>)
}

vrrp_script區域

檢測指令碼一定要寫在vrrp_instance的前面也就是上面,而且花括號一定要有空格,追蹤trace_script要定在vip的後面,多少人栽在了這上面好多小時

先定義指令碼

vrrp_script check_running {
    script "/usr/local/bin/check_running"
    interval 10     # 指令碼執行間隔
    weight 10       # 指令碼結果導致的優先順序變更:10表示優先順序+10;-10則表示優先順序-10
    fall 2          # 檢測兩次都失敗才失敗            
    rise 1          # 檢測一次成功就成功
}

然後在例項(vrrp_instance)裡面引用,有點類似腳本里面的函式引用一樣:先定義,後引用函式名。

track_script { 
    check_running   
    # check_running weight 20  會修改權重
} 

注意:VRRP指令碼(vrrp_script)和VRRP例項(vrrp_instance)屬於同一個級別

案例1

vrrp_script chk_http_port {
    script "</dev/tcp/127.0.0.1/80"
    interval 1
    weight -10
}

案例2

vrrp_script chk_nginx {
   script "killall -0 nginx" 
   # kill -0 pid 不傳送任何訊號,檢查一個程序是否存在,存在返回0;不存在返回1
   interval 2   # 每2s檢測一次
   weight -5    # 檢測失敗(指令碼返回非0)則優先順序減少5
   fall 2       # 連續2次失敗才會用weight減少優先順序(1-255之間)
   rise 1       # 檢測 1 次成功就算成功。但不修改優先順序
}

3、LVS虛擬伺服器定義部分

virtual_server_group和virtual_server區域。此部分只與LVS結合。

virtual_server_group一般在超大型的LVS中用到,一般LVS用不過這東西,因此不多說。

# 定義對外提供服務的LVS的VIP以及port
virtual_server (@IP PORT)|(fwmark num) {
    delay_loop #num                    --Keepalived 多長時間監測一次
    lb_algo #rr|wrr|lc|wlc|sh|dh|lblc  --分發演算法
    lb_kind #NAT|DR|TUN                --模式
    (nat_mask @IP)                    # 在Linux kernel 2.2下使用
    persistence_timeout #num           --同一 IP 50秒內的請求都發到同個real server ,這個會影響LVS的 rr 排程演算法, 同一 IP 超過 50 秒後,再次訪問,才會被轉發到另一臺 real server 上。 persistence 永續性的意思
    persistence_granularity @IP
    virtualhost #string
    protocol #TCP|UDP

    sorry_server @IP PORT             # 如果後端伺服器都掛了,就轉到此服務。
    
    real_server @IP PORT {
        weight #num                    --配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設定權值大小可以為不同效能的伺服器  
        TCP_CHECK {
            connect_port #num          --檢測埠
            connect_timeout 2         # 表示 3 秒無響應超時    
            nb_get_retry 2            # 表示重試次數
            delay_before_retry 2      # 表示重試間隔

        }
    }
    real_server @IP PORT {
        weight #num  
        MISC_CHECK {
            misc_path /path_to_script/script.sh
            (or misc_path “ /path_to_script/script.sh <arg_list>)
        }
    }
}
# 預設配置檔案中還有兩個 virtual_server 模版,把剩下的都刪除了,就可以。 如: 
# virtual_server 10.10.10.2 1358 {  。。。 } 
# virtual_server 10.10.10.3 1358 {  。。。 }

real_server @IP PORT {
    weight #num
    HTTP_GET|SSL_GET { 
        url { # You can add multiple url block
            path alphanum
            digest alphanum
        }
        connect_port #num
        connect_timeout #num
        retry #num
        delay_before_retry #num
    }
}

4、LVS虛擬伺服器健康檢查方式

健康檢查方式一共有HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC_CHECK

1、HTTP_GET

real_server @IP PORT {
    weight #num
    HTTP_GET {                     # 設定檢測後端realserver的方式為獲取http協議報文
        url {
              path /
              status_code 200      # 狀態碼為200則證明後端伺服器是線上的
           }
        connect_timeout 3          # 設定超時時間
        nb_get_retry 3             # 設定超時時候重試幾次
        delay_before_retry 3       # 在重試的時候的時間間隔
        }
}

2、 SSL_GET



real_server @IP PORT {
    weight #num
    SSL_GET
        {
            url {
                path /testurl/test.jsp
                digest 640205b7b0fc66c1ea91c463fac6334c #digest需要genhash程式得到MD5自字串。
            }
            connect_timeout 3
            retry 3
            delay_before_retry 2
        }
}

genhash –s 192.168.100.2 –p 80 –u /testurl/test.jsp

--------------------------[ HTTP Header Buffer ]--------------------------
0000 48 54 54 50 2f 31 2e 31 - 20 34 30 31 20 55 6e 61 HTTP/1.1 401 Una
0010 75 74 68 6f 72 69 7a 65 - 64 0d 0a 44 61 74 65 3a uthorized..Date:
0020 20 4d 6f 6e 2c 20 32 33 - 20 41 70 72 20 32 30 30 Mon, 23 Apr 200
0030 31 20 31 35 3a 34 31 3a - 35 34 20 47 4d 54 0d 0a 1 15:41:54 GMT..
0040 41 6c 6c 6f 77 3a 20 47 - 45 54 2c 20 48 45 41 44 Allow: GET, HEAD
0050 0d 0a 53 65 72 76 65 72 - 3a 20 4f 72 61 63 6c 65 ..Server: Oracle
0060 5f 57 65 62 5f 4c 69 73 - 74 65 6e 65 72 2f 34 2e _Web_Listener/4.
0070 30 2e 38 2e 31 2e 30 45 - 6e 74 65 72 70 72 69 73 0.8.1.0Enterpris
0080 65 45 64 69 74 69 6f 6e - 0d 0a 43 6f 6e 74 65 6e eEdition..Conten
0090 74 2d 54 79 70 65 3a 20 - 74 65 78 74 2f 68 74 6d t-Type: text/htm
00a0 6c 0d 0a 43 6f 6e 74 65 - 6e 74 2d 4c 65 6e 67 74 l..Content-Lengt
00b0 68 3a 20 31 36 34 0d 0a - 57 57 57 2d 41 75 74 68 h: 164..WWW-Auth
00c0 65 6e 74 69 63 61 74 65 - 3a 20 42 61 73 69 63 20 enticate: Basic
00d0 72 65 61 6c 6d 3d 22 41 - 43 43 45 53 20 20 20 20 realm="ACCES
00e0 22 0d 0a 43 61 63 68 65 - 2d 43 6f 6e 74 72 6f 6c "..Cache-Control
00f0 3a 20 70 75 62 6c 69 63 - 0d 0a 0d 0a : public....
------------------------------[ HTML Buffer ]-----------------------------
0000 3c 48 54 4d 4c 3e 3c 48 - 45 41 44 3e 3c 54 49 54 <HTML><HEAD><TIT
0010 4c 45 3e 55 6e 61 75 74 - 68 6f 72 69 7a 65 64 3c LE>Unauthorized<
0020 2f 54 49 54 4c 45 3e 3c - 2f 48 45 41 44 3e 0d 0a /TITLE></HEAD>..
0030 3c 42 4f 44 59 3e 54 68 - 69 73 20 64 6f 63 75 6d <BODY>This docum
0040 65 6e 74 20 69 73 20 70 - 72 6f 74 65 63 74 65 64 ent is protected
0050 2e 20 20 59 6f 75 20 6d - 75 73 74 20 73 65 6e 64 . You must send
0060 0d 0a 74 68 65 20 70 72 - 6f 70 65 72 20 61 75 74 ..the proper aut
0070 68 6f 72 69 7a 61 74 69 - 6f 6e 20 69 6e 66 6f 72 horization infor
0080 6d 61 74 69 6f 6e 20 74 - 6f 20 61 63 63 65 73 73 mation to access
0090 20 69 74 2e 3c 2f 42 4f - 44 59 3e 3c 2f 48 54 4d it.</BODY></HTM
00a0 4c 3e 0d 0a - L>..
-----------------------[ HTML MD5 final resulting ]-----------------------
MD5 Digest : ec90a42b99ea9a2f5ecbe213ac9eba03

3、TCP_CHECK

TCP_CHECK {
    connect_port 80
    bindto 192.168.1.1
    connect_timeout 4
} 

4、SMTP方式,這個可以用來給郵件伺服器做叢集

SMTP_CHECK {
    host {
        connect_ip <IP ADDRESS>
        connect_port <PORT>          #預設檢查25埠
        14 KEEPALIVED
        bindto <IP ADDRESS>
    }
    connect_timeout <INTEGER>
    retry <INTEGER>
    delay_before_retry <INTEGER>
    helo_name <STRING>|<QUOTED-STRING>
} 

5、MISC方式,這個可以用來檢查很多伺服器只需要自己會些指令碼即可

MISC_CHECK {
    misc_path <STRING>|<QUOTED-STRING>    #外部程式或指令碼
    misc_timeout <INT>                    #指令碼或程式執行超時時間
    misc_dynamic                          #這個就很好用了,可以非常精確的來調整權重,是後端每天伺服器的壓力都能均衡調配,這個主要是通過執行的程式或指令碼返回的狀態程式碼來動態調整weight值,使權重根據真實的後端壓力來適當調整,不過這需要有過硬的指令碼功夫才行哦
    #返回0:健康檢查沒問題,不修改權重
    #返回1:健康檢查失敗,權重設定為0
    #返回2-255:健康檢查沒問題,但是權重卻要根據返回程式碼修改為返回碼-2,例如如果程式或指令碼執行後返回的程式碼為200,#那麼權重這回被修改為 200-2
     }

第04節 keepalived執行引數

keepalived -h

keepalived -h
Usage: keepalived [OPTION...]
  -f, --use-file=FILE          Use the specified configuration file
  -P, --vrrp                   Only run with VRRP subsystem
  -C, --check                  Only run with Health-checker subsystem
  -l, --log-console            Log messages to local console
  -D, --log-detail             Detailed log messages
  -S, --log-facility=[0-7]     Set syslog facility to LOG_LOCAL[0-7]
  -X, --release-vips           Drop VIP on transition from signal.
  -V, --dont-release-vrrp      Don't remove VRRP VIPs and VROUTEs on daemon stop
  -I, --dont-release-ipvs      Don't remove IPVS topology on daemon stop
  -R, --dont-respawn           Don't respawn child processes
  -n, --dont-fork              Don't fork the daemon process
  -d, --dump-conf              Dump the configuration data
  -p, --pid=FILE               Use specified pidfile for parent process
  -r, --vrrp_pid=FILE          Use specified pidfile for VRRP child process
  -c, --checkers_pid=FILE      Use specified pidfile for checkers child process
  -a, --address-monitoring     Report all address additions/deletions notified via netlink
  -x, --snmp                   Enable SNMP subsystem
  -A, --snmp-agent-socket=FILE Use the specified socket for master agent
  -s, --namespace=NAME         Run in network namespace NAME (overrides config)
  -m, --core-dump              Produce core dump if terminate abnormally
  -M, --core-dump-pattern=PATN Also set /proc/sys/kernel/core_pattern to PATN (default 'core')
  -i, --config_id id           Skip any configuration lines beginning '@' that don't match id
  -v, --version                Display the version number
  -h, --help                   Display this help message

gehash

GEHASH二進位制用於生成摘要字串。GeHASH命令列引數是:

--use-ssl         -S       Use SSL connection to remote server.
--server          -s       Use the specified remote server address.
--port            -p       Use the specified remote server port.
--url             -u       Use the specified remote server url.
--use-virtualhost -V       Use the specified virtualhost in GET query.
--hash            -H       Use the specified hash algorithm.
--verbose         -v       Use verbose mode output.
--help            -h       Display this short inlined help screen.
--release         -r       Display the release number.
--fwmark          -m       Use the specified FW mark.

第05節 keepalived執行日誌

在 /var/log/messages 裡檢視:

Keepalived: Starting Keepalived v0.6.1 (06/13, 2002)
Keepalived: Configuration is using : 92013 Bytes
Keepalived: ------< Global definitions >------
Keepalived: LVS ID = LVS_PROD
Keepalived: Smtp server = 192.168.200.1
Keepalived: Smtp server connection timeout = 30
Keepalived: Email notification from = [email protected]
Keepalived: Email notification = [email protected]
Keepalived: Email notification = [email protected]
Keepalived: ------< SSL definitions >------
Keepalived: Using autogen SSL context
Keepalived: ------< LVS Topology >------
Keepalived: System is compiled with LVS v0.9.8
Keepalived: VIP = 10.10.10.2, VPORT = 80
Keepalived: VirtualHost = www.domain1.com
Keepalived: delay_loop = 6, lb_algo = rr
Keepalived: persistence timeout = 50
Keepalived: persistence granularity = 255.255.240.0
Keepalived: protocol = TCP
Keepalived: lb_kind = NAT
Keepalived: sorry server = 192.168.200.200:80
Keepalived: RIP = 192.168.200.2, RPORT = 80, WEIGHT = 1
Keepalived: RIP = 192.168.200.3, RPORT = 80, WEIGHT = 2
Keepalived: VIP = 10.10.10.3, VPORT = 443
Keepalived: VirtualHost = www.domain2.com
Keepalived: delay_loop = 3, lb_algo = rr
Keepalived: persistence timeout = 50
Keepalived: protocol = TCP
Keepalived: lb_kind = NAT
Keepalived: RIP = 192.168.200.4, RPORT = 443, WEIGHT = 1
Keepalived: RIP = 192.168.200.5, RPORT = 1358, WEIGHT = 1
Keepalived: ------< Health checkers >------
Keepalived: 192.168.200.2:80
Keepalived: Keepalive method = HTTP_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: 192.168.200.3:80
Keepalived: Keepalive method = HTTP_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334c
Keepalived: Checked url = /testurl2/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334c
Keepalived: 192.168.200.4:443
Keepalived: Keepalive method = SSL_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: Checked url = /testurl2/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: 192.168.200.5:1358
Keepalived: Keepalive method = TCP_CHECK
Keepalived: Connection timeout = 3
Keepalived: Registering Kernel netlink reflector

修改日誌路徑

Keepalived預設所有的日誌都是寫入到/var/log/message下的,由於message的日誌太多了,而Keepalived的日誌又很難分離出來,所以本文提供了一個調整Keepalived日誌輸出路徑的方法。 具體操作步驟如下:

一、修改 /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D" 
# 修改為
KEEPALIVED_OPTIONS="-D -d -S 0"
# 其中-S指定syslog的facility 

二、設定syslog,修改/etc/rsyslog.conf,新增內容如下

local0.* /var/log/keepalived.log 

注意:local0是l是字元L的小寫

三、重啟服務

service keepalived restart
service rsyslog restart

第06節 主備角色選舉策略

在Keepalived中使用vrrp_script模組時整個叢集角色的選舉演算法,由於“weight”值可以是正數也可以是負數,因此,要分兩種情況進行說明。

1. weight值為正數時

在vrrp_script中指定的指令碼如果檢測成功,那麼Master節點的權值將是“weight值與”priority“值之和,如果指令碼檢測失敗,那麼Master節點的權值保持為“priority”值,因此切換策略為:

  • Master節點“vrrp_script”指令碼檢測失敗時,如果Master節點“priority”值小於Backup節點“weight值與”priority“值之和,將發生主、備切換。

  • Master節點“vrrp_script”指令碼檢測成功時,如果Master節點“weight”值與“priority”值之和大於Backup節點“weight”值與“priority”值之和,主節點依然為主節點,不發生切換。

2. weight值為負數時

在“vrrp_script”中指定的指令碼如果檢測成功,那麼Master節點的權值仍為“priority”值,當指令碼檢測失敗時,Master節點的權值將是“priority“值與“weight”值之差,因此切換策略為:

  • Master節點“vrrp_script”指令碼檢測失敗時,如果Master節點“priority”值與“weight”值之差小於Backup節點“priority”值,將發生主、備切換。

  • Master節點“vrrp_script”指令碼檢測成功時,如果Master節點“priority”值大於Backup節點“priority”值時,主節點依然為主節點,不發生切換。

在熟悉了Keepalived主、備角色的選舉策略後,再來分析一下,如果A、B兩個節點設定的“weight”值都為10,而A的“priority”為100,B的“priority”為80,因此符合選舉策略的第一種,在A節點停止Mysql服務後,A節點的指令碼檢測將失敗,此時A節點的權值將保持為A節點上設定的“priority”值,即為100,而B節點的權值將變為“weight”值與“priority”值之和,也就是90(10+80),這樣就出現了A節點權值仍然大於B節點權值的情況,因此不會發生主、備切換。

對於“weight”值的設定,有一個簡單的標準,即“weight”值的絕對值要大於Master和Backup節點“priority”值之差。對於上面A、B兩個節點的例子,只要設定“weight”值大於20即可保證叢集正常執行和切換。由此可見,對於“weight值的設定,要非常謹慎,如果設定不好,將導致叢集角色選舉失敗,使叢集陷於癱瘓狀態。

3. 搶佔模式介紹

1、搶佔模式配置(預設)


global_defs {
   router_id nginx_01  #標識本節點的名稱,通常為hostname
   vrrp_mcast_group4  224.0.67.67
}

vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2  #每2秒檢測一次nginx的執行狀態
       weight -20  #失敗一次,將自己的優先順序-20
}

vrrp_instance VI_1 {
    state MASTER                  # 狀態,主節點為MASTER,備份節點為BACKUP
    interface enp0s3              # 繫結VIP的網路介面,通過ifconfig檢視自己的網路介面
    virtual_router_id 51          # 虛擬路由的ID號,兩個節點設定必須一樣,可選IP最後一段使用,相同的VRID為一個組,他將決定多播的MAC地址
    mcast_src_ip 192.168.1.201    # 本機IP地址
    priority 100                  # 節點優先順序,值範圍0~254,MASTER要比BACKUP高
    advert_int 1                  # 組播資訊傳送時間間隔,兩個節點必須設定一樣,預設為1秒
    # 設定驗證資訊,兩個節點必須一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP,兩個節點設定必須一樣。可以設定多個,一行寫一個
    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
       chk_nginx  # nginx存活狀態檢測指令碼
    }
}

分別在主備伺服器/etc/keepalived目錄下建立nginx_check.sh指令碼,併為其新增執行許可權 chmod +x /etc/keepalived/nginx_check.sh 。用於keepalived定時檢測nginx的服務狀態,如果nginx停止了,會嘗試重新啟動nginx,如果啟動失敗,會將keepalived程序殺死,將vip漂移到備份機器上。

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /opt/nginx/sbin/nginx #嘗試重新啟動nginx
    sleep 2  #睡眠2秒
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived #啟動失敗,將keepalived服務殺死。將vip漂移到其它備份節點
    fi
fi

2、非搶佔模式

global_defs {
   router_id nginx_01  #標識本節點的名稱,通常為hostname
}

vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2 
       weight -20
}

vrrp_instance VI_1 {
    state BACKUP                  
    interface enp0s3              
    virtual_router_id 51          
    mcast_src_ip 192.168.1.201    
    priority 100                  
    advert_int 1                  
    nopreempt     #增加的部分
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
       chk_nginx  # nginx存活狀態檢測指令碼
    }
}

和搶佔模式的配置相比,只改了兩個地方:

1> 在vrrp_instance塊下兩個節點各增加了nopreempt指令,表示不爭搶vip

2> 節點的state都為BACKUP

兩個keepalived節點都啟動後,預設都是BACKUP狀態,雙方在傳送組播資訊後,會根據優先順序來選舉一個MASTER出來。由於兩者都配置了nopreempt,所以MASTER從故障中恢復後,不會搶佔vip。這樣會避免VIP切換可能造成的服務延遲。

第07節 LVS配置

注意了,這裡LVS配置並不是指真的安裝LVS然後用ipvsadm來配置他,而是用keepalived的配置檔案來代替ipvsadm來配置LVS,這樣會方便很多,一個配置檔案搞定這些,維護方便,配置方便是也!

這裡LVS配置也有兩個配置

1,虛擬主機組配置檔案詳解 這個配置是可選的,根據需求來配置吧,這裡配置主要是為了讓一臺realserver上的某個服務可以屬於多個Virtual Server,並且只做一次健康檢查

virtual_server_group <STRING> {
    # VIP port
    <IPADDR> <PORT>
    <IPADDR> <PORT>
    fwmark <INT>
    group string
}

2,虛擬主機配置

virtual server可以以下面三種的任意一種來配置

1. virtual_server IP port{}
2. virtual_server fwmark int{}
3. virtual_server group string{}

下面以第一種比較常用的方式來配詳細解說一下

virtual_server 192.168.1.2 80 {       
    delay_loop 3                          # service polling的delay時間,即服務輪詢的時間間隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh      #LVS排程演算法
    lb_kind NAT|DR|TUN                    #LVS叢集模式                      
    persistence_timeout 120               #會話保持時間(秒),即使用者在120秒內被分配到同一個後端
    persistence_granularity <NETMASK>     #LVS會話保持粒度,ipvsadm中的-M引數,預設是0xffffffff,即每個客戶端都做會話保持
    protocol TCP                          #健康檢查用的是TCP還是UDP
    ha_suspend                            #suspendhealthchecker’s activity
    virtualhost <string>                  #HTTP_GET做健康檢查時,檢查的web伺服器的虛擬主機(即host:頭)

    sorry_server <IPADDR> <PORT>          #備用機,就是當所有後端realserver節點都不可用時,就用這裡設定的,也就是臨時把所有的請求都發送到這裡啦

    real_server <IPADDR> <PORT>  {        #後端真實節點主機的權重等設定
        weight 1                          #給每臺的權重,0表示失效,預設是1
        inhibit_on_failure                 #表示在節點失敗後,把他權重設定成0,而不是衝IPVS中刪除
        notify_up <STRING> | <QUOTED-STRING>     #檢查伺服器正常(UP)後,要執行的指令碼
        notify_down <STRING> | <QUOTED-STRING>   #檢查伺服器失敗(down)後,要執行的指令碼
        HTTP_GET  {                              #健康檢查方式
            url {                                #要堅持的URL,可以有多個
                path /                           #具體路徑
                digest <STRING>                                            
                status_code 200                  #返回狀態碼
            }
            connect_port 80                      #監控檢查的埠
            bindto <IPADD>                       #健康檢查的IP地址
            connect_timeout   3                  #連線超時時間
            nb_get_retry 3                       #重連次數
            delay_before_retry 2                 #重連間隔
       } # END OF HTTP_GET
    } # END OF Realserver
} # END OF Virtual Server

注意:1.3.0以後的版本

1.3.0之前的配置

global_defs {
    router_id ngnix_B

}
vrrp_script chk_nginx {
       script "</dev/tcp/127.0.0.1/81"
       interval 3
       weight -40
}

1.3.0之後的配置

  • 新建一個keepalived_script的使用者,和新建/etc/keepalived/check.sh檔案,把”</dev/tcp/127.0.0.1/81“複製進去。

  • 設定/etc/keepalived/check.sh的屬主使用者是keepalived_script,並且使用者keepalived_script有可執行許可權

  • 然後修改keepalived的配置檔案

global_defs {
    router_id ngnix_A
    enable_script_security   # 新增此行
}
vrrp_script chk_nginx {
       script "/etc/keepalived/check.sh"
       interval 3
       weight -40
}