Keepalived+Nginx+Tomcat配置高可用负载均衡系统示例
前言
目前生產(chǎn)環(huán)境的配置越來越多的使用云服務(wù)了,同時負載均衡也基本轉(zhuǎn)向了云廠商提供的服務(wù),但對于絕大多數(shù)應(yīng)用來說,自建集群可能在費用上要更便宜一些,這篇文章也是之前整理的,再次新瓶裝舊酒分享給各位。此示例演示在不使用docker的情況下配置負載均衡,內(nèi)容keepalived+nginx+tomcat的基礎(chǔ)配置示例,某些特定配置此例中不會出現(xiàn),在示例中會用到三個虛擬機:兩個純命令行用于模擬服務(wù)端配置,一個帶桌面環(huán)境的用于模擬客戶端訪問,這樣三臺虛擬機使用NAT模式連接的時候是在同一個虛擬網(wǎng)絡(luò)中,更符合服務(wù)器的實際使用場景,虛擬機軟件為VMPlayer,這個對于個人可以免費使用,用起來來不錯,推薦一下。
本實例中是模擬使用場景,機器性能有限,所有nginx和Tomcat就放到一個機器上了,實際場景中如果可以盡量分開,防止nginx所在服務(wù)器出問題時跟著宕掉一個或多個Tomcat。
創(chuàng)建虛擬機
此部分是為了照顧對于虛擬機安裝不熟悉的同學(xué),如果已經(jīng)熟悉了虛擬機的安裝或有實體機環(huán)境等,可以跳過此步驟。
創(chuàng)建服務(wù)器虛擬機(mini安裝)
- 打開VMPlayer,然后界面如下,點擊創(chuàng)建新虛擬機
- 彈出頁面后選擇最后一項,稍后安裝操作系統(tǒng),這里一定要選擇這個,因為如果選擇其他直接安裝的話會使用簡易安裝,默認安裝完是帶桌面的
- 下一步,然后選擇Centos 64位的操作系統(tǒng),這個需要針對鏡像來選擇,我這里選這個是因為我有現(xiàn)成的64位鏡像。
- 下一步,這里設(shè)置下虛擬機的名字和安裝地址,便于區(qū)分。
- 下一步,然后需要設(shè)置硬盤,大小隨意(虛擬機創(chuàng)建之后硬盤大小只能增大不能減小了,所以這里可以設(shè)置的小一點,親測配置完成后也就才2G,這里設(shè)置5G應(yīng)該就足夠了),下邊兩項也是二選一隨意。
- 下一步,界面如下,這里我們需要點擊“自定義硬件”來配置系統(tǒng)的光驅(qū),如果實體機的配置低的話可以在這里降低下虛擬機的CPU和內(nèi)存等,命令行模式下的CentOS并不需要多高的配置(單核512M可以無壓力運行)
- 在打開的界面中選擇光驅(qū),然后選擇使用ISO鏡像,點擊瀏覽選擇鏡像即可,這個鏡像可以從CentOS官網(wǎng)下載。
- 之后點擊關(guān)閉,再點擊完成即可,此時的界面如下:
- 此時虛擬機的硬件已經(jīng)準備完畢,接下來我們點擊播放虛擬機配置系統(tǒng),點擊后界面如下,選擇第一項Install。
- 接下來稍等片刻會進入圖形化界面,這里不用擔心,這個只是安裝的圖形界面,與之后系統(tǒng)沒關(guān)系,如下:
- 因為是要最小化安裝,所以語言默認英文即可,點擊Continue,跳轉(zhuǎn)后的界面為配置界面,我們僅需要修改下圖中紅框的部分,其他的默認即可。
-
第一項是配置系統(tǒng)的硬盤,這里我們不需要進行任何配置,點擊進入之后直接點擊左上角的Done按鈕即可。
-
第二項是配置系統(tǒng)的網(wǎng)絡(luò),默認不連接,所以我們需要點擊進入配置頁面,然后將右上角的OFF置成ON,然后點擊DONE,之后會跳轉(zhuǎn)回一開始的設(shè)置頁,我們就可以開始系統(tǒng)的安裝了,點擊Begin Installation,接下來需要設(shè)置用戶。
- ROOT用戶的密碼是必須要創(chuàng)建的,其他用戶可以根據(jù)需要進行創(chuàng)建,這里我只設(shè)置了ROOT用戶的密碼,方便后續(xù)的操作,不用考慮權(quán)限問題,實際應(yīng)用中是要用其他用戶操作的,后續(xù)的操作可視情況賦予權(quán)限即可。還有需要注意的是如果用戶的密碼強度很低,需要點擊兩次DONE來確定。
- 接下來就是等待結(jié)束重啟即可,至此CentOS就安裝完成了。
創(chuàng)建客戶端虛擬機(簡易安裝安裝)
在這個實例中客戶端有兩個用處,一是通過瀏覽器測試服務(wù)端的服務(wù)是否好用;二是通過FTP向服務(wù)端上傳幾個源碼包。其實上傳源碼包這個功能大部分情況下實體機也是可以操作的,但在NAT網(wǎng)絡(luò)下實體機的瀏覽器在默認是無法訪問服務(wù)端的服務(wù)的。
客戶端虛擬機對操作系統(tǒng)無限制,只要可以運行瀏覽器即可,其實命令行模式下的linux也是可以訪問的,不過不太直觀,如果想用實體機進行訪問的話也可以,不過需要將虛擬機的網(wǎng)絡(luò)連接模式改為橋接模式,而且對網(wǎng)絡(luò)有要求,需要支持DHCP才可以。
安裝過程和服務(wù)端的很類似,只有第二部有所區(qū)別,服務(wù)器需要選擇稍后安裝操作系統(tǒng),但客戶端的虛擬機使用第二項選擇鏡像即可,之后會提示設(shè)置系統(tǒng)的用戶名和密碼,之后的步驟就一樣了,而且自定義硬件的時候不再需要設(shè)置光驅(qū)。
配置基礎(chǔ)環(huán)境
-
這里以Server01為示例,其實我們需要配置兩臺的,我使用的用戶是root用戶,實際應(yīng)用中可能需要在其他用戶下進行,視情況賦予權(quán)限即可。
-
因為我們需要向虛擬機上傳一些用到的軟件(當然可以使用wget來下載,只不過有點麻煩),所以這里我們實體機或者客戶端使用FTP客戶端進行連接(工具有很多,挑選自己順手的使用,這里推薦Xftp和FileZilla,對于個人使用都是免費的),虛擬機的IP地址可以通過ip addr進行查看,紅框中就是當前虛擬機的IP地址
- 接下來在FTP客戶端中輸入主機地址,需要注意的是CentOS使用的是SFTP,所以我們輸入的地址應(yīng)該是sftp://192.168.59.130,輸入賬戶密碼之后點擊快速連接,如果看到如下界面則表示連接成功了
- 現(xiàn)在系統(tǒng)是配置完成了,不過IP是隨機分配的,如果有需要可以將服務(wù)器的地址改為靜態(tài)IP,不過這個IP一般不會發(fā)生變化,這里我就先不改了,但是服務(wù)器的話是一定會設(shè)置固定IP的。
安裝JDK
- 我們常用的SUN JDK不支持yum安裝,所以需要從JDK官網(wǎng)下載合適的JDK,這里我使用的是JDK-8u111-linux-x64.rpm,通過ftp上傳到/usr/local/download下(這個位置隨意),然后分別執(zhí)行以下命令進行安裝,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下,因為后續(xù)要使用兩個Tomcat,所以我們執(zhí)行兩次操作
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已經(jīng)解壓完成了,接下來是修改端口號,防止兩個Tomcat端口沖突,Tomcat默認會占用三個端口:8005,8080和8009,這里我們修改成如下,文件為/usr/local/Tomcat01/conf/server.xml和/usr/local/Tomcat02/conf/server.xml(這里如果不熟悉vi編輯器的小伙伴可以將配置文件下載到本地然后修改完成后再上傳回服務(wù)器)
Tomcat01 8015 8081 8019
Tomcat02 8025 8082 8029
- 修改完成以后我們進入/usr/local/Tomcat01/bin目錄下運行 ./start.sh,會提示Tomcat Started,此時實體機依然是無法訪問的,因為防火墻沒有開放端口,執(zhí)行以下命令開放端口,以下命令僅當前會話有效,增加--permanent可以永久保留端口開放狀態(tài),不過我們是要做的負載均衡中nginx只會訪問本機的Tomcat,所以Tomcat的端口沒有必要一直開放,現(xiàn)在測試下就夠了
firewall-cmd --zone=public --add-port=8081/tcp
- 此時我們在客戶端虛擬機中訪問 http://192.168.59.130:8081 即可看到Tomcat的歡迎頁了,此時還有一個問題,兩個Tomcat的首頁是一樣的,負載均衡成功后無法分辨來自哪個Tomcat,所以我們要加點東西區(qū)分一下,我是在每個歡迎頁的body中增加了一行標識如下,文件位于/usr/local/Tomcat01/webapps/ROOT/index.jsp
安裝Nginx
nginx可以通過修改源的方式進行yum安裝,有需要的同學(xué)可以自行搜索下,本例中使用源碼安裝
- 從官網(wǎng)下載源碼包后通過FTP將nginx的源碼上傳到/usr/local/download下,然后執(zhí)行以下命令解壓,我這里使用的是1.10.2
tar -xvf nginx-1.10.2.tar.gz
- 之后我們就要用到gcc來編譯nginx的源碼了,需要先安裝gcc
yum install gcc
- 之后分別執(zhí)行以下命令,--prefix是指定軟件的安裝位置
cd /usr/local/download/nginx-1.10.2
./configure --prefix=/usr/local/nginx
- 執(zhí)行之后我們會的到以下錯誤,我們需要去下載PCRE的源碼,然后通過FTP上傳到/usr/local/download下,我這里用的是8.39
- 解壓縮pcre的源碼,命令和以前的一樣,解壓后不需要進行其他操作
tar -xvf pcre-8.39.tar.gz
- 然后我們再次編譯nginx,根據(jù)上次的提示我們追加上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
- 解壓完成后,我們根據(jù)提示追加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
- 編譯完成了,執(zhí)行安裝,命令如下
make && make install && make clean
- 本來以為可以愉快的結(jié)束了的,結(jié)果。。。。。。
- 好吧,只能繼續(xù)安裝了
yum install gcc-c++
- 現(xiàn)在執(zhí)行前一步的make命令安裝就可以了,接下來進入/usr/local/nginx/sbin目錄下執(zhí)行./nginx啟動nginx,然后分別執(zhí)行以下命令開放80端口(永久開放的端口在設(shè)置后必須執(zhí)行reload,本次有效的不需要執(zhí)行,執(zhí)行reload后本次有效的端口也將失效)
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
- 之后我們可以在客戶端的瀏覽器中輸入 http://192.168.59.130 進行測試,如果出現(xiàn)如下頁面表示nginx啟動成功了
- nginx是可以做成系統(tǒng)服務(wù)的,實際應(yīng)用中大多也是這么做的,不過這里只是個示例,就不做成服務(wù)了,如果有需要的可以自行百度,當然如果使用yum安裝的話安裝完成就已經(jīng)注冊服務(wù)了。
配置負載均衡
- 之前Tomcat我們已經(jīng)做好了配置,接下來只需要在nginx中配置即可,配置文件為/usr/local/nginx/conf/nginx.conf,如下圖添加upstream部分,將localtion部分更改為圖中部分即可,server可以是其他服務(wù)器上的服務(wù),weight越高越容易被分發(fā)請求,這里我暫時寫本機的,另外實際使用中upstream第一行要加入ip_hash來保證同一用戶一次只能訪問同一臺服務(wù)器,解決session跨服務(wù)器丟失的問題,如果系統(tǒng)內(nèi)使用其他方法處理了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
- 接下來可以在實體機的瀏覽器進行測試了,連續(xù)訪問虛擬機的nginx,這時Tomcat歡迎頁就會在01和02之間來回切換,至此負載均衡配置結(jié)束,然后大家可以回過頭去再創(chuàng)建一個Server02重新配置一遍了,因為keepalived就需要根據(jù)機器分主次了,配置文件是不一樣的,配置完成的話server01的nginx也可以設(shè)置將請求分發(fā)到server02的tomcat上,不過這里為了演示就不添加了,后續(xù)好區(qū)分請求由哪臺機器響應(yīng)。
配置keepalived
-
參考Oracle Linux的配置
-
keepalived推薦使用yum安裝,源碼安裝之后的配置挺復(fù)雜的
yum install keepalived
- 安裝完成后需要配置keepalived的配置文件,文件位于/etc/keepalived/keepalived.conf,下圖中為需要修改的部分,默認的配置文件中在其后還有很多內(nèi)容,本實例只是簡單的DEMO,所以那些內(nèi)容暫時用不上,可以全部刪除,核心配置說明如下:
vrrp_instance VI_1 {
# 主服務(wù)器為MASTER,其他服務(wù)器均為BACKUP
state MASTER
# 通信用的網(wǎng)卡,在之前查看IP時可以看到
interface eno16777736
# 主從服務(wù)器此ID必須一致
virtual_router_id 51
# 優(yōu)先級,主服務(wù)器必須大于其他服務(wù)器,數(shù)值越大優(yōu)先級越高
priority 100
# 主從服務(wù)器必須一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬IP地址,主從服務(wù)器必須一致,此IP為客戶端訪問時使用的IP
virtual_ipaddress {
192.168.59.100
}
}
- 配置完此文件后保存退出,然后重啟keepalived服務(wù),此時通過ip addr查看發(fā)現(xiàn)主從服務(wù)器上都有192.168.59.100的虛擬IP,原因是防火墻阻止了服務(wù)器之間的vrrp通信,分別執(zhí)行以下命令,需要針對自己電腦進行修改的只有interface后的網(wǎng)卡,其他的照抄即可
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查看可發(fā)現(xiàn)主服務(wù)上帶有192.168.59.100的虛擬IP而從服務(wù)器上沒有,關(guān)閉主服務(wù)器的keepalived,虛擬IP則會轉(zhuǎn)移到從服務(wù)器上來,測試服務(wù)器通過瀏覽器訪問 http://192.168.59.100 可看到虛擬IP轉(zhuǎn)移的效果,頁面會從主服務(wù)器的頁面轉(zhuǎn)換為從服務(wù)器的頁面,這里就不上圖片了
-
完成上述步驟之后keepalived已經(jīng)可以實現(xiàn)虛擬IP轉(zhuǎn)移了,但是實際應(yīng)用當中我們需要的是自動進行虛擬IP的轉(zhuǎn)移,所以我們還需要配置keepalived的腳本,使其能夠在某一個nginx無法提供服務(wù)的時候自動將虛擬IP轉(zhuǎn)移到備用服務(wù)器,以下腳本來自于上邊提供的鏈接,原理是通過curl訪問某一個鏈接,如果連續(xù)兩次三秒沒有響應(yīng)則降低服務(wù)器的優(yōu)先級,我們在/etc/keepalived目錄下創(chuàng)建一個名為check_status.sh的文件,然后鍵入以下內(nèi)容
#!/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
- 因為腳本后續(xù)是需要執(zhí)行的,所以我們需要賦予可執(zhí)行的權(quán)限,此腳本是我們自定義的,沒有什么安全問題,此項操作需要在root用戶下執(zhí)行,代碼如下(這里感謝 程序人生0407 的提醒)
chmod +x check_status.sh
- 之后我們在keepalived.conf中配置腳本,配置內(nèi)容如下
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即可,此時如果關(guān)閉本機的nginx的話可以看到在5秒后虛擬IP會漂移到備用服務(wù)器上去,這里因為演示的話圖片太多了,就不上圖片了,nginx退出可以執(zhí)行nginx -s stop命令,如果是使用yum安裝的nginx可以通過systemctl來停止nginx服務(wù)
-
實際使用當中經(jīng)常使用到的還有在切換服務(wù)器時發(fā)送郵件用以提醒運維人員主服務(wù)器異常,方法有很多種,此例中就不再贅述,有興趣的可以自行查找相關(guān)資料
本示例到此結(jié)束,如果各位有什么意見或建議,歡迎留言指教,轉(zhuǎn)載請注明源地址
另說明,markdown文檔中的代碼由于未知原因傳上來以后格式有點混亂,大家使用的時候注意下格式,不要少個括號之類的。
總結(jié)
以上是生活随笔為你收集整理的Keepalived+Nginx+Tomcat配置高可用负载均衡系统示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TrendForce 集邦:近期电视及显
- 下一篇: .NET周刊【12月第1期 2023-1