Nginx+Keepalived實現服務的高可用
- 2019 年 10 月 7 日
- 筆記
1.Keepalived高可用軟體
Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,keepalived除了能夠管理LVS軟體外,還可以作為其他服務的高可用解決方案軟體。
keepalived軟體主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router Redundancy Protocol(虛擬路由冗餘協議)的縮寫,VRRP出現的目的就是為了解決靜態路由的單點故障問題的,它能保證當個別節點宕機時,整個網路可以不間斷地運行。所以,keepalived一方面具有配置管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可以實現系統網路服務的高可用功能。
2.Keepalived高可用故障切換轉移原理
Keepalived高可用服務對之間的故障切換轉移,是通過VRRP來實現的。在keepalived服務工作時,主Master節點會不斷地向備節點發送(多播的方式)心跳消息,用來告訴備Backup節點自己還活著。當主節點發生故障時,就無法發送心跳的消息了,備節點也因此無法繼續檢測到來自主節點的心跳了。於是就會調用自身的接管程式,接管主節點的IP資源和服務。當主節點恢復時,備節點又會釋放主節點故障時自身接管的IP資源和服務,恢復到原來的備用角色。
一般情況下,如果我們做小型項目,前端用一個nginx做反向代理即可,大概是這樣的

但是,作為互聯網項目,純2C的話必然需要做高可用,不僅後端的Server有N個,Nginx同樣需要有N個,一主N備,當有一個伺服器掛掉的時候,服務能瞬間切換到其他伺服器,大概是這樣的

下面就以上圖為例,說明一下如何實現server的高可用。
1、準備
虛擬機兩台,同樣安裝nginx,keepalived,最簡單的安裝方法
yum -y install nginx,
yum -y install keepalived。
如果找不到安裝到哪兒了,可以使用whereis nginx查看,這裡不再贅述。
網路劃分如下
名稱 IP 虛擬IP 作業系統
虛擬機1(VM1) 172.17.1.150 172.17.1.160 centos7.5
虛擬機2(VM2) 172.17.1.151 172.17.1.160 centos7.5
2、兩台機器都要操作:關閉防火牆,修改nginx首頁,啟動nginx
* 關閉防火牆
systemctl stop firewalld.service #臨時關閉,重啟失效
systemctl disable firewalld.service #禁止開機啟動
安裝nginx
[root@localhost ~]# yum install nginx
修改nginx首頁(兩台機器分別操作)
[root@localhost ~]# echo "yunweimao" > /usr/share/nginx/html/index.html
[root@localhost ~]# echo "maoxiaopu" > /usr/share/nginx/html/index.html
啟動nginx
[root@localhost ~]# service nginx restart
報錯:
nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
nginx: configuration file /etc/nginx/nginx.conf test failed
修改:
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf

* 簡單起見,我們認為每個nginx都是代理一個服務,只用nginx默認帶的靜態頁作為測試,分別修改頁面內容為"yunweimao"和「maoxiaopu」
* 啟動nginx
systemctl start nginx
3、修改keepalived的配置文件
主配置如下(默認配置文件:/etc/keepalived/keepalived.conf):
! Configuration File for keepalived
global_defs {
# notification_email {
# }
# notification_email_from [email protected]
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
router_id LVS_DEVEL
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER # 標識為主服務
interface eth0 #綁定虛擬機的IP
virtual_router_id 51 # 虛擬路由id,和從機保持一致
#mcast_src_ip 172.17.1.150 #本機ip
priority 100 #權重,需要高於從機
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 執行 Nginx 監控的服務
}
virtual_ipaddress {
172.17.1.160 #/32 brd 255.255.255.0 dev ens33 label ens33:vip #虛擬IP地址
}
}
從機配置(默認配置文件:/etc/keepalived/keepalived.conf)
! Configuration File for keepalived
global_defs {
# notification_email {
# }
# notification_email_from [email protected]
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
router_id dreamer1
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態的腳本路徑
interval 2 ## 檢測時間間隔
weight -20 ## 如果條件成立,權重-20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
mcast_src_ip 172.17.1.151 ## 本機 IP 地址
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 執行 Nginx 監控的服務
}
virtual_ipaddress {
172.17.1.160
}
}
3、編寫監測心跳腳本
上面配置中可以看到有一個腳本文件:/etc/keepalived/nginx_check.sh
查看nginx是否啟動,如果沒啟動則啟動,如果啟動不起來,停掉keepalived服務,此時心跳斷掉,服務轉向另一個nginx。
#!/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
4、測試
* 啟動172.17.1.150上的nginx和keepalive
* 啟動172.17.1.151上的nginx和keepalive
* 訪問虛擬IP:http://172.17.1.160

* 停掉172.17.1.150上的keepalive
[root@localhost ~]# service keepalived stop

* 重新啟動172.17.1.150上的keepalive,又會回到yunweimao
[root@localhost ~]# service keepalived start
