Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

作者:youzhibing
來源:http://www.cnblogs.com/youzhibing/p/7327342.html

前言

使用集群是網站解決高併發、海量數據問題的常用手段。當一臺服務器的處理能力、存儲空間不足時,不要企圖去換更強大的服務器,對大型網站而言,不管多麼強大的服務器,都滿足不了網站持續增長的業務需求。這種情況下,更恰當的做法是增加一臺服務器分擔原有服務器的訪問及存儲壓力。

通過負載均衡調度服務器,將來自瀏覽器的訪問請求分發到應用服務器集群中的任何一臺服務器上,如果有更多的用戶,就在集群中加入更多的應用服務器,使應用服務器的負載壓力不再成為整個網站的瓶頸。

摘自《大型網站技術架構_核心原理與案例分析》

另外,大家可以看這兩篇博客:

http://www.cnblogs.com/youzhibing/p/5061786.html
http://www.cnblogs.com/youzhibing/p/5021224.html

對比下這三篇博客,其中區別及各自的優缺點需要大家好好體會。

環境準備

  • 192.168.0.221:nginx + keepalived master
  • 192.168.0.222:nginx + keepalived backup
  • 192.168.0.223:tomcat
  • 192.168.0.224:tomcat
  • 虛擬ip(VIP):192.168.0.200,對外提供服務的ip,也可稱作浮動ip

各個組件之間的關係圖如下:

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

tomcat做應用服務器

tomcat的安裝不在本博客範圍之內,具體可參考virtualBox安裝centos,並搭建tomcat,tomcat的webapps下記得放自己的應用,我的是myWeb,如果大家也用我的myWeb,那麼index.jsp中的ip需要換成自己的

http://www.cnblogs.com/youzhibing/p/5031080.html


將192.168.0.223、192.168.0.224上的tomcat啟動起來,tomcat的路徑可能和我的不一致,需要寫成自己的

# cd /usr/local/tomcat7/bin
# ./startup.sh

訪問myWeb如下

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

nginx做負載均衡

nginx的安裝,本文就不講述了。

nginx.conf內容如下

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

主從nginx的配置文件完全一樣,nginx.conf配置可複雜可簡單,大家根據自己的情況自行配置,照搬上述配置也是可以的。

配置好後,啟動nginx,路徑要寫自己的

# cd /usr/local/nginx/sbin
# ./nginx

訪問nginx,效果如下:

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

兩臺nginx服務器服務正常,此時是沒有主從之分的,兩者級別一樣高,當配置keepalived之後就有了主從之分了。

keepalived實現nginx高可用(HA)

keepalived的安裝本文就不講述了。keepalived作用其實在第一張圖中已經有所體現,主要起到兩個作用:實現VIP到本地ip的映射; 以及檢測nginx狀態。

master上的keepalived.conf內容如下:

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

backup上的keepalived.conf內容如下:

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

nginx檢測腳本check_nginx_pid.sh內容如下:

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

啟動keepalived

# service keepalived start

訪問VIP,效果如下:

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

我們來看下keepalived的日誌信息

master(192.168.0.221):

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

backup(192.168.0.222):

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

當我們把master上的keepalived停掉(模擬宕機),再來看下keepalived日誌

原master(192.168.0.221):

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

原backup(192.168.0.222):

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

通過VIP可以正常訪問服務,前端請求感受不到後端nginx的切換;重新喚醒原master(192.168.0.221)的測試這裡就不進行了,大家自行測試

注意點

1、執行腳本時報錯:/bin/sh^M: bad interpreter: 沒有那個文件或目錄

因為操作系統是windows,我在windows下編輯的腳本,所以有可能有不可見字符。腳本文件是DOS格式的, 即每一行的行尾以回車符和換行符來標識, 其ASCII碼分別是0x0D, 0x0A。可以有很多種辦法看這個文件是DOS格式的還是UNIX格式的, 還是MAC格式的

解決方法:

vim filename
:set ff? #可以看到dos或unix的字樣. 如果的確是dos格式的。
:set ff=unix #把它強制為unix格式的, 然後存盤退出。

再次運行腳本。

從windows編輯文件再拷貝到linux時要特別注意,另外,腳本需要賦予可執行權限才能執行,可執行文件的一種直觀表現就是文件本身呈綠色。

2、負載均衡最好進行多瀏覽器測試,有些瀏覽器會緩存,會產生沒有負載均衡的效果。

例如我這次測試中谷歌瀏覽器就出現了類似的情況(還沒搞清楚是否是緩存的原因),火狐,360、IE瀏覽器都是正常的負載均衡效果。

3、請求走向

訪問虛擬IP(VIP),keepalived將請求映射到本地nginx,nginx將請求轉發至tomcat,例如:http://192.168.0.200/myWeb/,被映射成http://192.168.0.221/myWeb/,端口是80,而221上nginx的端口正好是80;映射到nginx上後,nginx再進行請求的轉發。

keepalived服務器的ip情況

Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用

VIP總會在keepalived服務器中的某一臺上,也只會在其中的某一臺上;VIP綁定的服務器上的nginx就是master,當VIP所在的服務器宕機了,keepalived會將VIP轉移到backup上,並將backup提升為master。

4、VIP也稱浮動ip,是公網ip,與域名進行映射,對外提供服務; 其他ip一般而言都是內網ip, 外部是直接訪問不了的

參考

大型網站技術架構_核心原理與案例分析(書籍)
http://blog.csdn.net/e421083458/article/details/30092795
http://blog.csdn.net/readiay/article/details/53538085


分享到:


相關文章: