Keepalived+Nginx+Tomcat配置高可用負載均衡系統示例


前言

此示例為keepalived+nginx+tomcat的基礎配置示例,某些特定配置此例中不會出現,在示例中會用到三個虛擬機:兩個純命令行用於模擬服務端配置,一個帶桌面環境的用於模擬客戶端訪問,這樣三台虛擬機使用NAT模式連接的時候是在同一個虛擬網絡中,更符合服務器的實際使用場景,虛擬機軟件為VMPlayer,這個對於個人可以免費使用,用起來來不錯,推薦一下。

本實例中是模擬使用場景,機器性能有限,所有nginx和Tomcat就放到一個機器上了,實際場景中如果可以盡量分開,防止nginx所在服務器出問題時跟着當掉一個或多個Tomcat

創建虛擬機

此部分是為了照顧對於虛擬機安裝不熟悉的同學,如果已經熟悉了虛擬機的安裝或有實體機環境等,可以跳過此步驟

  1. 創建服務器虛擬機(mini安裝)

    • 打開VMPlayer,然后界面如下,點擊創建新虛擬機

    • 彈出頁面后選擇最后一項,稍后安裝操作系統,這里一定要選擇這個,因為如果選擇其他直接安裝的話會使用簡易安裝,默認安裝完是帶桌面的

    • 下一步,然后選擇Centos 64位的操作系統,這個需要針對鏡像來選擇,我這里選這個是因為我有現成的64位鏡像

    • 下一步,這里設置下虛擬機的名字和安裝地址,便於區分

    • 下一步,然后需要設置硬盤,大小隨意(虛擬機創建之后硬盤大小只能增大不能減小了,所以這里可以設置的小一點,親測配置完成后也就才2G,這里設置5G應該就足夠了),下邊兩項也是二選一隨意

    • 下一步,界面如下,這里我們需要點擊“自定義硬件”來配置系統的光驅,如果實體機的配置低的話可以在這里降低下虛擬機的CPU和內存等,命令行模式下的CentOS並不需要多高的配置(單核512M可以無壓力運行)

    • 在打開的界面中選擇光驅,然后選擇使用ISO鏡像,點擊瀏覽選擇鏡像即可,這個鏡像可以從CentOS官網下載

    • 之后點擊關閉,再點擊完成即可,此時的界面如下:

    • 此時虛擬機的硬件已經准備完畢,接下來我們點擊播放虛擬機配置系統,點擊后界面如下,選擇第一項Install

    • 接下來稍等片刻會進入圖形化界面,這里不用擔心,這個只是安裝的圖形界面,與之后系統沒關系,如下:

    • 因為是要最小化安裝,所以語言默認英文即可,點擊Continue,跳轉后的界面為配置界面,我們僅需要修改下圖中紅框的部分,其他的默認即可。

    • 第一項是配置系統的硬盤,這里我們不需要進行任何配置,點擊進入之后直接點擊左上角的Done按鈕即可

    • 第二項是配置系統的網絡,默認不連接,所以我們需要點擊進入配置頁面,然后將右上角的OFF置成ON,然后點擊DONE,之后會跳轉回一開始的設置頁,我們就可以開始系統的安裝了,點擊Begin Installation,接下來需要設置用戶

    • ROOT用戶的密碼是必須要創建的,其他用戶可以根據需要進行創建,這里我只設置了ROOT用戶的密碼,方便后續的操作,不用考慮權限問題,實際應用中是要用其他用戶操作的,后續的操作可視情況賦予權限即可。還有需要注意的是如果用戶的密碼強度很低,需要點擊兩次DONE來確定。

    • 接下來就是等待結束重啟即可,至此CentOS就安裝完成了

  2. 創建客戶端虛擬機(簡易安裝安裝)
    在這個實例中客戶端有兩個用處,一是通過瀏覽器測試服務端的服務是否好用;二是通過FTP向服務端上傳幾個源碼包。其實上傳源碼包這個功能大部分情況下實體機也是可以操作的,但實體機的瀏覽器在我測試過程中是無法訪問服務端的服務的,這個具體的原因不清楚。

    客戶端虛擬機對操作系統無限制,只要可以運行瀏覽器即可,其實命令行模式下的linux也是可以訪問的,不過不太直觀,如果想用實體機進行訪問的話也可以,不過需要將虛擬機的網絡連接模式改為橋接模式,而且對網絡有要求,需要支持DHCP才可以。

    安裝過程和服務端的很類似,只有第二部有所區別,服務器需要選擇稍后安裝操作系統,但客戶端的虛擬機使用第二項選擇鏡像即可,之后會提示設置系統的用戶名和密碼,之后的步驟就一樣了,而且自定義硬件的時候不再需要設置光驅。

