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
}