當一臺Tomcat服務器沒法承載現有的訪問量時,咱們可使用集羣來提高其承載量;
Tomcat Cluster的架構通常爲:前端使用負載均衡(nginx、haproxy),將請求調度到後端的多個Tomcat服務器上,可是通常Tomcat不會直接面對前端,而是在兩者之間再放置一個httpd服務,使用apache接收調度到自己的請求,而後再將請求發送至Tomcat上進行處理;由於使用了負載均衡,因此咱們必然須要進行會話保持,讓來自同一客戶端的請求始終發至同一個Tomcat服務器;
會話保持:
session sticky:會話綁定,若是服務器宕機,數據會丟失;
source ip:源地址綁定
cookie
session cluster:會話集羣,當一臺服務器宕機之後還可使用其餘服務器中的session繼續提供服務,只要有服務器在線session數據就不會丟失;可是不適合大規模使用,由於session cluster比較耗費資源;
session server:session服務器
memcached:key-value存儲形式,會將緩存數據存儲在內存中,因此速度會很是快,可是數據宕機即沒;
Tomcat負載均衡方式:
nginx+tomcat
apache+tomcat
Tomcat Cluster負載均衡方式:
session server+tomcat
拓撲結構:
一臺Centos7做爲負載均衡器,兩臺Centos6做爲Tomcat服務器
配置過程:
1.安裝JDK以及Tomcat在上一篇博客中已經演示過了,在此再也不贅述;
https://blog.csdn.net/qq_32501535/article/details/88947938
2.添加一個實驗用的頁面;
cd /usr/local/tomcat
vim conf/server.xml
Centos6_1:
<Engine name="Catalina" defaultHost="www.guowei.com">
<Host name="www.guowei.com" appBase="/data/webapps/" autoDeploy="true">
<Context path="" docBase="ROOT">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="guowei_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
</Host>
Centos6_2:
<Engine name="Catalina" defaultHost="mail.guowei.com">
<Host name="mail.guowei.com" appBase="/data/webapps/" autoDeploy="true">
<Context path="" docBase="ROOT">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="guowei_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
</Host>html
3.檢測配置文件是否有語法錯誤
catalina.sh configtest
4.啓動tomcat
catalina.sh start
5.製做一個測試頁;
vim /data/webapps/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title> JSP Test Page</title>
</head>
<body>
<% out.println("Hello World! on www/mail"); %>
</body>
</html>前端
6.訪問http://www.guowei.com或http://mail.guowei.com(前提:在hosts中已添加對應解析條目)
Note:兩臺Centos6做相同配置;
7.在Centos7中安裝Nginx;
yum install nginx -y
8.使用nginx實現負載均衡功能
vim /etc/nginx/nginx.conf
upstream tomservers {
server www.guowei.com:8080;
server mail.guowei.com:8080;
}
location ~* \.(jsp|do) {
proxy_pass http://tomservers;
}
9.測試:
訪問http://192.168.80.139/index.jsp便可查看負載均衡效果;
10.源地址綁定:(功能展現,能夠不配置)
vim /etc/nginx/nginx.conf
upstream tomservers {
ip_hash;
server www.guowei.com:8080;
server mail.guowei.com:8080;
}
11.使用apache實現負載均衡
使用apache實現負載均衡須要加載特定balance模塊,才能夠實現負載均衡;
httpd -M ==> proxy_balancer_module (shared)
指令介紹:
ProxyPass [path] !|url [key=value key=value]:將後端服務器某URL與當前服務器的某虛擬主機路徑關聯起來做爲提供服務的路徑;path爲當前服務器上的某虛擬路徑,url爲後端服務器上某URL路徑;使用此指令時必須將ProxyRequests的值設置爲Off;須要注意的是若是path以」/」結尾,則對應的url也必須以」/」結尾,反之亦然;
ProxyRequests {On|Off}:是否開啓apache的正向代理功能;啓用此項時爲了代理http協議必須啓用mod_proxy_http模塊;
ProxyVia {On|Off|Full|Block}:用於控制在http首部是否使用Via;主要用於在多級代理中代理請求的流向,默認爲Off,及即不啓用此功能,On表示每一個請求和響應報文均添加Via,Full表示每一個Via行都會添加當前apache服務的版本信息;Block表示每一個代理請求報文中的Via都會被移除;
ProxyPreserveHost {On|Off}:若是啓用此功能,表明會將用戶請求報文中的Host行發送給後端的服務器,而再也不使用ProxyPass指定的服務地址;若是想在反向代理中支持虛擬主機,則須要開啓此項,不然無需開啓此功能;
Centos6_1|2:
vim /data/webapps/ROOT/index.jsp
<%@ page language="java" %>
<html>
<head><title>mail</title></head>
<body>
<h1><font color="red|blue">www|mail.guowei.com</font></h1>
<table align="centre" corder="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("guowei.com","guowei.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>java
vim /etc/tomcat/server.xml
<Engine name="Catalina" defaultHost="www|mail.guowei.com" jvmRoute="www|mail">
Note:由於兩臺Centos6的配置大體相同,因此只列出一方的配置,其中不一樣的內容我使用」|」分開了,配置時留意一下!
Centos7:(基於http|ajp方式)
vim /etc/httpd/conf.d/vhosts.conf
<proxy balancer://lbcluster1>
BalancerMember ajp|http://192.168.80.131:8009|8080 loadfactor=10 route=www
BalancerMember ajp|http://192.168.80.134:8009|8080 loadfactor=10 route=mail
</proxy>mysql
<VirtualHost *:80>
serverName web.guowei.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
訪問http://192.168.80.139/index.jsp
12.設置apache的stickysession功能:
Centos7:
vim /etc/httpd/conf.d/vhosts.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
BalancerMember http://192.168.80.131:8080 loadfactor=10 route=www
BalancerMember http://192.168.80.134:8080 loadfactor=10 route=mail
ProxySet stickysession=ROUTEID
</proxy>nginx
<VirtualHost *:80>
serverName web.guowei.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://lbcluster1/
ProxyPassReverse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
<Location /balancer> 設置查看balancer狀態列表
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>
訪問http://192.168.80.139/index.jsp進行測試,連續刷新會發現session id不會發生改變了,說明成功了;
13.實現Tomcat的Session Cluster
會話管理器:能夠定義在Host中或者Context中;
標準會話管理器(StandardManager):
<Manager className=」org.apacha.catalina.session.StandardManager」 maxInactiveInterval=」7200」 />
會話信息默認保存在$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/中的SESSION.ser文件中;週期性保存;
指令:
maxActiveSession:最多容許的活動會話數量,默認爲-1,表示不限制;
maxInactiveInterva:非活動的會話超時時長,默認爲60s;
pathname:會話文件的保存目錄;
持久會話管理器(PersistenManager):
將會話數據保存至持久存儲(好比單獨的mysql服務器)中,而且能在服務器之外終止後從新啓動時從新加載這些會話信息;持久會話管理器支持將會話保存至文件存儲(FileStore)或JDBC存儲(JDBCStore)中;可是這種會話管理器不是共享的,也就是能夠將本身的會話信息保存至指定存儲中,可是也只能從存儲中加載本身以前導入的,沒法加載別人的session信息;
例子:
<Manager className=」org.apache.catalina.session.PersistenManager」 saveOnRestart=」true」>
<Store classesName=」org.apache.catalina.session.FileStoore」 directory=」/data/tomcat-sessions」/>
</Manager>
Note:每一個用戶的會話會被保存至directory指定的目錄中的文件中,文件名爲<session id>.session;並經過後臺線程每隔一段時間(checkInterval參數定義,默認爲60秒)檢查一次超時會話;
<Manager className=」org.apache.catalina.session.PersistenManager」 saveOnRestart=」true」>
<Store classesName=」org.apache.catalina.session.JDBCStore」 directory=」com.mysql.jdbc.Driver」 connectionURL=」jdbc:mysql://localhost:3306/mydb?user=USER_NAME;password=PASSWORD」/>
</Manager>
DeltaManager:將多個Tomcat節點構建成一個經過組播信道進行通訊的集羣,從而實現session共享;每一個節點都會監聽在某一端口,用來接收其餘節點發來的session信息;能夠配置在Engine、Host、或Context中;
web
<Cluster>:定義Cluster;
<Manager>:定義Cluster使用的會話管理器;
<Channel>:定義節點間通訊所使用的信道;
<Menbership>:定義Cluster中的集羣成員;
<Receiver>:定義成員節點接收其餘節點信息的方式;
<Sender>:定義成員節點傳遞給其餘節點信息的方式;
詳細信息請閱讀官方資料:https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
Note:若是某個webapp要支持會話管理器,至進行上面的配置還不夠,還要在其對應的web.xml中添加<distribitable/>這一指令才能夠;
sql
注:根據馬哥視頻作的學習筆記,若有錯誤,歡迎指正;侵刪;
apache