keepalived的配置文件:
keepalived只有一個配置文件keepalived.conf,里面主要包括以下幾個配置區域,分別是
global_defs、 全局定義及故障時默認郵件發送 參數
static_ipaddress、 設置本節點的IP 如果你的機器上已經配置了IP和路由,那么這兩個區域可以不用配置
static_routes、 設置本節點路由信息 如果你的機器上已經配置了IP和路由,那么這兩個區域可以不用配置
vrrp_script、 用來做健康檢查,檢查失敗時會將vrrp_instance的priority減少相應的值。
vrrp_instance 用來定義對外提供服務的VIP區域及其相關屬性
virtual_server
global_defs {
notification_email 發生諸如切換操作時發送email通知郵件地址 可以多個每行一個
{
admin@example.com
}
notification_email_from admin@example.com 發送通知郵件 源地址
smtp_server 127.0.0.1 smtp服務器地址
stmp_connect_timeout 30 smtp連接超時時間
router_id node1 機器標識 主要用於通知中
}
靜態地址和路由配置 (正常不用配置)
static_ipaddress {
10.210.214.163/24 brd 10.210.214.255 dev eth0 靜態ip配置,這里實際上和系統里面命令配置IP地址和路由一樣
...}
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和路由。
VRRPD配置:
VRRPD配置包括三個類
VRRP實例(VRRP Instance)
VRRP同步組(synchroization group)
VRRP腳本
1.VRRP實例(instance)
vrrp_instance http {
state MASTER 實例初始狀態(還要根據priority值確定)可以是MASTER 或 BACKUP
interface eth0 實例節點固有IP(非VIP)的網卡,用來發VRRP包
dont_track_primary 忽略VRRP網卡錯誤。(默認未設置)
track_interface { 監控以下網卡,如果任何一個不通就會切換到故障FALT狀態。(可選項)
eth0 eth1
}
mcast_src_ip <IPADDR> vrrp組播包的源地址,默認源地址為master的IP 這里相當於heartbeat的心跳端口
如果沒有設置那么就用默認的綁定的網卡的IP,也就是interface指定的IP地址
garp_master_delay 10 當切換為Master狀態后多久更新ARP緩存
virtual_router_id 51 虛擬路由標識即VRID 相同的VRID為一個組 他將決定多播的MAC地址
priority 100 定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER 的優先級必須大於BACKUP。
這個選項的值最好高於其他機器50個點,該項范圍是1-255
advert_int 1 檢查間隔默認為1秒
authentication { 設置認證
auth_type PASS 認證方式可以是PASS或AH兩種認證方式
autp_pass 1234 認證密碼
}
virtual_ipaddress { 設置虛擬IP 可以設置多個
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
設置虛擬路由的地方
virtual_routes {
# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.110.0/24 via 192.168.200.254 dev eth1
192.168.111.0/24 dev eth2
192.168.112.0/24 via 192.168.100.254
}
track_script {
check_running weight 20 vrrp監控腳本名稱(腳本定義在后邊) 權重
}
nopreempt 設置不搶占,如設置,則state的狀態要為backup
而且這個節點的優先級必須別另外的高。當主MASTER恢復后不搶占資源
preemtp_delay 300 搶占延遲 master啟動多久之后進行接管資源(VIP/Route信息等)
debug debug級別
}
這樣就會發生兩次切換對業務繁忙的網站來說是不好的。
所以我們要在配置文件加入 nopreempt 非搶占 參數,但是這個參數只能用於state 為backup,
故我們在用HA的時候最好master 和backup的state都設置成backup 讓其通過priority來競爭。
這樣加上nopreempt的時候,即使master又好了,依舊不會切換 。
state | nopreempt | priority | |
主機 | backup | 設置 | 100 |
從機 | backup | 不設置 | 50 |
vrrp_script check_running {
script “/usr/local/bin/check_running” 程序位置
interval 10 腳本 執行間隔
weight 10 腳本結果導致的優先級變更:10表示優先級+10;-10則表示優先級-10
}
- 如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加
- 如果腳本執行結果非0,並且weight配置的值小於0,則優先級相應的減少
- 其他情況,原本配置的優先級不變,即配置文件中priority對應的值。
VRRP同步組(synchroization group)配置
定義vrrp_intance組,使得這個組內成員動作一致。
例如兩個vrrp_instance同屬於一個vrrp_rsync_group,
那么其中一個vrrp_instance發生故障切換時,另一個vrrp_instance也會跟着切換(即使這個instance沒有發生故障)。
vrrp_sync_group VG_1 {
group {
http
mysql
}
notify_master /path/to/to_master.sh 表示當切換到master狀態時要執行的腳本
notify_backup /path_to/to_backup.sh 表示當切換到backup狀態時要執行的腳本
notify_fault "/path/fault.sh VG_1" 表示出錯狀態時要執行的腳本
notify /path/to/notify.sh 表示任何狀態切換時都調用該腳本,該腳本在以上三個腳本執行完成之后進行調用
smtp_alert 表示切換時給global defs中定義的郵件地址發送郵件通知
}
virtual_server_group和virtual_server區域
virtual_server_group一般在超大型的LVS中用到,一般LVS用不過這東西,因此不多說。
virtual_server IP Port { delay_loop <INT> lb_algo rr|wrr|lc|wlc|lblc|sh|dh lb_kind NAT|DR|TUN persistence_timeout <INT> persistence_granularity <NETMASK> protocol TCP ha_suspend virtualhost <STRING> alpha omega quorum <INT> hysteresis <INT> quorum_up <STRING>|<QUOTED-STRING> quorum_down <STRING>|<QUOTED-STRING> sorry_server <IPADDR> <PORT> real_server <IPADDR> <PORT> { weight <INT> inhibit_on_failure notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> # HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK HTTP_GET|SSL_GET { url { path <STRING> # Digest computed with genhash digest <STRING> status_code <INT> } connect_port <PORT> connect_timeout <INT> nb_get_retry <INT> delay_before_retry <INT> } } }