實驗1:Tomcat安裝css
[root@localhost ~]#cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core)html
[root@localhost ~]#uname -r
3.10.0-862.el7.x86_64前端
使用系統自帶的jdk
yum install -y java-1.8.0-openjdk-devel
vim /etc/profile.d/java.sh
export JAVA_HOME=/usrjava
安裝Tomcat
yum install tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp tomcat -y
systemctl start tomcat
tcp/8005,8009,8080都已打開,tomcat已啓動nginx
提供一測試類應用
cd /var/lib/tomcat/webapps/
mkdir ./test/{classes,lib,META-INF,WEB-INF} -pv
cd test/
vim index.jspgit
<%@ page language="java" %> <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="green">TomcatB.magedu.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("magedu.com","magedu.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
經過瀏覽器訪問
實驗2:配置nginx反代負載均衡tomcatgithub
按照實驗1搭建好兩臺tomcat主機web
配置nginx
yum install nginx -y
vim /etc/nginx/nginx.conf算法
upstream tomcatsrvs{ server 192.168.91.139:8080; server 192.168.91.137:8080; } server { server_name www.magedu.com; location / { proxy_pass http://tomcatserver; } }
實驗3:配置httpd反代負載均衡tomcat
yum install -y httpd
vim /etc/httpd/conf.d/httpd_tomcat.confapache
<proxy balancer://tomcatserver> 定義後端服務器組,名爲tomcatserver balancermember http://192.168.91.139:8080 balancermember http://192.168.91.137:8080 若是與後端服務器使用ajp協議鏈接,把http改成ajp proxyset lbmethod=byrequests 至關於輪詢(rr) </proxy> <virtualhost *:80> servername www.magedu.com proxyrequests off proxypreservehost on proxyvia on <proxy *> require all granted </proxy> proxypass / balancer://tomcatserver/ proxypassreverse / balancer://tomcatserver/ <location /> require all granted </location> </virtualhost>
balancermember有後端檢查功能,也可定義權重調度算法等等;參考文檔:
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
httpd反代相關設置:
http集羣調度算法:
byrequests:輪詢(默認)
bybusyness:加權輪詢
bytraffic:基於流量調度
定義後端調度主機狀態status:
D:至關於down不接受請求
I:強行設置爲健康
H:熱備,至關於backup
E:錯誤
N:不接受新請求
實驗4:httpd實現session sticky
vim /etc/httpd/conf.d/httpd_tomcat.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <proxy balancer://tomcatserver> balancermember http://192.168.91.139:8080 route=TomcatA balancermember http://192.168.91.137:8080 route=TomcatB proxyset lbmethod=byrequests proxyset stickysession=ROUTEID </proxy> <virtualhost *:80> servername www.magedu.com proxyrequests off proxypreservehost on proxyvia on <proxy *> require all granted </proxy> proxypass / balancer://tomcatserver/ proxypassreverse / balancer://tomcatserver/ <location /> require all granted </location> </virtualhost>
發現不論怎麼刷新都只會調度都固定的一臺後端服務器,而且Session ID不會改變
實驗5:Nginx實現session sticky
vim /etc/nginx/nginx.conf
upstream tomcatserver { server 192.168.91.139:8080; server 192.168.91.137:8080; hash $request_uri consistent; }
實驗6:httpd, tomcat cluster實現session sticky
官方文檔:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
vim /etc/tomcat/server.xml
在server.xml中的Engine或Host下插入下面的代碼
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" ##多播地址 port="45564" ##多播地址監聽的端口,同一個集羣必須相同 frequency="500" ##每隔0.5s發送一次心跳檢測 dropTime="3000"/> ##3s沒收到心跳檢測代表對方down <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" ##不建議用auto,更改成本機提供服務的IP port="4000" autoBind="100" ##自動綁定事件 selectorTimeout="5000" maxThreads="6"/> ##集羣內部最大線程,代表集羣中最多有7臺主機 <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> ##官方文檔這裏有錯誤,少告終尾的/ <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> ####官方文檔這裏有錯誤,少告終尾的/ </Cluster>
在對應的站點目錄下,建立WEB-INF/web.xml文件,由於是測試因此直接複製全局的web.xml
cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/
vim /var/lib/tomcat/webapps/test/WEB-INF/web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <distributable/> ##添加這一段代碼,注意,不要放到註釋內部,開頭和結尾
systemctl restart tomcat
在httpd主機上
vim /etc/httpd/conf.d/vhost.conf
<proxy balancer://tcsrvs> BalancerMember http://192.168.91.139:8080 BalancerMember http://192.168.91.137:8080 </Proxy> <VirtualHost *:80> ServerName www.magedu.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <proxy *> require all granted </proxy> ProxyPass / balancer://tcsrvs/ ProxyPassReverse / balancer://tcsrvs/ <location /> require all granted </location> </VirtualHost>
測試
發現輪詢調度到兩臺服務器上,可是Session ID保持不變
實驗6:使用memcache做爲tomcat的session server
簡述
memcach是 高性能、分佈式的內存對象緩存系統,memcache緩存時鍵和值都在內存中存儲,因此訪問速度很快,memcache緩存時要依賴於客戶端的智能,緩存的過程是客戶端先去訪問後端的tomcat服務器,而後再請求memcache將訪問的數據緩存下來,下次再訪問時就直接會訪問memcache中的緩存,這一點與varnish不一樣,varnish是客戶端直接去訪問varnish緩存服務器,若是緩存上面沒有,varnish會替客戶端到後端服務器上去尋找,而後緩存下來,因此memcache就被稱爲旁掛式緩存,強依賴於客戶端的智能
特性
緩存:cache,無持久存儲功能,由於存儲於內存當中斷電就會丟失;
bypass緩存,依賴於客戶端的智能;
k/v cache,僅支持存儲可流式化數據,也就是發送數據以前打碎,而後到接收端再重組的過程稱爲可流式化。
安裝和配置
yum install memcached
監聽的端口:11211/tcp, 11211/udp
memcached -h —能夠查看程序命令經常使用選項
命令:
統計類:stats, stats items, stats slabs, stats sizes
存儲類:set, add, replace, append在後面插入值, prepend在前面插入值
命令格式:
<command name> <key> <flags標誌位> <exptime> <bytes> <cas unique>
檢索類:get, delete, incr/decr自增和減
清空:flush_all
要想將會話保存至後端memcache中,而且每一個memcache都保存相同的會話,須要一個管理項目memcached-session-manager
項目地址:https://github.com/magro/memcached-session-manager
下載以下jar文件至各tomcat的/usr/share/tomcat/lib/目錄中,其中的
{6,7,8}要換成與tomcat版本相同的版本號。
asm-6.0.jar
minlog-1.3.1.jar
kryo-4.0.1.jar
msm-kryo-serializer-2.1.1.jar
kryo-serializers-0.42.jar
objenesis-2.6.jar
memcached-session-manager-2.1.1.jar
reflectasm-1.11.3.jar
memcached-session-manager-tc7-2.1.1.jar
spymemcached-2.11.1.jar
vim /etc/tomcat/context.xml
<Context> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.91.139:11211,n2:192.168.91.137:11211" lockingMode="auto" sticky="false" sessionBackupAsync="false" sessionBackupTimeout= "1000" copyCollectionsForSerialization="true" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context>
yum install -y memcached
systemctl start tomcat memcached
實現前端httpd反代
<proxy balancer://tomcatserver> 定義後端服務器組,名爲tomcatserver balancermember http://192.168.91.139:8080 balancermember http://192.168.91.137:8080 若是與後端服務器使用ajp協議鏈接,把http改成ajp proxyset lbmethod=byrequests 至關於輪詢(rr) </proxy> <virtualhost *:80> servername www.magedu.com proxyrequests off proxypreservehost on proxyvia on <proxy *> require all granted </proxy> proxypass / balancer://tomcatserver/ proxypassreverse / balancer://tomcatserver/ <location /> require all granted </location> </virtualhost>
systemctl start httpd
測試
請求輪詢調度到後臺服務器上,Session ID始終不變