keepalived用了好久,工做原理也講了不少遍,可是每次再遇到新的場景老是要搜好多文檔來完成配置問題,此次統一梳理一下。
參考官網:https://www.keepalived.org/manpage.htmlhtml
Keepalived經過VRRP(virtual router redundancy protocol)虛擬路由冗餘協議來實現高可用。 在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組會有1個master角色和N(N≥1)個backup角色。 Keepalived有三個模塊:core、check、vrrp。其中:nginx
keepalived配置文件按層級和模塊劃分的,每層由"{ }"來界定。 在主配置文件中能夠經過include來涵蓋多個子配置文件。 語法說明:算法
配置文件包括如下幾個模塊:後端
global_defs 全局配置 vrrpd 1. vrrp_script添加一個週期性執行的腳本。腳本的退出狀態碼會被調用它的全部的VRRP Instance記錄。 2. vrrp_sync_group將全部相關的VRRP實例定義在一塊兒,做爲一個VRRP Group,若是組內的任意一個實例出現問題,均可以實現Failover 3. garp_group 4. vrrp_instance LVS配置 virtual_server real_server real_server中的健康檢查 HTTP_GET or SSL_GET TCP_CHECK TCP_CHECK DNS_CHECK DNS_CHECK
! Configuration File for keepalived global_defs { #全局定義部分 notification_email { #設置報警郵件地址,可設置多個 acassen@firewall.loc #接收通知的郵件地址 failover@firewall.loc } notification_email_from test0@163.com #設置 發送郵件通知的地址 smtp_server smtp.163.com #設置 smtp server 地址,但是ip或域名.可選端口號 (默認25) smtp_connect_timeout 30 #設置 鏈接 smtp server的超時時間 router_id LVS_DEVEL #主機標識,用於郵件通知 vrrp_strict #嚴格執行VRRP協議規範,此模式不支持節點單播 script_user keepalived_script #指定運行腳本的用戶名和組。默認使用用戶的默認組。如未指定,默認爲keepalived_script 用戶,如無此用戶,則使用root enable_script_security #如過路徑爲非root可寫,不要配置腳本爲root用戶執行。 }
default_interface eth0:設置靜態地址默認綁定的端口。默認是eth0。 lvs_sync_daemon <INTERFACE> <VRRP_INSTANCE> [id <SYNC_ID>] [maxlen <LEN>] [port <PORT>] [ttl <TTL>] [group <IP ADDR>] 設置LVS同步服務的相關內容。能夠同步LVS的狀態信息。 INTERFACE:指定同步服務綁定的接口。 VRRP_INSTANCE:指定同步服務綁定的VRRP實例。 id <SYNC_ID>:指定同步服務所使用的SYNCID,只有相同的SYNCID纔會同步。範圍是0-255. maxlen:指定數據包的最大長度。範圍是1-65507 port:指定同步所使用的UDP端口。 group:指定組播IP地址。 lvs_flush:在keepalived啓動時,刷新全部已經存在的LVS配置。 vrrp_garp_master_delay 10:當轉換爲MASTER狀態時,延遲多少秒發送第二組的免費ARP。默認爲5s,0表示不發送第二組免的免費ARP。 vrrp_garp_master_repeat 1:當轉換爲MASTER狀態時,在一組中一次發送的免費ARP數量。默認是5. vrrp_garp_lower_prio_delay 10:當MASTER收到更低優先級的通告時,延遲多少秒發送第二組的免費ARP。 vrrp_garp_lower_prio_repeat 1:當MASTER收到更低優先級的通告時,在一組中一次發送的免費ARP數量。 vrrp_garp_master_refresh 60:當keepalived成爲MASTER之後,刷新免費ARP的最小時間間隔(會再次發送免費ARP)。默認是0,表示不會刷新。 vrrp_garp_master_refresh_repeat 2: 當keepalived成爲MASTER之後,每次刷新會發送多少個免費ARP。默認是1. vrrp_garp_interval 0.001:在一個接口發送的兩個免費ARP之間的延遲。能夠精確到毫秒級。默認是0. vrrp_lower_prio_no_advert true|false:默認是false。若是收到低優先級的通告,不發送任何通告。 vrrp_version 2|3:設置默認的VRRP版本。默認是2. vrrp_check_unicast_src:在單播模式中,開啓對VRRP數據包的源地址作檢查,源地址必須是單播鄰居之一。 vrrp_skip_check_adv_addr:默認是不跳過檢查。檢查收到的VRRP通告中的全部地址可能會比較耗時,設置此命令的意思是,若是通告與接收的上一個通告來自相同的master路由器,則不執行檢查(跳過檢查)。 vrrp_strict:嚴格遵照VRRP協議。下列狀況將會阻止啓動Keepalived:1. 沒有VIP地址。2. 單播鄰居。3. 在VRRP版本2中有IPv6地址。 vrrp_iptables:不添加任何iptables規則。默認是添加iptables規則的。 若是vrrp進程或check進程超時,能夠用下面的4個選項。可使處於BACKUP狀態的VRRP實例變成MASTER狀態,即便MASTER實例依然在運行。由於MASTER或BACKUP系統比較慢,不能及時處理VRRP數據包。 vrrp_priority <-20 -- 19>:設置VRRP進程的優先級。 checker_priority <-20 -- 19>:設置checker進程的優先級。 vrrp_no_swap:vrrp進程不可以被交換。 checker_no_swap:checker進程不可以被交換。 script_user <username> [groupname]:設置運行腳本默認用戶和組。若是沒有指定,則默認用戶爲keepalived_script(須要該用戶存在),不然爲root用戶。默認groupname同username。 enable_script_security:若是腳本路徑的任一部分對於非root用戶來講,都具備可寫權限,則不會以root身份運行腳本。 nopreempt 默認是搶佔模式 要是用非搶佔式的就加上nopreempt 注意:上述爲global_defs中的指令
VRRPD的配置包括以下子塊:bash
- vrrp_script
- vrrp_sync_group
- garp_group
- vrrp_instance
做用:添加一個週期性執行的腳本。腳本的退出狀態碼會被調用它的全部的VRRP Instance記錄。 注意:至少有一個VRRP實例調用它而且優先級不能爲0.優先級範圍是1-254. vrrp_script <SCRIPT_NAME> { ... } 選項說明: script "/path/to/somewhere":指定要執行的腳本的路徑。 interval <INTEGER>:指定腳本執行的間隔。單位是秒。默認爲1s。 timeout <INTEGER>:指定在多少秒後,腳本被認爲執行失敗。 weight <-254 --- 254>:調整優先級。默認爲2. rise <INTEGER>:執行成功多少次才認爲是成功。 fall <INTEGER>:執行失敗多少次才認爲失敗。 user <USERNAME> [GROUPNAME]:運行腳本的用戶和組。 init_fail:假設腳本初始狀態是失敗狀態。 解釋: weight: 1. 若是腳本執行成功(退出狀態碼爲0),weight大於0,則priority增長。 2. 若是腳本執行失敗(退出狀態碼爲非0),weight小於0,則priority減小。 3. 其餘狀況下,priority不變。
命令說明: state MASTER|BACKUP:指定該keepalived節點的初始狀態。 interface eth0:vrrp實例綁定的接口,用於發送VRRP包。 use_vmac [<VMAC_INTERFACE>]:在指定的接口產生一個子接口,如vrrp.51,該接口的MAC地址爲組播地址,經過該接口向外發送和接收VRRP包。 vmac_xmit_base:經過基本接口向外發送和接收VRRP數據包,而不是經過VMAC接口。 native_ipv6:強制VRRP實例使用IPV6.(當同時配置了IPV4和IPV6的時候) dont_track_primary:忽略VRRP接口的錯誤,默認是沒有配置的。 track_interface { eth0 eth1 weight <-254-254> ... }:若是track的接口有任何一個出現故障,都會進入FAULT狀態。 track_script { <SCRIPT_NAME> <SCRIPT_NAME> weight <-254-254> }:添加一個track腳本(vrrp_script配置的腳本。) mcast_src_ip <IPADDR>:指定發送組播數據包的源IP地址。默認是綁定VRRP實例的接口的主IP地址。 unicast_src_ip <IPADDR>:指定發送單薄數據包的源IP地址。默認是綁定VRRP實例的接口的主IP地址。 version 2|3:指定該實例所使用的VRRP版本。 unicast_peer { <IPADDR> ... }:採用單播的方式發送VRRP通告,指定單播鄰居的IP地址。 virtual_router_id 51:指定VRRP實例ID,範圍是0-255. priority 100:指定優先級,優先級高的將成爲MASTER。 advert_int 1:指定發送VRRP通告的間隔。單位是秒。 authentication { auth_type PASS|AH:指定認證方式。PASS簡單密碼認證(推薦),AH:IPSEC認證(不推薦)。 auth_pass 1234:指定認證所使用的密碼。最多8位。 } virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 }:指定VIP地址。 nopreempt:設置爲不搶佔。默認是搶佔的,當高優先級的機器恢復後,會搶佔低優先級的機器成爲MASTER,而不搶佔,則容許低優先級的機器繼續成爲MASTER,即便高優先級的機器已經上線。若是要使用這個功能,則初始化狀態必須爲BACKUP。 preempt_delay:設置搶佔延遲。單位是秒,範圍是0---1000,默認是0.發現低優先級的MASTER後多少秒開始搶佔。 通知腳本: notify_master <STRING>|<QUOTED-STRING> [username [groupname]] notify_backup <STRING>|<QUOTED-STRING> [username [groupname]] notify_fault <STRING>|<QUOTED-STRING> [username [groupname]] notify <STRING>|<QUOTED-STRING> [username [groupname]] # 當中止VRRP時執行的腳本。 notify_stop <STRING>|<QUOTED-STRING> [username [groupname]] smtp_alert
做用:將全部相關的VRRP實例定義在一塊兒,做爲一個VRRP Group,若是組內的任意一個實例出現問題,均可以實現Failover。 vrrp_sync_group VG_1 { group { inside_network # vrrp instance name outside_network # vrrp instance name ... } ... } 說明: 若是username和groupname沒有指定,則以默認的script_user所指定的用戶和組。 1. notify_master /path/to_master.sh [username [groupname]] 做用:當成爲MASTER時,以指定的用戶和組執行腳本。 2. notify_backup /path/to_backup.sh [username [groupname]] 做用:當成爲BACKUP時,以指定的用戶和組執行腳本。 3. notify_fault "/path/fault.sh VG_1" [username [groupname]] 做用:當該同步組Fault時,以指定的用戶和組執行腳本。 4. notify /path/notify.sh [username [groupname]] 做用:在任何狀態都會以指定的用戶和組執行腳本。 說明:該腳本會在notify_*腳本後執行。 notify可使用3個參數,以下: $1:能夠是GROUP或INTANCE,代表後面是組仍是實例。 $2:組名或實例名。 $3:轉換後的目標狀態。有:MASTER、BACKUP、FAULT。 5. smtp_alert:當狀態發生改變時,發送郵件。 6. global_tracking:全部的VRRP實例共享相同的tracking配置。 注意:腳本文件要加上x權限,同時指令最好寫絕對路徑。
LVS模塊結構: virtual_server{ … ... real_server{ … ... } }
virtual_server IP Port | virtual_server fwmark int | virtual_server group string { delay_loop <INT>:健康檢查的時間間隔。 lb_argo rr|wrr|lc|wlc|lblc|sh|dh:LVS調度算法。 lb_kind NAT|DR|TUN:LVS模式。 persistence_timeout 360:持久化超時時間,單位是秒。默認是6分鐘。 persistence_granularity:持久化鏈接的顆粒度。 protocol TCP|UDP|SCTP:4層協議。 ha_suspend:若是virtual server的IP地址沒有設置,則不進行後端服務器的健康檢查。 virtualhost <STRING>:爲HTTP_GET和SSL_GET執行要檢查的虛擬主機。如virtualhost www.felix.com sorry_server <IPADDR> <PORT>:添加一個備用服務器。當全部的RS都故障時。 sorry_server_inhibit:將inhibit_on_failure指令應用於sorry_server指令。 alpha:在keepalived啓動時,假設全部的RS都是down,以及健康檢查是失敗的。有助於防止啓動時的誤報。默認是禁用的。 omega:在keepalived終止時,會執行quorum_down指令所定義的腳本。 quorum <INT>:默認值1. 全部的存活的服務器的總的最小權重。 quorum_up <STRING>:當quorum增加到知足quorum所定義的值時,執行該腳本。 quorum_down <STRING>:當quorum減小到不知足quorum所定義的值時,執行該腳本。 }
real_server IP Port { weight <INT>:給服務器指定權重。默認是1. inhibit_on_failure:當服務器健康檢查失敗時,將其weight設置爲0,而不是從Virtual Server中移除。 notify_up <STRING>:當服務器健康檢查成功時,執行的腳本。 notify_down <STRING>:當服務器健康檢查失敗時,執行的腳本。 uthreshold <INT>:到這臺服務器的最大鏈接數。 lthreshold <INT>:到這臺服務器的最小鏈接數。 }
HTTP_GET | SSL_GET { url { path <STRING>:指定要檢查的URL的路徑。如path / or path /mrtg2 digest <STRING>:摘要。計算方式:genhash -s 172.17.100.1 -p 80 -u /index.html status_code <INT>:狀態碼。 } nb_get_retry <INT>:get嘗試次數。 delay_before_retry <INT>:在嘗試以前延遲多長時間。 connect_ip <IP ADDRESS>:鏈接的IP地址。默認是real server的ip地址。 connect_port <PORT>:鏈接的端口。默認是real server的端口。 bindto <IP ADDRESS>:發起鏈接的接口的地址。 bind_port <PORT>:發起鏈接的源端口。 connect_timeout <INT>:鏈接超時時間。默認是5s。 fwmark <INTEGER>:使用fwmark對全部出去的檢查數據包進行標記。 warmup <INT>:指定一個隨機延遲,最大爲N秒。可防止網絡阻塞。若是爲0,則關閉該功能。 } TCP_CHECK { connect_ip <IP ADDRESS>:鏈接的IP地址。默認是real server的ip地址。 connect_port <PORT>:鏈接的端口。默認是real server的端口。 bindto <IP ADDRESS>:發起鏈接的接口的地址。 bind_port <PORT>:發起鏈接的源端口。 connect_timeout <INT>:鏈接超時時間。默認是5s。 fwmark <INTEGER>:使用fwmark對全部出去的檢查數據包進行標記。 warmup <INT>:指定一個隨機延遲,最大爲N秒。可防止網絡阻塞。若是爲0,則關閉該功能。 retry <INIT>:重試次數。默認是1次。 delay_before_retry <INT>:默認是1秒。在重試以前延遲多少秒。 } SMTP_CHECK { connect_ip <IP ADDRESS>:鏈接的IP地址。默認是real server的ip地址。 connect_port <PORT>:鏈接的端口。默認是real server的端口。 默認是25端口 bindto <IP ADDRESS>:發起鏈接的接口的地址。 bind_port <PORT>:發起鏈接的源端口。 connect_timeout <INT>:鏈接超時時間。默認是5s。 fwmark <INTEGER>:使用fwmark對全部出去的檢查數據包進行標記。 warmup <INT>:指定一個隨機延遲,最大爲N秒。可防止網絡阻塞。若是爲0,則關閉該功能。 retry <INT>:重試次數。 delay_before_retry <INT>:在重試以前延遲多少秒。 helo_name <STRING>:用於SMTP HELO請求的字符串。 } DNS_CHECK { connect_ip <IP ADDRESS>:鏈接的IP地址。默認是real server的ip地址。 connect_port <PORT>:鏈接的端口。默認是real server的端口。 默認是25端口 bindto <IP ADDRESS>:發起鏈接的接口的地址。 bind_port <PORT>:發起鏈接的源端口。 connect_timeout <INT>:鏈接超時時間。默認是5s。 fwmark <INTEGER>:使用fwmark對全部出去的檢查數據包進行標記。 warmup <INT>:指定一個隨機延遲,最大爲N秒。可防止網絡阻塞。若是爲0,則關閉該功能。 retry <INT>:重試次數。默認是3次。 type <STRING>:DNS query type。A/NS/CNAME/SOA/MX/TXT/AAAA name <STRING>:DNS查詢的域名。默認是(.) } MISC_CHECK { misc_path <STRING>:外部的腳本或程序路徑。 misc_timeout <INT>:腳本執行超時時間。 user USERNAME [GROUPNAME]:指定運行該腳本的用戶和組。若是沒有指定GROUPNAME,則GROUPNAME同USERNAME。 misc_dynamic:根據退出狀態碼動態調整權重。 0,健康檢查成功,權重不變。 1,健康檢查失敗。 2-255,健康檢查成功。權重設置爲退出狀態碼減去2.如退出狀態碼是250,則權重調整爲248 warmup <INT>:指定一個隨機延遲,最大爲N秒。可防止網絡阻塞。若是爲0,則關閉該功能。 }
! Configuration File for keepalived global_defs { #全局定義部分 notification_email { #設置報警郵件地址,可設置多個 acassen@firewall.loc #接收通知的郵件地址 } notification_email_from test0@163.com #設置 發送郵件通知的地址 smtp_server smtp.163.com #設置 smtp server 地址,但是ip或域名.可選端口號 (默認25) smtp_connect_timeout 30 #設置 鏈接 smtp server的超時時間 router_id LVS_DEVEL #主機標識,用於郵件通知 vrrp_skip_check_adv_addr vrrp_strict #嚴格執行VRRP協議規範,此模式不支持節點單播 vrrp_garp_interval 0 vrrp_gna_interval 0 script_user keepalived_script #指定運行腳本的用戶名和組。默認使用用戶的默認組。如未指定,默認爲keepalived_script 用戶,如無此用戶,則使用root enable_script_security #如過路徑爲非root可寫,不要配置腳本爲root用戶執行。 } vrrp_script chk_nginx_service { #VRRP 腳本聲明 script "/etc/keepalived/chk_nginx.sh" #週期性執行的腳本 interval 3 #運行腳本的間隔時間,秒 weight -20 #權重,priority值減去此值要小於備服務的priority值 fall 3 #檢測幾回失敗才爲失敗,整數 rise 2 #檢測幾回狀態爲正常的,才確認正常,整數 user keepalived_script #執行腳本的用戶或組 } vrrp_instance VI_1 { #vrrp 實例部分定義,VI_1自定義名稱 state MASTER #指定 keepalived 的角色,必須大寫 可選值:MASTER|BACKUP interface ens33 #網卡設置,lvs須要綁定在網卡上,realserver綁定在迴環口。區別:lvs對訪問爲外,realserver爲內不易暴露本機信息 virtual_router_id 51 #虛擬路由標識,是一個數字,同一個vrrp 實例使用惟一的標識,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個標識必須保持一致 priority 100 #定義優先級,數字越大,優先級越高。 advert_int 1 #設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,單位爲秒,兩個節點設置必須同樣 authentication { #設置驗證類型和密碼,兩個節點必須一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #設置虛擬IP地址,能夠設置多個虛擬IP地址,每行一個 192.168.119.130 } track_script { #腳本監控狀態 chk_nginx_service #可加權重,但會覆蓋聲明的腳本權重值。chk_nginx_service weight -20 } notify_master "/etc/keepalived/start_haproxy.sh start" #當前節點成爲master時,通知腳本執行任務 notify_backup "/etc/keepalived/start_haproxy.sh stop" #當前節點成爲backup時,通知腳本執行任務 notify_fault "/etc/keepalived/start_haproxy.sh stop" #噹噹前節點出現故障,執行的任務; } virtual_server 192.168.119.130 80 { #定義RealServer對應的VIP及服務端口,IP和端口之間用空格隔開 delay_loop 6 #每隔6秒查詢realserver狀態 lb_algo rr #後端調試算法(load balancing algorithm) lb_kind DR #LVS調度類型NAT/DR/TUN #persistence_timeout 60 同一IP的鏈接60秒內被分配到同一臺realserver protocol TCP #用TCP協議檢查realserver狀態 real_server 192.168.119.120 80 { weight 1 #權重,最大越高,lvs就越優先訪問 TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒無響應超時 retry 3 #重連次數3次 delay_before_retry 3 #重連間隔時間 connect_port 80 #健康檢查realserver的端口 } } real_server 192.168.119.121 80 { weight 1 #權重,最大越高,lvs就越優先訪問 TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒無響應超時 retry 3 #重連次數3次 delay_before_retry 3 #重連間隔時間 connect_port 80 #健康檢查realserver的端口 } } } vrrp_instance VI_2 { #vrrp 實例部分定義,VI_1自定義名稱 state BACKUP #指定 keepalived 的角色,必須大寫 可選值:MASTER|BACKUP 分別表示(主|備) interface ens33 #網卡設置,綁定vip的子接口,lvs須要綁定在網卡上,realserver綁定在迴環口。區別:lvs對訪問爲外,realserver爲內不易暴露本機信息 virtual_router_id 52 #虛擬路由標識,是一個數字,同一個vrrp 實例使用惟一的標識,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個標識必須保持一致 priority 90 #定義優先級,數字越大,優先級越高。 advert_int 1 #設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,單位爲秒,兩個節點設置必須同樣 authentication { #設置驗證類型和密碼,兩個節點必須一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #設置虛擬IP地址,能夠設置多個虛擬IP地址,每行一個 192.168.119.131 } } virtual_server 192.168.119.131 80 { #定義RealServer對應的VIP及服務端口,IP和端口之間用空格隔開 delay_loop 6 #每隔6秒查詢realserver狀態 lb_algo rr #後端調試算法(load balancing algorithm) lb_kind DR #LVS調度類型NAT/DR/TUN #persistence_timeout 60 #同一IP的鏈接60秒內被分配到同一臺realserver protocol TCP #用TCP協議檢查realserver狀態 real_server 192.168.119.120 80 { weight 1 #權重,最大越高,lvs就越優先訪問 TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒無響應超時 retry 3 #重連次數3次 delay_before_retry 3 #重連間隔時間 connect_port 80 #健康檢查realserver的端口 } } real_server 192.168.119.121 80 { weight 1 #權重,最大越高,lvs就越優先訪問 TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒無響應超時 retry 3 #重連次數3次 delay_before_retry 3 #重連間隔時間 connect_port 80 #健康檢查realserver的端口 } } }
請關注,樓主公衆號!服務器