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 {

# [email protected]

# [email protected]

# [email protected]

# }

# 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 {

# [email protected]

# [email protected]

# [email protected]

# }

# 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