開發與維運

實戰 | Nginx+keepalived 實現高可用集群

前言

今天通過兩個實戰案例,帶大家理解Nginx+keepalived 如何實現高可用集群,在學習新知識之前您可以選擇性複習之前的知識點:

給小白的 Nginx 10分鐘入門指南

[Nginx編譯安裝及常用命令
](https://mp.weixin.qq.com/s?__biz=MzI3NzQ4MTE4Mw==&mid=2247484546&idx=1&sn=1e0cc9f63efd08ab6d4fd20cadf948b4&chksm=eb64d732dc135e24b09a5f8170a844c3ffe72de52e30036f941c52966741ea62a645466698e9&token=1752560613&lang=zh_CN&scene=21#wechat_redirect)

[Nginx 配置文件詳解
](https://mp.weixin.qq.com/s?__biz=MzI3NzQ4MTE4Mw==&mid=2247484566&idx=1&sn=ca9aca3c9880f676e357b2485c9ecb96&chksm=eb64d726dc135e3095beb47a262fdd42f194f6b1837911ab94c9d631df2dd4a74e9ab9ec0a0f&token=1752560613&lang=zh_CN&scene=21#wechat_redirect)

一文帶你讀懂Nginx反向代理

一文徹底讀懂nginx中的location指令

Nginx負載均衡原理及配置實例

Nginx為什麼快到根本停不下來?

[Keepalived入門學習
](https://mp.weixin.qq.com/s?__biz=MzI3NzQ4MTE4Mw==&mid=2247484956&idx=2&sn=a3ae806f1e32de246cc28adcf3f42771&chksm=eb64d5acdc135cba83b4532ea01ea4a8f99af00b0fbf1593fc314f3c2a7d7c4c0d12a97e1411&token=850336392&lang=zh_CN&scene=21#wechat_redirect)

Keepalived高可用服務配置實例

Nginx+Keepalived 高可用集群(主從模式)

集群架構圖

注意:Keepalived服務器同樣是nginx負載均衡器。

1、準備四臺機器

本實驗系統均使用Centos 7.5,在所有節點進行以下操作:

// 查看操作系統
[root@LB-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

//關閉並禁用防火牆
[root@LB-01 ~]# systemctl stop firewalld
[root@LB-01 ~]# systemctl disable firewalld

//關閉selinux
[root@LB-01 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
[root@LB-01 ~]# setenforce 0

//安裝nginx
yum -y install nginx
  若提示,無安裝包,則需要安裝epel擴展源:
   yum -y install epel-release 

2、配置後端web服務器

2.1)修改web01節點網站根目錄默認文件

[root@web01 ~]# echo "<h1>web01 192.168.1.34</h1>" > /usr/share/nginx/html/index.html

2.2)修改web02節點網站根目錄默認文件

[root@web01 ~]# echo "<h1>web01 192.168.1.34</h1>" > /usr/share/nginx/html/index.html

通過nginx主配置文件,可以看出nginx網站根目錄文件默認是:/usr/share/nginx,如下:

2.3)啟動nginx服務

//web01
[root@web01 ~]# systemctl start nginx

//web02
[root@web02 ~]# systemctl start nginx

2.4)驗證

主機web01和web02已配置成web服務器

3、配置LB服務器

LB服務器需同時部署nginx和Keepalived服務,以下操作均在兩臺LB節點執行:

3.1)配置nginx反向代理服務

  編輯nginx主配置文件:`/etc/nginx/nginx.conf`

啟動nginx服務;驗證效果:

訪問LB01:

訪問LB02:

如圖所示,LB01和LB02均可輪詢訪問後端web節點,即表示nginx LB集群搭建成功。

3.2)配置Keepalived服務

(1)安裝Keepalived

yum -y install keepalived

(2)配置Keepalived服務

這裡直接提供LB01與LB02兩者配置文件差異對比,方便讀者閱讀:

vim /etc/keepalived/keepalived.con

左:LB01 右:LB02

(3)誰是主Keepalived?

通過上圖得知,LB01優先級高於LB02,因此VIP綁定在LB01上:

[root@LB-01 ~]# ip a | grep 192.168.1.110
    inet 192.168.1.110/24 scope global secondary eth0:1

4、域名解析

由於不是真實環境,域名使用www.test.com用作測試,所以www.test.com的解析只能在客戶機hosts文件設置。具體步驟如下:

打開:

C:\Windows\System32\drivers\etc\hosts

在末尾添加:

192.168.1.110 www.test.com

注意:這裡的IP指定的是浮動IP,即通過客戶端通過VIP訪問web業務

5、測試驗證


關閉LB01節點的keepalived服務。再次訪問:

發現已然可以通過域名進行訪問,只是此時VIP已綁定在LB02上,如下所示:

[root@LB-02 ~]# ip a | grep 192.168.1.110
    inet 192.168.1.110/24 scope global secondary eth0:1
[root@LB-02 ~]#

到此,Nginx+Keepalived 高可用集群(主從)就搭建完成了。

Nginx+Keepalived 高可用集群(雙主模式)

將keepalived做成雙主模式,其實很簡單,就是再配置一段新的vrrp_instance(實例)規則。

集群架構圖:

說明:還按照上面的環境繼續做實驗,只是修改LB節點上面的keepalived服務的配置文件即可。

此時LB-01節點既為Keepalived的主節點也為備節點,LB-02節點同樣既為Keepalived的主節點也為備節點。

LB-01節點默認的主節點VIP(192.168.1.110),LB-02節點默認的主節點VIP(192.168.1.210)

1、配置 LB-01 節點

增加一段vrrp_instance VI_2實例規則:

vim /etc/keepalived/keepalived.conf

2、配置 LB02 節點

vim /etc/keepalived/keepalived.conf

3、重啟Keepalived服務

//LB-01
[root@LB-01 ~]# systemctl restart keepalived

//LB-02
[root@LB-02 ~]# systemctl restart keepalived

4、查看VIP綁定情況

//LB-01
[root@LB-01 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.31/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.110/24 scope global secondary eth0:1

//LB-02
[root@LB-02 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.32/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.210/24 scope global secondary eth0:2

5、高可靠驗證

 停止LB-01節點的keepalived再次測試

此時VIP都綁定在LB-02上
[root@LB-02 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.32/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.110/24 scope global secondary eth0:1
    inet 192.168.1.210/24 scope global secondary eth0:2

測試可以發現我們訪問keepalived中配置的兩個VIP都可以正常調度,當我們停止任意一臺keepalived節點,同樣還是正常訪問;到此,nginx+keepalived+高可用集群(雙主模式)就搭建完成了。

編寫Nginx Web服務的守護腳本

以上實驗測試有一個問題就是,我們是用Nginx做負載均衡分發請求的數據包的。如果主節點的Keepalived服務正常運行,而Nginx運行異常,那麼將會出現Nginx負載均衡服務失靈,無法切換到Nginx負載均衡器02上,後端的Web服務器無法收到請求。所以,我們應該要檢測Nginx的服務是否正常運行,如果不是正常運行,應該停掉Keepalived的服務,這樣才能自動切換到備節點上。

我們可以通過檢測80端口是否開啟來判定Nginx的運行情況,2秒鐘檢測一次,腳本如下:

#!/bin/bash
while true
do
if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ]
then
    /etc/init.d/keepalived stop
fi
sleep 2
done

結語

歡迎關注微信公眾號『開源Linux』,專注於分享Linux/Unix相關內容,包括Linux運維、Linux系統開發、網絡編程、以及虛擬化和雲計算等技術乾貨。後臺回覆『學習』,送你一套學習Linux的系列書籍,期待與你相遇。

Leave a Reply

Your email address will not be published. Required fields are marked *