配置基礎環境

  • 這里以Server01為示例,其實我們需要配置兩台的,我使用的用戶是root用戶,實際應用中可能需要在其他用戶下進行,視情況賦予權限即可。

  • 因為我們需要向虛擬機上傳一些用到的軟件(當然可以使用wget來下載,只不過有點麻煩),所以這里我們實體機或者客戶端使用FTP客戶端進行連接(工具有很多,挑選自己順手的使用,這里推薦Xftp和FileZilla,對於個人使用都是免費的),虛擬機的IP地址可以通過ip addr進行查看,紅框中就是當前虛擬機的IP地址

  • 接下來在FTP客戶端中輸入主機地址,需要注意的是CentOS使用的是SFTP,所以我們輸入的地址應該是sftp://192.168.59.130,輸入賬戶密碼之后點擊快速連接,如果看到如下界面則表示連接成功了

  • 現在系統是配置完成了,不過IP是隨機分配的,如果有需要可以將服務器的地址改為靜態IP,不過這個IP一般不會發生變化,這里我就先不改了,但是服務器的話是一定會設置固定IP的。

安裝JDK

  • 我們常用的SUN JDK不支持yum安裝,所以需要從JDK官網下載合適的JDK,這里我使用的是JDK-8u111-linux-x64.rpm,通過ftp上傳到/usr/local/download下(這個位置隨意),然后分別執行以下命令進行安裝,JDK的默認安裝地址為/usr/java
cd /usr/local/download
rpm -i jdk-8u111-linux-x64.rpm
  • 安裝后即可運行java -version查看安裝的版本信息

安裝Tomcat

  • Tomcat是可以通過yum進行安裝的,不過示例中我們需要兩個Tomcat,單獨下載更方便,我這里下載的是tomcat 7.0.72。通過FTP將tomcat上傳到/usr/local/download下,然后分別運行以下命令解壓並移動到/usr/local下,因為后續要使用兩個Tomcat,所以我們執行兩次操作
tar -xvf apache-tomcat-7.0.72.tar.gz
mv apache-tomcat-7.0.72 /usr/local/Tomcat01
tar -xvf apache-tomcat-7.0.72.tar.gz
mv apache-tomcat-7.0.72 /usr/local/Tomcat02
  • 此時我們的Tomcat已經解壓完成了,接下來是修改端口號,防止兩個Tomcat端口沖突,Tomcat默認會占用三個端口:8005,8080和8009,這里我們修改成如下,文件為/usr/local/Tomcat01/conf/server.xml和/usr/local/Tomcat02/conf/server.xml(這里如果不熟悉vi編輯器的小伙伴可以將配置文件下載到本地然后修改完成后再上傳回服務器)
Tomcat01   8015 8081 8019
Tomcat02   8025 8082 8029
  • 修改完成以后我們進入/usr/local/Tomcat01/bin目錄下運行 ./start.sh,會提示Tomcat Started,此時實體機依然是無法訪問的,因為防火牆沒有開放端口,執行以下命令開放端口,以下命令僅當前會話有效,增加--permanent可以永久保留端口開放狀態,不過我們是要做的負載均衡中nginx只會訪問本機的Tomcat,所以Tomcat的端口沒有必要一直開放,現在測試下就夠了
firewall-cmd --zone=public --add-port=8081/tcp
  • 此時我們在客戶端虛擬機中訪問 http://192.168.59.130:8081 即可看到Tomcat的歡迎頁了,此時還有一個問題,兩個Tomcat的首頁是一樣的,負載均衡成功后無法分辨來自哪個Tomcat,所以我們要加點東西區分一下,我是在每個歡迎頁的body中增加了一行標識如下,文件位於/usr/local/Tomcat01/webapps/ROOT/index.jsp

