分佈式專題-高性能的Web容器之Nginx03-Nginx高可用方案

前言

前面我們講了Nginx的兩節內容,主要是基本的使用,這一節,主要講一下keepalived輕量級的高可用解決方案!

Nginx進程模型簡介

Nginx採用的是多進程+多路複用的模型

首先正常啓動Nginx,我們發現操作系統有如下進程:
在這裏插入圖片描述
實際上Nginx啓動,會產生兩種進程:

  • master進程(管理worker子進程)
  • worker進程(基於master進程fork出來的,可以有多個worker進程)
  1. 當Nginx收到請求後,會向發送一個信號,通過worker進程處理
    在這裏插入圖片描述
  2. 如果有多個worker進程, 則多個worker進程之間存在競爭,因此在整個模型裏,我們認爲是worker之間的關係是互斥的。每個進程之間存在增強,去獲取處理進程的權力。
  3. 當worker獲取權限成功後,此worker來處理當前請求,而處理請求的方式就是多路複用

nginx.conf
在這裏插入圖片描述
在上一節,我們主要測試了http的相關屬性,現在我們看http字段上部的配置文件都是做什麼用的?

# 指定用戶
#user  nobody;
# 工作進程數,一般將數量設置爲當前機器的cpu 總核心數
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    # io 模型(linux)
    use epoll ;	
    # 理論上 併發連接數爲 :processes* connections
    worker_connections  1024;
}

Nginx高可用方案

Nginx 作爲反向代理服務器,所有的流量都會經過 Nginx,所以 Nginx 本身的可靠性是我們首先要考慮的問題

服務器架構演進過程

裸奔架構
在這裏插入圖片描述
集羣模式
如果Tomcat掛掉,DNS並不知情
在這裏插入圖片描述
Nginx的引入
單點故障無法解決
在這裏插入圖片描述
Nginx的集羣模式
如果Nginx的吞吐量達到瓶頸怎麼辦?
在這裏插入圖片描述
高性能負載
硬負載:F5服務器
軟負載:lvs

在這裏插入圖片描述

Keepalived

Keepalived 是 Linux 下一個輕量級別的高可用解決方案,Keepalived 軟件起初是專爲 LVS 負載均衡軟件設計的,用來管理並監控 LVS 集羣系統中各個服務節點的狀態,後來又加入了可以實現高可用的 VRRP 功能。因此,Keepalived 除了能夠管理 LVS 軟件外,還可以作爲其他服務(例如:Nginx、Haproxy、MySQL 等)的高可用解決方案軟件

Keepalived 軟件主要是通過 VRRP 協議實現高可用功能的。VRRP 是 Virtual Router RedundancyProtocol(虛擬路由器冗餘協議)的縮寫,VRRP 出現的目的就是爲了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行;(簡單來說,vrrp 就是把兩臺或多態路由器設備虛擬成一個設備,實現主備高可用)

所以,Keepalived 一方面具有配置管理 LVS 的功能,同時還具有對 LVS 下面節點進行健康檢查的功能,另一方面也可實現系統網絡服務的高可用功能

LVS 是 Linux Virtual Server 的縮寫,也就是 Linux 虛擬服務器,在 linux2.4 內核以後,已經完全內置了 LVS 的各個功能模塊。

它是工作在四層的負載均衡,類似於 Haproxy, 主要用於實現對服務器集羣的負載均衡。

關於四層負載,我們知道 osi 網絡層次模型的 7 層模模型(應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層);四層負載就是基於傳輸層,也就是ip+端口的負載;而七層負載就是需要基於 URL 等應用層的信息來做負載,同時還有二層負載(基於 MAC)、三層負載(IP);
常見的四層負載有:LVS、F5; 七層負載有:Nginx、HAproxy; 在軟件層面, Nginx/LVS/HAProxy 是使用得比較廣泛的三種負載均衡軟件

對於中小型的 Web 應用,可以使用 Nginx、大型網站或者重要的服務並且服務比較多的時候,可以考慮使用 LVS

輕量級的高可用解決方案

通過以上的介紹,現在我們通過keepalived搭建一個輕量級的高可用的負載均衡架構
在這裏插入圖片描述

粉色框框代表高可用

在實驗之前,先了解一些名詞

  • LVS 四層負載均衡軟件(Linux virtual server):監控 lvs 集羣系統中的各個服務節點的狀態

  • VRRP 協議(虛擬路由冗餘協議)

linux2.4 以後,是內置在 linux 內核中的

lvs 負載
4層 HAproxy
4層 Nginx

在這裏插入圖片描述

Keepalived離線安裝

yum install -y keepalived 在線安裝,這裏跳過不說,哈哈。主要說一下Keepalived離線安裝~

環境準備
linux2: 192.168.200.112(Tomcat、Nginx、Keepalived-master)
linux3: 192.168.200.113(Tomcat、Nginx、Keepalived-backup)
keepalived:keepalived-2.0.20.tar.gz

  1. 下載 keepalived 的安裝包

keepalived下載地址

開源項目,國內網絡無須加速,直接下載即可
在這裏插入圖片描述2. 在/data/program/目錄下創建一個 keepalived 的文件,同時解壓keepalived
在這裏插入圖片描述
3. cd 到 keepalived-2.0.20 目錄下,執行 ./configure – prefix=/data/program/keepalived --sysconf=/etc

在這裏插入圖片描述

  1. 如果缺少依賴庫,則 yum install gcc; yum install -y openssl-devel ; yum install -y libnl libnl-devel;yum install -y libnfnetlink-devel
    在這裏插入圖片描述
    yum安裝軟件
    在這裏插入圖片描述
    因爲我這裏本地之前安裝成功過Nginx,所以gcc等依賴是不用安裝的,讀者可自行根據提示安裝不足的軟件即可。
    重新執行安裝
    重新執行步驟4的安裝命令

./configure – prefix=/data/program/keepalived --sysconf=/etc

在這裏插入圖片描述

安裝結束不能報錯(下面截圖爲安裝末尾的輸出日誌):
在這裏插入圖片描述

否則需要根據缺少的依賴自行安裝

  1. 編譯安裝 make && make install

在這裏插入圖片描述
可能會出現警告,告訴你當前不再安裝目錄下,但是不要緊,看我們新建的keepalived下是否有文件輸出

在這裏插入圖片描述

  1. 進入安裝後的路徑 cd /data/program/keepalived, 創建軟連接: ln -s sbin/keepalived /sbin

在這裏插入圖片描述

cp /data/program/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d

在這裏插入圖片描述
分別輸入命令:

chkconfig --add keepalived

chkconfig keepalived on

service keepalived start

在這裏插入圖片描述

圖上的報錯直接將運行文件放到/usr/sbin下

cp /data/program/keepalived-2.0.20/bin/keepalived /usr/sbin

  1. service keepalived status

查看keepalived的狀態,正在運行表示安裝成功!
在這裏插入圖片描述

keepalived的配置

keepalived 的默認配置文件地址:/etc/keepalived/keepalived.conf

master

在192.168.200.112這臺機器上的keepalived作爲master,修改配置文件爲:

!Configuration File for keepalived 
global_defs {
     #運行keepalived 服務器的標識,在一個網絡內應該是唯一的
     router_id LVS_DEVEL
}
#vrrp 實例定義部分
vrrp_instance VI_1 {	
	#設置 lvs 的狀態,MASTER 和 BACKUP 兩種,必須大寫
    state MASTER	
	#設置對外服務的接口
	interface eth0
    #設置虛擬路由標示,這個標示是一個數字,同一個 vr rp 實例使用唯一標示
    virtual_router_id 51 
    #定義優先級,數字越大優先級越高,在一個 vrrp——instance 下, master 的優先級必須大於 backup
    priority 100 
	#設定 master 與 backup 負載均衡器之間同步檢查的時間間隔,單位是秒
	advert_int 1 
    #設置驗證類型和密碼
	authentication {	
		auth_type PASS
	    #驗證密碼,同一個 vrrp_instance 下 MASTER 和 BACKUP密碼必須相同
	    auth_pass 1111
    }
	virtual_ipaddress { 
   		#設置虛擬 ip 地址,可以設置多個,每行一個
        192.168.11.100
    }
}
#設置虛擬服務器,需要指定虛擬 ip 和服務端口
virtual_server 192.168.11.100 80 { 
   #健康檢查時間間隔 
   delay_loop 6
   #負載均衡調度算法 
   lb_algo rr 
   #負載均衡轉發規則
   lb_kind NAT 
   #設置會話保持時間 
   persistence_timeout 50
   #指定轉發協議類型,有 TCP 和 UDP 兩種
   protocol TCP 
   #配置服務器節點 1,需要指定 real serve r 的真實 IP 地址和端口
   real_server 192.168.200.112 80 {
   #設置權重,數字越大權重越高
   weight 1	
   		#realserver 的狀態監測設置部分單位秒
   		TCP_CHECK { 
        	#超時時間 
            connect_timeout 3
            #重試間隔
            delay_before_retry 3
            #監測端口
            #connect_port 80
        }
    }
}

