lvs容易出現(xiàn)單點故障顽决,keepalive可以很好的解決這個問題,配置好keepalive會自動生成ipvs規(guī)則下面讓我們來動手試試吧
將所有的地址都配好后我們只需要在兩臺lvs主機上編輯keepalive的配置文件
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.31.66/24 dev ens33 label ens33:0
}
}
virtual_server 192.168.31.66 80 {
delay_loop 1 #每隔1秒檢測一次
lb_algo wrr #wrr算法
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.31.203 80 {
weight 1
HTTP_GET { #獲取健康狀態(tài)的方法
url {
path /index.html
status_code 200
}
nb_get_retry 3 #失敗重試3次
delay_before_retry 2 #每一次重試之前延遲2秒
connect_timeout 3 #超時時長
}
}
real_server 192.168.31.204 80 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200
}
nb_get_retry 3 #失敗重試3次
delay_before_retry 2 #每一次重試之前延遲2秒
connect_timeout 3 #超時時長
}
}
}
與普通的keepalive不同的是需要定義一個虛擬服務(wù)器导匣,然后在里面再定義兩臺真正的服務(wù)器
啟動keepalive服務(wù)
配置好后就會自動生成ipvs規(guī)則了
下面我們來測試下
可以看到已經(jīng)成功的負載均衡了擎值,就算我們down掉其中一臺主機lvs也能正常的工作,可用性大大的增強了逐抑。
就算我們down掉兩臺服務(wù)器也能訪問sorry頁面
當(dāng)然這樣只有一臺lvs主機在服務(wù)有點浪費資源鸠儿,我們可以設(shè)置keepalived雙主模式,讓兩臺主機都動起來
當(dāng)然lvs使用起來由諸多的限制性,生產(chǎn)中較為常見的一般都是keepalived+nginx配置进每,現(xiàn)在讓我們動手實驗看看吧汹粤。
keepalived調(diào)用外部的輔助腳本進行資源監(jiān)控,并根據(jù)監(jiān)控的結(jié)果狀態(tài)能實現(xiàn)優(yōu)先動態(tài)調(diào)整田晚;也就是說當(dāng)?shù)刂忿D(zhuǎn)移到本主機上就啟動nginx嘱兼,轉(zhuǎn)走就關(guān)閉nginx這一切都是通過腳本的執(zhí)行狀態(tài)來完成,keepalived本身沒有調(diào)動nginx的功能贤徒。當(dāng)然如果是雙主模式就不需要關(guān)閉nginx芹壕,只需要啟動就行了。
分兩步:(1) 先定義一個腳本接奈;(2) 調(diào)用此腳本踢涌;
注意腳本要先定義在虛擬路由器之外,然后用track_script在虛擬路由器之內(nèi)調(diào)用
vrrp_script <SCRIPT_NAME> {
script "" #腳本如果很簡單可直接寫在這
interval INT #每隔多久腳本執(zhí)行一次
weight -INT #如果失敗當(dāng)前節(jié)點的priority減去多少(減去后因當(dāng)小于備用節(jié)點)
fall INT #至少檢查幾次
rise INT# 如果可用立即加權(quán)
}
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
...
}
配置示例:
vrrp_script chk_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
weight -10
interval 1
fall 1
rise 1
}
vrrp_script chk_nginx {
script "killall -0 nginx && exit 0 || exit 1"
interval 1
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.31.66/24 dev ens33 label ens33:0
}
track_script {
chk_down
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
在這個腳本我們通過判斷目錄下是否存在down文件來調(diào)整服務(wù)的優(yōu)先級
這個時候如果我們創(chuàng)建一個down文件序宦,則優(yōu)先級就會被降低睁壁,ip地址會被移動到BACKUP上
既然這樣我們也可以通過腳本來控制nginx,如果狀態(tài)是主我們就啟動nginx如果狀態(tài)是備就關(guān)掉nginx
在nginx的主配置文件中添加
upstream webservs {
server 192.168.0.10:80
server 192.168.0.11:80
server 192.168.0.12:80
{
proxy_pass http://webservs;
#通知腳本
notify() {
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
systemctl start nginx
notify master
;;
backup)
systemctl restart nginx
notify backup
;;
fault)
systemctl stop nginx