安裝Nginx

nginx可以通過修改源的方式進行yum安裝,有需要的同學可以自行搜索下,本例中使用源碼安裝

  • 從官網下載源碼包后通過FTP將nginx的源碼上傳到/usr/local/download下,然后執行以下命令解壓,我這里使用的是1.10.2
tar -xvf nginx-1.10.2.tar.gz 
  • 之后我們就要用到gcc來編譯nginx的源碼了,需要先安裝gcc
yum install gcc
  • 之后分別執行以下命令,--prefix是指定軟件的安裝位置
cd /usr/local/download/nginx-1.10.2
./configure --prefix=/usr/local/nginx 
  • 執行之后我們會的到以下錯誤,我們需要去下載PCRE的源碼,然后通過FTP上傳到/usr/local/download下,我這里用的是8.39
  • 解壓縮pcre的源碼,命令和以前的一樣,解壓后不需要進行其他操作
tar -xvf pcre-8.39.tar.gz 
  • 然后我們再次編譯nginx,根據上次的提示我們追加上pcre的源碼位置
cd /usr/local/download/nginx-1.10.2
./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/download/pcre-8.39
  • 恭喜,又報錯了,這次提示換成了這個,所以我們又需要下載zlib的源碼,老辦法上傳到老地方,然后解壓,這里命令就不詳細說了,跟之前一樣,我下載的版本是1.2.8

  • 解壓完成后,我們根據提示追加zlib命令,是的,就追加這兩個,不需要再追加了

cd /usr/local/download/nginx-1.10.2
./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/download/pcre-8.39 --with-zlib=/usr/local/download/zlib-1.2.8
  • 編譯完成了,執行安裝,命令如下
make && make install && make clean
  • 本來以為可以愉快的結束了的,結果。。。。。。

  • 好吧,只能繼續安裝了

yum install gcc-c++
  • 現在執行前一步的make命令安裝就可以了,接下來進入/usr/local/nginx/sbin目錄下執行./nginx啟動nginx,然后分別執行以下命令開放80端口(永久開放的端口在設置后必須執行reload,本次有效的不需要執行,執行reload后本次有效的端口也將失效)
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
  • 之后我們可以在客戶端的瀏覽器中輸入 http://192.168.59.130 進行測試,如果出現如下頁面表示nginx啟動成功了

  • nginx是可以做成系統服務的,實際應用中也大多是這么做的,不過這里只是個示例,就不做成服務了,如果有需要的可以自行百度,當然如果使用yum安裝的話安裝完成就已經注冊服務了

配置負載均衡

  • 之前Tomcat我們已經做好了配置,接下來只需要在nginx中配置即可,配置文件為/usr/local/nginx/conf/nginx.conf,如下圖添加upstream部分,將localtion部分更改為圖中部分即可,server可以是其他服務器上的服務,weight越高越容易被分發請求,這里我暫時寫本機的,另外實際使用中upstream第一行要加入ip_hash來保證同一用戶一次只能訪問同一台服務器,解決session跨服務器丟失的問題,如果系統內使用其他方法處理了session的共享問題就不要加了,這個實例中我們就不加入了,因為加入了以后刷新瀏覽器頁面不會變化

  • 接下來就可以進行負載均衡的測試了,因為修改過nginx的配置文件所以我們需要重啟一下nginx,然后開啟兩個Tomcat,命令如下:

/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
/usr/local/Tomcat01/bin/start.sh
/usr/local/Tomcat02/bin/start.sh
  • 接下來可以在實體機的瀏覽器進行測試了,連續訪問虛擬機的nginx,這時Tomcat歡迎頁就會在01和02之間來回切換,至此負載均衡配置結束,然后大家可以回過頭去再創建一個Server02重新配置一遍了,因為keepalived就需要根據機器分主次了,配置文件是不一樣的,配置完成的話server01的nginx也可以設置將請求分發到server02的tomcat上,不過這里為了演示就不添加了,后續好區分請求由哪台機器響應