其中的interface的網卡配置,就看你本地機器的網卡名稱即可:
在這裏插入圖片描述

backup

在192.168.200.113這臺機器上的keepalived設置爲backup,配置文件內容爲:

!Configuration File for keepalived 
global_defs {
     #運行keepalived 服務器的標識,在一個網絡內應該是唯一的
     router_id LVS_DEVEL
}
#vrrp 實例定義部分
vrrp_instance VI_1 {	
	#設置 lvs 的狀態,MASTER 和 BACKUP 兩種,必須大寫
    state BACKUP	
	#設置對外服務的接口
	interface eth0	
    #設置虛擬路由標示,這個標示是一個數字,同一個 vr rp 實例使用唯一標示
    virtual_router_id 51 
    #定義優先級,數字越大優先級越高,在一個 vrrp——instance 下, master 的優先級必須大於 backup
    priority 100 
	#設定 master 與 backup 負載均衡器之間同步檢查的時間間隔,單位是秒
	advert_int 1 
    #設置驗證類型和密碼
	authentication {	
		auth_type PASS
	    #驗證密碼,同一個 vrrp_instance 下 MASTER 和 BACKUP密碼必須相同
	    auth_pass 1111
    }
	virtual_ipaddress { 
   		#設置虛擬 ip 地址,可以設置多個,每行一個
        192.168.11.100
    }
}
#設置虛擬服務器,需要指定虛擬 ip 和服務端口
virtual_server 192.168.200.112 80 { 
   #健康檢查時間間隔 
   delay_loop 6
   #負載均衡調度算法 
   lb_algo rr 
   #負載均衡轉發規則
   lb_kind NAT 
   #設置會話保持時間 
   persistence_timeout 50
   #指定轉發協議類型,有 TCP 和 UDP 兩種
   protocol TCP 
   #配置服務器節點 1,需要指定 real serve r 的真實 IP 地址和端口
   real_server 192.168.200.112 80 {
   #設置權重,數字越大權重越高
   weight 1	
   		#realserver 的狀態監測設置部分單位秒
   		TCP_CHECK { 
        	#超時時間 
            connect_timeout 3
            #重試間隔
            delay_before_retry 3
            #監測端口
            connect_port 80
        }
    }
}

最終效果,通過配置的虛擬ip,轉到nginx,再轉到tomcat:
在這裏插入圖片描述

keepalived 日誌文件配置

  1. 首先看一下/etc/sysconfig/keepalived 文件

vi /etc/sysconfig/keepalived KEEPALIVED_OPTIONS="-D -d -S 0"
“-D” 就是輸出日誌的選項

這裏的“-S 0”表示 local0.* 具體的還需要看一下/etc/syslog.conf 文件

  1. 在/etc/rsyslog.conf 裏添加:local0.* /var/log/keepalived.log \3. 重新啓動 keepalived 和 rsyslog 服務: service rsyslog restart

service keepalived restart

通過腳本實現動態切換

  1. 在 master 和 slave 節點的 /data/program/nginx/sbin/nginx-ha-check.sh 目錄下增加一個腳本

–no-headers 不打印頭文件

Wc –l

統計行數

#!bin/sh	#! /bin/sh 是指此腳本使用/bin/sh 來執行

A=`ps -C nginx --no-header |wc -l`

if [ $A -eq 0 ]

then
echo 'nginx server is died'
service keepalived stop

fi
  1. 修改 keepalived.conf 文件,增加如下配置
track_script: #執行監控的服務
chknginxservice #引用 VRRP 腳本,即在 vrrp_script 部分指定的名字。定期運行它們來改變優先級,並最終引發主備切換。

在這裏插入圖片描述

後記

更多架構知識,歡迎關注本套Java系列文章Java架構師成長之路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章