原理-->
通過vrrp協議,定義虛擬路由,在多個服務節點上進行轉移.
通過節點優先級,將初始虛擬路由到優先級高的節點上,checker工作進程檢測到主節點出問題時,則降低此節點優先級,從而實現了虛擬路由的重新選擇.
通過notify定義通知腳本,在重新選擇時,發送通知郵件.
故,根據vrrp的運行機制,那么keepalived的默認工作機制就是一主多從.
vrrp狀態轉移機制圖:

若需要雙主,則需要在節點前,添加兩組vip和vmac,然后將客戶端分成兩份,一份指向vip1,一份指向vip2,vip1對應節點A,vip2對應節點B,並通過dns的A記錄,來將客戶的請求,均分到兩個節點上,並通過節點反向代理給上游服務器

功能-->
最初就是為了給IPVS提供高可用,並且可以自動調用ipvsadm添加規則,當然規則信息是又keepalived的配置文件定義的,后來也可以為其他輕量級的調度器(nginx等)提供高可用,不過在非ipvs服務中,需要調用vrrp_script來判定
核心組件-->master進程+vrrp+checkers

master進程基於watchdog來查看子進程的狀態,子進程不停的通過內部套接字給主進程發送心跳信息,如果master沒收到,則kill掉對應的子進程,並重啟
子進程有兩個:
vrrp:虛擬冗余路由協議,作用就是將多個網關虛擬成一個虛擬網關(vip和vmac都是虛擬的),從而解決默認網關失效
checkers:檢查各項服務的可用性,,怎么檢測,則需要自己定義腳本
配置文件-->
/etc/keepalived/keepalived.conf(每個節點都需要)
! Configuration File
for keepalived
#****************************************全局配置段
************************************
global_defs {
#定義接收郵箱
notification_email {
root@localhost
}
#定義發送郵箱(可隨意,即便不存在也可以)
notification_email_from admin@localhost
#定義郵件服務器
smtp_server 127.0.0.1
smtp_connect_timeout
30
router_id LVS_DEVEL
}
#********************************
虛擬路由配置段:定義虛擬路由相關信
*************************************
#為keepalived定義服務檢測腳本,定義關鍵字就是
vrrp_script
vrrp_script chk_keepalived_down {
#如果存在down文件,則返回1(表示keepalived服務失效),否則返回0(表示服務沒有失效)
script "[ -e /etc/keepalived/down ] && exit 1 || exit 0"
#檢測間隔1秒
interval 1
#如果失效,權重減2
weight -2
}
#為nginx提供高可用
vrrp_script chk_nginx {
#檢測nginx是否存在,如果存在返回0,如果不存在返回1
script
"killall -0 nginx"
#檢測間隔時間
interval
1
#如果失敗,權重減2
weight
2
#失敗檢測次數
fall
2
#成功檢測次數
rise
1
}
#定義vrrp實例VI_1(即一個虛擬路由器)
vrrp_instance VI_1 {
#若權重高,則定義此實例為主(主從區別),從為BACKUP
state MASTER
#定義接口(便於從哪個網卡進行宣告,從而進行優先級選舉)
interface eth0
#定義vrrp虛擬路由唯一標識,即確定vmac
virtual_router_id
51
#初始權重(主從區別),從需要比此數據小
priority
100
#通告
advert_int
1
#認證機制,防止未知設備,成為節點
authentication {
#認證類型:密碼
auth_type PASS
#認證密鑰隨機字符串
auth_pass
1111
}
#定義vip
virtual_ipaddress {
10.10.10.2
}
#追蹤腳本
track_script {
chk_keepalived_down
chk_nginx
}
}
#為ipvs提供高可用,需要與vip相同(也可以根據防火牆標識來定義,virtual_server fwmark int)
virtual_server
10.
10.
10.
2
80 {
delay_loop
6
#負載均衡算法,若使用wrr,則real server中的權重不能相同
lb_algo rr
#負載均衡模式
lb_kind DR
#vip掩碼
net_mask 255.255.255.0
#持久連接
persistence_timeout
50
#負載均衡協議
protocol TCP
#類似於fail_back
sorry_server
192.
168.
200.
200
80
#定義第一個真實服務器
real_server
192.
168.
200.
2
80 {
#權重
weight
1
#real server的狀態信息檢測,定義http判定,並使用HTTP_GET方法檢測(也可以使用SSL_GET/TCP_CHECK檢測,其中TCP_CHECK檢測,僅僅只需要定義connect_timeout就可以了)
HTTP_GET {
url {
path
/
status_code
200
}
#超時時間
connect_timeout
3
#重試次數
nb_get_retry
3
#重試等待間隔時間
delay_before_retry
3
}
}
#定義第二個真實服務器
real_server
192.
168.
200.
3
80 {
weight
1
HTTP_GET {
url {
path
/
status_code
200
}
connect_timeout
3
nb_get_retry
3
delay_before_retry
3
}
}
}
1、如何在狀態轉換時進行通知?(需要自己寫腳本來進行通知)
在
/etc/keepalived/keepalived.conf中vrrp_instance上下問中定義通知腳本:
notify_master|backup|fault指切換到master|backup|fault時執行的腳本,使用絕對路徑
notify_master
"/path/to/master.sh master"
notify_backup
"
/path/to/
backup.sh backup"
notify_fault
"
/path/to/
fault.sh fault"
master腳本示例如下-->
轉換成master時發郵件通知:
#!/bin/bash
#
vip
=
192.
168.
1.
250
contact
=
'root@localhost'
thisip
=
`ifconfig eth0
| awk
-F
:
'/inet addr/{print $2}'
| awk
'{print $1}'
`
notify(){
#定義郵件內容
mailbody
=
"vrrp transaction:vrrp changed the keepalived service to $1."
subject
=
"$thisip is to be $1."
echo $mailbody
| mail
-s
"$subject" $contact
}
case
"$1"
in
master)
notify master
exit
0
;;
backup)
notify backup
exit
0
;;
fault)
notify fault
exit
0
;;
*)
echo
'Usage:`basename $0` {master|backup|fault}'
exit
1
;;
esac
在
/etc/keepalived/keepalived.conf中添加virtual_server上下文:
virutal server
realserver
health check
配置格式如下-->
virtual_server vip port {
lb_kind
#定義負載均衡算法(rr,wrr,sh,dh,lblc,lc)
負載均衡集群之LVS算法和模型
lb_algo
real_server rip port {
weight
notify_up "up.sh"
notify_down "down.sh"
}
}
配置示例-->
virtual_server
10.
10.
10.
2
80 {
delay_loop
6
#負載均衡算法
lb_algo rr
#負載均衡模式
lb_kind DR
#持久連接
persistence_timeout
50
#負載均衡協議
protocol TCP
#類似於fail_back
sorry_server
192.
168.
200.
200
80
#定義第一個真實服務器
real_server
192.
168.
200.
2
80 {
#權重
weight
1
#定義http判定,並使用get方法
HTTP_GET {
url {
path
/
status_code
200
}
#超時時間
connect_timeout
3
#重試次數
nb_get_retry
3
#重試等待間隔時間
delay_before_retry
3
}
}
#定義第二個真實服務器
real_server
192.
168.
200.
3
80 {
weight
1
HTTP_GET {
url {
path
/
status_code
200
}
connect_timeout
3
nb_get_retry
3
delay_before_retry
3
}
}
3、如何對某特定服務器做高可用?(這里以nginx為例)
關鍵點:監控服務和追蹤服務,具體查看上面的配置文件
4、如何實現基於多虛擬路由的master/master模型
定義兩個vrrp_instance即可,需要注意的是vmac標識不能一樣