Keepalived搭建nginx高可用的實現(xiàn)
一、環(huán)境準備
兩臺裝有 nginx 的 CentOS 虛擬機。

[root@nginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html [root@nginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html
二、原理

Keepalived 為我們后端服務(wù)器組虛擬出一組 VIP,該 VIP 只能由優(yōu)先級最高的一臺服務(wù)器持有??蛻舳嗽L問,就只訪問 VIP。

當主服務(wù)器掛掉之后,Keepalived 自動幫我們把 VIP 漂移到 BACKUP 服務(wù)器。以此來保證服務(wù)的高可用。
Keepalived 通過檢測服務(wù)器上的 Keepalived 進程的存活狀態(tài),來判斷服務(wù)器是否存活。
三、安裝
1)安裝 keepalived
# 在 nginx1 安裝 keepalived [root@nginx1 ~]# yum install -y keepalived # 在 nginx2 安裝 keepalived [root@nginx2 ~]# yum install -y keepalived
2)配置
使用 yum 安裝后配置文件在 /etc/keepalived/keepalived.conf
# 備份 nginx1 keepalived 配置文件 [root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak # 備份 nginx2 keepalived 配置文件 [root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
- nginx1 上 keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id lb1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
}- global_defs:全局配置標識。
- router_id:路由器標識,一般不用改,也可以寫成每個主機自己的主機名。
- vrrp_instance:一個 vrrp_instance 就是定義一個虛擬路由器的,VI_1 是實例名稱。
- state:指定 keepalived 的角色,MASTER 表示此主機是主服務(wù)器,BACKUP 表示此主機是備服務(wù)器。
- interface:指定檢測網(wǎng)絡(luò)的網(wǎng)卡接口。就比如下圖的 ens33。

- virtual_router_id:虛擬路由標識,數(shù)字形式,同一個 VRRP 實例使用唯一的標識,即在同一個 vrrp_instance下,master 和 backup 必須一致。
- priority:節(jié)點優(yōu)先級,數(shù)字越大表示節(jié)點的優(yōu)先級越高,在一個 VRRP 實例下,MASTER 的優(yōu)先級必須要比 BACKUP 高,不然就會切換角色。
- advert_int:用于設(shè)定 MASTER 與 BACKUP 之間同步檢查的時間間隔,單位為秒。
- auth_type:預(yù)共享密鑰認證,同一個虛擬路由器的 keepalived 節(jié)點必須一樣。
- auth_pass:設(shè)置密鑰。
- virtual_ipaddress:設(shè)置虛擬IP地址,可以設(shè)置多種形式:
- 10.0.0.100 不指定網(wǎng)卡,默認為 eth0,注意:不指定/prefix,默認為/32;
- 10.0.0.101/24 dev eth1 指定 VIP 的網(wǎng)卡;
- 10.0.0.102/24 dev eth2 label eth2:1 指定 VIP 的網(wǎng)卡 label。
- nginx2 上 keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id lb2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
}3)啟動
# 啟動 MASTER 服務(wù)器 keepalived 并設(shè)置為開機自啟動 [root@nginx1 keepalived]# systemctl enable keepalived --now [root@nginx1 keepalived]# systemctl status keepalived [root@nginx1 keepalived]# ip a

會發(fā)現(xiàn) MASTER 服務(wù)器多出了 192.168.40.80 這個IP。
# 啟動 BACKUP 服務(wù)器 keepalived 并設(shè)置為開機自啟動 [root@nginx2 keepalived]# systemctl enable keepalived --now [root@nginx2 keepalived]# systemctl status keepalived [root@nginx2 keepalived]# ip a

備份服務(wù)器并不持有 VIP。
4)訪問
此時訪問 VIP,請求都是被打到 MASTER 上的 nginx。

5)故障測試
# 停掉 MASTER [root@nginx1 ~]# init 0


此時 VIP 飄移到 BACKUP。
6)重啟 MASTER
此時 VIP 又漂移回來了。


四、定制腳本
Keepalived 通過檢測服務(wù)器上的 Keepalived 進程的存活狀態(tài),來判斷服務(wù)器是否存活。
但如果此時,我們的服務(wù)器沒有掛,但是我們希望 Keepalived ?;畹姆?wù)(比如 nginx)掛了,由于 Keepalived 進程沒有掛,這個時候,Keepalived 是不會幫我們主備切換的。
# 停掉 MASTER [root@nginx1 ~]# systemctl stop nginx

這個時候 VIP 并沒有遷移走。這個時候,我們就得自己寫一個腳本,去檢測 nginx 存活狀態(tài),如果 nginx 掛了,人為殺死 keepalived 進程,讓 keepalived 幫我們主備切換。
先重新啟動 nginx
[root@nginx1 ~]# systemctl start nginx
1)修改 keepalived.conf
- nginx1 上 keepalived.onf:
! Configuration File for keepalived
global_defs {
router_id lb1
}
vrrp_script check_nginx {
script "pgrep nginx"
interval 2
weight 50 # 當檢查失敗時,優(yōu)先級會減去這個值
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
track_script {
check_nginx
}
}- nginx2 上 keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id lb2
}
vrrp_script check_nginx {
script "pgrep nginx"
interval 2
weight 50 # 當檢查失敗時,優(yōu)先級會減去這個值
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
track_script {
check_nginx
}
}2)重啟 keepalived
[root@nginx1 keepalived]# sudo systemctl restart keepalived [root@nginx2 keepalived]# sudo systemctl restart keepalived
3)停掉 MASTER
# 停掉 MASTER [root@nginx1 ~]# systemctl stop nginx


VIP 這次終于被遷移到 BACKUP。
五、應(yīng)用場景
Keepalived + Nginx 的組合有很多應(yīng)用場景:
- 搭建 Nacos 高可用集群
- 搭建 K8S Ingress 入口
到此這篇關(guān)于Keepalived搭建nginx高可用的實現(xiàn)的文章就介紹到這了,更多相關(guān)Keepalived搭建nginx高可用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- keepalived+nginx高可用實現(xiàn)方法示例
- Keepalived+Nginx+Tomcat 實現(xiàn)高可用Web集群的示例代碼
- nginx結(jié)合keepalived實現(xiàn)高可用的完整步驟
- Keepalived實現(xiàn)Nginx負載均衡高可用的示例代碼
- keepalived對nginx進行高可用搭建及原理詳解
- Keepalived如何實現(xiàn)Nginx高可用
- keepalived?+?nginx?實現(xiàn)高可用方案
- 使用Nginx?+?Keepalived?實現(xiàn)高可用?Web?負載均衡筆記(虛擬機)
- Nginx+keepalived實現(xiàn)七層的負載均衡的高可用(最新解決方案)
- Nginx高可用Keepalived的具體使用
- Nginx使用Keepalived部署web集群(高可用高性能負載均衡)實戰(zhàn)案例
相關(guān)文章
nginx如何設(shè)置服務(wù)器響應(yīng)時間長短
本文主要介紹了nginx如何設(shè)置服務(wù)器響應(yīng)時間長短,主要介紹了兩種方法,具有一定的參考價值,感興趣的可以了解一下2023-09-09
生產(chǎn)環(huán)境之Nginx高可用方案實現(xiàn)過程解析
這篇文章主要介紹了生產(chǎn)環(huán)境之Nginx高可用方案實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08