配置keepalived

yum install keepalived
  • 安裝完成后需要配置keepalived的配置文件,文件位於/etc/keepalived/keepalived.conf,下圖中為需要修改的部分,默認的配置文件中在其后還有很多內容,本實例只是簡單的DEMO,所以那些內容暫時用不上,可以全部刪除,接下來說下圖中這部分的配置

    • state 主服務器為MASTER,其他服務器均為BACKUP
    • interface 通信用的網卡,在之前查看IP時可以看到
    • virtual_router_id 主從服務器此ID必須一致
    • priority 優先級,主服務器必須大於其他服務器,數值越大優先級越高
    • authentication 主從服務器必須一致
    • virtual_ipaddress 虛擬IP地址,主從服務器必須一致,此IP為客戶端訪問時使用的IP
    • 更多詳細的配置請參考:Nginx+Keepalived實現站點高可用

    keepalivedconf

  • 配置完此文件后保存退出,然后重啟keepalived服務,此時通過ip addr查看發現主從服務器上都有192.168.59.100的虛擬IP,原因是防火牆阻止了服務器之間的vrrp通信,分別執行以下命令,需要針對自己電腦進行修改的只有interface后的網卡,其他的照抄即可

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eno16777736 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eno16777736 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
  • 至此Keepalived的配置也完成了,通過ip addr查看可發現主服務上帶有192.168.59.100的虛擬IP而從服務器上沒有,關閉主服務器的keepalived,虛擬IP則會轉移到從服務器上來,測試服務器通過瀏覽器訪問 http://192.168.59.100 可看到虛擬IP轉移的效果,頁面會從主服務器的頁面轉換為從服務器的頁面,這里就不上圖片了

  • 完成上述步驟之后keepalived已經可以實現虛擬IP轉移了,但是實際應用當中我們需要的是自動進行虛擬IP的轉移,所以我們還需要配置keepalived的腳本,使其能夠在某一個nginx無法提供服務的時候自動將虛擬IP轉移到備用服務器,以下腳本來自於上邊提供的鏈接,原理是通過curl訪問某一個鏈接,如果連續兩次三秒沒有響應則降低服務器的優先級,我們在/etc/keepalived目錄下創建一個名為check_status.sh的文件,然后鍵入以下內容

#!/bin/bash
count=0
for (( k=0; k<2; k++ ))
do
    check_code=$( curl --connect-timeout 3 -sL -w "%{http_code}\\n" http://localhost/login.html -o /dev/null )
    if [ "$check_code" != "200" ]; then
        count=$(expr $count + 1)
        sleep 3
        continue
    else
        count=0
        break
    fi
done
if [ "$count" != "0" ]; then
    exit 1
else
    exit 0
fi
  • 因為腳本后續是需要執行的,所以我們需要賦予可執行的權限,此腳本是我們自定義的,沒有什么安全問題,此項操作需要在root用戶下執行,代碼如下(這里感謝 程序人生0407 的提醒)
chmod +x check_status.sh
  • 之后我們在keepalived.conf中配置腳本,配置內容如下
vrrp_script check_status {
    script "/etc/keepalived/check_status.sh"
    interval 5
    weight -5
}
vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.59.100
    }
    track_script {
        check_status
    }
}
  • 配置完成后重啟keepavlied即可,此時如果關閉本機的nginx的話可以看到在5秒后虛擬IP會漂移到備用服務器上去,這里因為演示的話圖片太多了,就不上圖片了,nginx退出可以執行nginx -s stop命令,如果是使用yum安裝的nginx可以通過systemctl來停止nginx服務

  • 實際使用當中經常使用到的還有在切換服務器時發送郵件用以提醒運維人員主服務器異常,方法有很多種,此例中就不再贅述,有興趣的可以自行查找相關資料

本示例到此結束,如果各位有什么意見或建議,歡迎留言指教,轉載請注明源地址
另說明,markdown文檔中的代碼由於未知原因傳上來以后格式有點混亂,大家使用的時候注意下格式,不要少個括號之類的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM