title: “Keepalived + Nginx 實現高可用”
url: “https://wsk1103.github.io/”
tags:
- 架構
- Nginx
- Keepalived
PS: 理解Keepalived
Keepalived + Nginx 實現高可用的思路:
- 請求不是直接打到 Nginx 上,而是先通過 Keepalived (虛擬IP,VIP)
- Keepalived 應該能監控 Nginx 的生命狀態
實現:
- 準備至少2臺服務器
IP地址
- 192.168.134.128(設置爲Master)
- 192.168.134.129(設置爲BackUp)
-
安裝 和啓動 keepalived
安裝 和啓動 keepalived -
修改 keepalived 配置文件
[root@wsk1103 ~]# vi /etc/keepalived/keepalived.conf
- 修改Master的配置文件 192.168.134.128
修改之前可以先複製一份備份。
! Configuration File for keepalived
global_defs {
router_id keepalived_128 #設置keepalived的唯一ID,不能一致,一般可以把本地IP當做唯一ID
}
vrrp_script nginx_check {
script "/etc/keepalived/nginx_check.sh" #定時檢測nginx狀態的腳步
interval 2 #每2秒檢測一次
weight -20 #權重
}
vrrp_instance VI_1 {
state MASTER #這裏設置爲Master
interface ens32 #本地網卡名稱,通過 ifconfig 得知
virtual_router_id 200 #虛擬路由的 ID 號,2個節點的設置必須一致,相同的 VRID 爲一個組,他將決定多播的MAC地址
priority 50 #節點的優先級,範圍爲 0-254 ,Master的優先級必須必BackUp的高。
advert_int 1 #組播信息發送的時間間隔,默認爲1s。2個節點的設置必須一致。
#設置賬戶校驗信息,2個節點必須一致。
authentication {
auth_type PASS
auth_pass 1111
}
#虛擬IP池,2個節點也必須一致。
virtual_ipaddress {
192.168.134.200 #虛擬IP,可以設置多個。
#192.168.134.201
}
# 腳本配置,不能寫在 vrrp_script 後面,否則會導致腳本不生效。
track_script {
nginx_check
}
}
- 修改 BackUp 的配置文件 192.168.134.129
! Configuration File for keepalived
global_defs {
router_id keepalived_129 #設置keepalived的唯一ID,不能一致,一般可以把本地IP當做唯一ID
}
vrrp_script nginx_check {
script "/etc/keepalived/nginx_check.sh" #定時檢測nginx狀態的腳步
interval 2 #每2秒檢測一次
weight -20 #權重
}
vrrp_instance VI_1 {
state BACKUP #這裏設置爲 BackUp
interface ens33 #本地網卡名稱,通過 ifconfig 得知
virtual_router_id 200 #虛擬路由的 ID 號,2個節點的設置必須一致,相同的 VRID 爲一個組,他將決定多播的MAC地址
priority 40 #節點的優先級,範圍爲 0-254 ,Master的優先級必須必BackUp的高。
advert_int 1 #組播信息發送的時間間隔,默認爲1s。2個節點的設置必須一致。
#設置賬戶校驗信息,2個節點必須一致。
authentication {
auth_type PASS
auth_pass 1111
}
#虛擬IP池,2個節點也必須一致。
virtual_ipaddress {
192.168.134.200 #虛擬IP,可以設置多個。
#192.168.134.201
}
# 腳本配置,不能寫在 vrrp_script 後面,否則會導致腳本不生效。
track_script {
nginx_check
}
}
- 創建check_nginx 腳本
[root@localhost /]# cd /etc/keepalived/
[root@wsk1103 keepalived]# touch nginx_check.sh
[root@wsk1103 keepalived]# chmod 755 nginx_check.sh
[root@wsk1103 keepalived]# sh nginx_check.sh
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
腳本含義
判斷 Nginx 是否已經啓動(進程 Nginx 的個數 = 0,沒有啓動)。
如果沒有啓動,則啓動 Nginx ,並且延遲2秒後啓動,防止搶佔資源。
再次判斷 Nginx 有沒有成功啓動,如果沒有啓動成功,則 kill 了 keepalived 。
- 重啓 keepalived 和查看 IP 綁定情況
[root@wsk1103 keepalived]# service keepalived restart
Redirecting to /bin/systemctl restart keepalived.service
[root@wsk1103 keepalived]# ip addr
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:00:4d:76 brd ff:ff:ff:ff:ff:ff
inet 192.168.134.128/24 brd 192.168.134.255 scope global noprefixroute dynamic ens32
valid_lft 1363sec preferred_lft 1363sec
inet 192.168.134.200/32 scope global ens32 #這裏可以看到VIP已經綁定到對應的網卡。
valid_lft forever preferred_lft forever
inet6 fe80::b8c2:db98:5162:2e02/64 scope link noprefixroute
valid_lft forever preferred_lft forever
- 修改 Nginx 的初始頁面 index.htm
[root@localhost keepalived]# cd /usr/share/nginx/html
[root@localhost html]# vi index.html
在 128 的服務器上,加入 128 的字樣。在 129 的服務器上,加入 129 的字樣
- 檢驗
6.1 頁面訪問 192.168.134.200
6.2 停止 128 的 keepalived 服務
[root@wsk1103 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
可以看到訪問已經轉移到 129 的服務器上了。
6.3 重啓 128 的keepalived 服務
[root@wsk1103 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
重啓後,128 的 keepalived 重新接管,繼續做爲 Master
6.4 停止 128 的 nginx,觀察 nginx 是否會重新啓動
[root@wsk1103 keepalived]# service nginx stop
Redirecting to /bin/systemctl stop nginx.service
[root@wsk1103 keepalived]# ps -ef |grep nginx
root 21962 1 0 13:27 ? 00:00:00 nginx: master process /usr/sbin/nginx
root 21963 21962 0 13:27 ? 00:00:00 nginx: worker process
root 21965 21962 0 13:27 ? 00:00:00 nginx: worker process
root 21966 21962 0 13:27 ? 00:00:00 nginx: worker process
root 21967 21962 0 13:27 ? 00:00:00 nginx: worker process
root 21974 21321 0 13:27 pts/0 00:00:00 grep --color=auto nginx