Keepalived是一個用C編寫的路由軟件,它能檢測服務器的狀態并且自動地切換可用服務器。
1. 雙機nginx架構(無keepalived)
- 準備兩臺服務器
- 分別在服務器上安裝nginx
- 在兩個nginx上配置一樣的應用服務列表
- 負載均衡分流到兩臺服務器上
如圖:
當用戶訪問負載均衡的時候,LB會自動選擇轉發到兩臺服務器的其中一個。這樣有效地進行了分流,降低了流量增大導致服務器壓力劇增的風險。
這種架構有一個嚴重的問題:
- 當其中一個服務器上的nginx掛掉以后,負載均衡還是會有很大的機率會轉發流量到掛掉的服務器上,導致請求無響應。
為了解決該問題,可用引入keepalived
2. 雙機nginx架構(keepalived雙主模式)
如圖:
有以下幾點要注意:
負載均衡綁定的兩個ip是keepalived提供出來的虛擬ip。分別是192.168.1.6 、192.168.1.7
-
服務器上實際ip為
- A服務器 : 192.168.1.2
- B服務器 : 192.168.1.3
keepalived 會不斷地判斷本地nginx是否工作,如果本機nginx停止工作,keepalived會將請求跳轉到兩外一臺機器上
-
達到的效果:
服務器A、B都正常 :
x請求->負載均衡->192.168.1.6->192.168.1.2
y請求->負載均衡->192.168.1.7->192.168.1.3服務器A異常,服務器B正常 :
x請求->負載均衡->192.168.1.6->192.168.1.7->192.168.1.3
y請求->負載均衡->192.168.1.7->192.168.1.3服務器A正常,服務器B異常 :
x請求->負載均衡->192.168.1.6->192.168.1.2
y請求->負載均衡->192.168.1.7->192.168.1.6->192.168.1.2當異常服務器重新啟動時,路由自動恢復,無需人工干擾。
3. keepalived 安裝與配置
分別在服務器A和服務器B上安裝keepalived
? sudo apt-get install build-essential libssl-dev ##安裝編譯環境 ? root@ubuntu: cd ~
? wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
? tar xzvf keepalived*
? cd keepalived*
? ./configure
? make
? sudo make install
? cp /usr/local/etc/keepalived/ /etc/keepalived/keepalived.conf
nginx檢查腳本 : nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
授權腳本: chmod +x /etc/keepalived/nginx_check.sh
修改keepalived配置文件(服務器A)
! Configuration File for keepalived
# 集群資源監控,組合track_script進行
vrrp_script check_haproxy {
script "/etc/keepalived/nginx_check.sh" #檢測 nginx 狀態的腳本路徑
interval 2 #檢測時間間隔
weight -20 #條件成立 權重減20
}
vrrp_instance HAPROXY_HA {
# 設置當前主機為主節點,如果是備用節點,則設置為BACKUP
state MASTER
# 指定HA監測網絡接口,可以用ifconfig查看來決定設置哪一個
interface eth1
# 虛擬路由標識,同一個VRRP實例要使用同一個標識,主備機
virtual_router_id 80
# 設置優先級,確保主節點的優先級高過備用節點
priority 100
# 用于設定主備節點間同步檢查時間間隔
advert_int 2
# 設置主備節點間的通信驗證類型及密碼,同一個VRRP實例中需一致
authentication {
auth_type PASS
auth_pass 1234
}
# 集群資源監控,組合vrrp_script進行
track_script {
check_haproxy
}
# 設置虛擬IP地址,當keepalived狀態切換為MASTER時,此IP會自動添加到系統中
# 當狀態切換到BACKUP時,此IP會自動從系統中刪除
# 可以通過命令ip add查看切換后的狀態
virtual_ipaddress {
192.168.1.6 #虛擬ip配置完之后就用它訪問
}
}
vrrp_instance HAPROXY_HA2 {
# 設置當前主機為主節點,如果是備用節點,則設置為BACKUP
state BACKUP
# 指定HA監測網絡接口,可以用ifconfig查看來決定設置哪一個
interface eth1
# 虛擬路由標識,同一個VRRP實例要使用同一個標識,主備機
virtual_router_id 81
# 設置優先級,確保主節點的優先級高過備用節點
priority 90
# 用于設定主備節點間同步檢查時間間隔
advert_int 2
# 設置主備節點間的通信驗證類型及密碼,同一個VRRP實例中需一致
authentication {
auth_type PASS
auth_pass 1234
}
# 集群資源監控,組合vrrp_script進行
track_script {
check_haproxy
}
# 可以通過命令ip add查看切換后的狀態
virtual_ipaddress {
192.168.1.7 #虛擬ip配置完之后就用它訪問
}
}
修改keepalived配置文件(服務器B)
! Configuration File for keepalived
# 集群資源監控,組合track_script進行
vrrp_script check_haproxy {
script "/etc/keepalived/nginx_check.sh" #檢測 nginx 狀態的腳本路徑
interval 2 #檢測時間間隔
weight -20 #條件成立 權重減20
}
vrrp_instance HAPROXY_HA {
# 設置當前主機為主節點,如果是備用節點,則設置為BACKUP
state BACKUP
# 指定HA監測網絡接口,可以用ifconfig查看來決定設置哪一個
interface eth1
# 虛擬路由標識,同一個VRRP實例要使用同一個標識,主備機
virtual_router_id 80
# 設置優先級,確保主節點的優先級高過備用節點
priority 100
# 用于設定主備節點間同步檢查時間間隔
advert_int 2
# 設置主備節點間的通信驗證類型及密碼,同一個VRRP實例中需一致
authentication {
auth_type PASS
auth_pass 1234
}
# 集群資源監控,組合vrrp_script進行
track_script {
check_haproxy
}
# 設置虛擬IP地址,當keepalived狀態切換為MASTER時,此IP會自動添加到系統中
# 當狀態切換到BACKUP時,此IP會自動從系統中刪除
# 可以通過命令ip add查看切換后的狀態
virtual_ipaddress {
192.168.1.6 #虛擬ip配置完之后就用它訪問
}
}
vrrp_instance HAPROXY_HA2 {
# 設置當前主機為主節點,如果是備用節點,則設置為BACKUP
state MASTER
# 指定HA監測網絡接口,可以用ifconfig查看來決定設置哪一個
interface eth1
# 虛擬路由標識,同一個VRRP實例要使用同一個標識,主備機
virtual_router_id 81
# 設置優先級,確保主節點的優先級高過備用節點
priority 90
# 用于設定主備節點間同步檢查時間間隔
advert_int 2
# 設置主備節點間的通信驗證類型及密碼,同一個VRRP實例中需一致
authentication {
auth_type PASS
auth_pass 1234
}
# 集群資源監控,組合vrrp_script進行
track_script {
check_haproxy
}
# 可以通過命令ip add查看切換后的狀態
virtual_ipaddress {
192.168.1.7 #虛擬ip配置完之后就用它訪問
}
}
啟動keepalived:
? keepalived
? ps -ef|grep keepalived #查看是否運行中
? pkill keepalived #手動關掉進程