Nginx負載均衡配置+keepalived高可用
1.什麼是負載均衡?
隨著應用各個核心模組業務量的提高,訪問量和資料流量的快速增長,其處理能力和計算強度也相應地增大,使得單一的伺服器裝置根本無法承擔。在此情況下,如果扔掉現有裝置去做大量的硬體升級,這樣將造成現有資源的浪費,而且如果再面臨下一次業務量的提升時,這又將導致再一次硬體升級的高額成本投入,甚至效能再卓越的裝置也不能滿足當前業務量增長的需求。
針對此情況而衍生出來的一種廉價有效透明的方法以擴充套件現有網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性的技術就是負載均衡(Load Balance)。
2.負載均衡的種類
①一種是通過硬體來進行解決,常見的硬體有NetScaler、F5、Radware和Array等商用的負載均衡器,但是它們是比較昂貴的
②一種是通過軟體來進行解決的,常見的軟體有LVS、Nginx、apache等,它們是基於Linux系統並且開源的負載均衡策略
以上內容摘自:
3.虛擬機器準備工作,三臺安裝了nginx伺服器的機器
nginx安裝過程請參考:https://yq.aliyun.com/articles/655855
4.配置Nginx轉發條件
配置nginx.conf
該檔案中一些節點的作用: worker_processes:工作程序個數,可配置多個 worker_connections:單個程序最大連線數 server:每一個server相當於一個代理伺服器 lister:監聽埠,預設80 server_name:當前服務的域名,可以有多個,用空格分隔(我們是本地所以是localhost) location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這裡 index:當沒有指定主頁時,預設會選擇這個指定的檔案,可多個,空格分隔 proxy_pass:請求轉向自定義的伺服器列表 upstream name{ }:伺服器叢集名稱
重啟nginx服務
5.安裝並啟動Tomcat
參考連結:https://yq.aliyun.com/articles/655542
6.修改Tomcat的index.jsp檔案
為了區分是哪個IP下的Tomcat,修改下index.jsp的內容,顯示對應的IP地址
7.瀏覽器訪問http://192.168.0.115,展示頁面為116的Tomcat
8.設定權重,重新訪問http://192.168.0.115,用115做伺服器負載均衡到116和117
9.搭建Keepalived,需要依賴openssl
檢視是否安裝openssl
rpm -qa|grep openssl
openssl已安裝
如果機器115出現故障了呢? 那麼怎麼使用116上的Nginx進行轉發呢? 怎麼設定主機和備機呢? 如果主機死了怎麼進行故障移除呢? 如果主機從不可用到可用狀態又怎麼進行恢復新增呢? 這些功能都是可以通過Keepalived來進行設定的.
Keepalived
(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資源和服務,恢復到原來的備用角色。
①keepalived官網:http://www.keepalived.org/
②下載keepalived最新版V2.0.9
wget http://www.keepalived.org/software/keepalived-2.0.9.tar.gz
③解壓keepalived-2.0.9.tar.gz
tar -xzvf ./keepalived-2.0.9.tar.gz
④執行./configure
cd /usr/local/keepalived-2.0.9
./configure
說明缺少依賴包libnl、libnl-devel
yum -y install libnl libnl-devel
重新執行./configure
⑤開始編譯和安裝
make && make install
⑥keepalived安裝後預設不會註冊為系統服務,需要手動新增系統服務指令碼
- keepalived啟動指令碼變數引用檔案,預設檔案路徑是/etc/sysconfig/,也可以不做軟連結,直接修改啟動指令碼中檔案路徑即可(安裝目錄下)
cp /usr/local/keepalived-2.0.9/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
- 將keepalived主程式加入到環境變數(安裝目錄下)
cp /usr/local/keepalived-2.0.9/keepalived/keepalived /usr/sbin/
- keepalived啟動指令碼(原始碼目錄下),放到/etc/init.d/目錄下就可以使用service命令便捷呼叫
cp /usr/local/keepalived-2.0.9/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
- 將配置檔案放到預設路徑下
mkdir /etc/keepalived
cp /usr/local/keepalived-2.0.9/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
- 設定為開機啟動
chkconfig keepalived on
- 啟動keepalived服務
service keepalived start
192.168.0.115環境搭建完成,116按同樣的環境搭建
- 檢查keepalived是否啟動成功
ip add show eth0
eth0是網絡卡名稱,通過ifconfig檢視
⑦192.168.0.115做主機,192.168.0.116做備機,備機需要修改keepalived.conf
主機 (主節點):
備機 (從節點):
現在主節點和從節點都會生成VIP,這種現象叫做“腦裂”
腦裂(split-brain) : 指在一個高可用(HA)系統中,當聯絡著的兩個節點斷開聯絡時,本來為一個整體的系統,分裂為兩個獨立節點,這時兩個節點開始爭搶共享資源,結果會導致系統混亂,資料損壞。對於無狀態服務的HA,無所謂腦裂不腦裂;但對有狀態服務(比如MySQL)的HA,必須要嚴格防止腦裂
思考:正常情況下keepalived的VIP應該生成在主節點,從節點在檢測到主節點正常執行的時候是不生成VIP的,但是現在從節點生成了VIP,有可能主從節點間的通訊異常了。主從節點通訊是通過VRRP廣播實現的,首先檢查從節點是否可以接收到VRRP廣播
tcpdump -i eth0|grep VRRP
很明顯從節點已經接收到VRRP廣播,應該是被過濾掉了,有這功能的就只有防火牆了,檢視防火牆過濾規則
vim /etc/sysconfig/iptables
新增過濾規則
#允許組播地址通訊
-A INPUT -s 192.168.0.0/24 -d 224.0.0.18 -j ACCEPT
#允許VRRP(虛擬路由器冗餘協)通訊
-A INPUT -s 192.168.0.0/24 -p vrrp -j ACCEPT
重啟防火牆
service iptables reload
檢視是否生成VIP
已經成功了
⑧主節點的keepalived服務停掉,觀察從節點是否可以生成VIP
主節點:
從節點:
⑨主節點啟動keepalived服務後,觀察是否出現“腦裂現象”
主節點:
從節點:
訪問tomcat頁面不受任何影響,說明故障移除是OK的
10.因為我們是用nginx做負載均衡分發請求資料包的,如果主節點keepalived服務正常執行,但是nginx服務出現故障,就會出現負載均衡服務失靈的問題,導致請求無法訪問到116或117的應用伺服器上,所以我們要檢測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
直接執行該指令碼,是一個死迴圈,如果服務正常(netstat -tlnp|grep nginx|wc -l)=1,腳本里判斷如果不等於1,就停掉keepalived服務,sleep 2,2秒執行一次
結束