目錄導航
前言
前面我們講了Nginx的兩節內容,主要是基本的使用,這一節,主要講一下keepalived輕量級的高可用解決方案!
- Nginx的初步認識及配置
- Nginx的應用實戰
- Nginx的擴展-Keepalived
Nginx進程模型簡介
Nginx採用的是多進程+多路複用的模型
首先正常啓動Nginx,我們發現操作系統有如下進程:
實際上Nginx啓動,會產生兩種進程:
- master進程(管理worker子進程)
- worker進程(基於master進程fork出來的,可以有多個worker進程)
- 當Nginx收到請求後,會向發送一個信號,通過worker進程處理
- 如果有多個worker進程, 則多個worker進程之間存在競爭,因此在整個模型裏,我們認爲是worker之間的關係是互斥的。每個進程之間存在增強,去獲取處理進程的權力。
- 當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
- 下載 keepalived 的安裝包
開源項目,國內網絡無須加速,直接下載即可
2. 在/data/program/目錄下創建一個 keepalived 的文件,同時解壓keepalived
3. cd 到 keepalived-2.0.20 目錄下,執行 ./configure – prefix=/data/program/keepalived --sysconf=/etc
- 如果缺少依賴庫,則 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
安裝結束不能報錯(下面截圖爲安裝末尾的輸出日誌):
否則需要根據缺少的依賴自行安裝
- 編譯安裝 make && make install
可能會出現警告,告訴你當前不再安裝目錄下,但是不要緊,看我們新建的keepalived下是否有文件輸出
- 進入安裝後的路徑 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
- 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 日誌文件配置
- 首先看一下/etc/sysconfig/keepalived 文件
vi /etc/sysconfig/keepalived KEEPALIVED_OPTIONS="-D -d -S 0"
“-D” 就是輸出日誌的選項
這裏的“-S 0”表示 local0.* 具體的還需要看一下/etc/syslog.conf 文件
- 在/etc/rsyslog.conf 裏添加:local0.* /var/log/keepalived.log \3. 重新啓動 keepalived 和 rsyslog 服務: service rsyslog restart
service keepalived restart
通過腳本實現動態切換
- 在 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
- 修改 keepalived.conf 文件,增加如下配置
track_script: #執行監控的服務
chknginxservice #引用 VRRP 腳本,即在 vrrp_script 部分指定的名字。定期運行它們來改變優先級,並最終引發主備切換。
後記
更多架構知識,歡迎關注本套Java系列文章:Java架構師成長之路