版本說明:html
httpd版本:2.4.6
java
tomcat版本:7.0.69git
dedis版本:3.2.3github
操做系統版本:CentOS Linux release 7.3.1611web
拓撲結構:redis
tomcat-A/192.168.1.106 apache
客戶端------>httpd反向代理 -------> ----- > redis會話保持服務器
vim
192.168.1.101 tomcat-B/192.168.1.107 192.168.1.100後端
httpd反向代理:瀏覽器
安裝httpd服務
yum -y install httpd
httpd實現反向代理須要三個modules的支持:
mod_proxy.so mod_proxy_http.so mod_proxy_balancer.so
編輯proxy配置
cat /etc/httpd/conf.d/tomcat-proxy.conf <proxy balancer://tcsrvs> balancermember http://192.168.1.106:8080 balancermember http://192.168.1.107:8080 proxyset lbmethod=byrequests #調度方式,根據請求調度,相似於輪詢 </proxy> <virtualhost *:80> servername lb.tomcat.com proxyvia on proxyrequests off proxypreservehost on <proxy *> require all granted </proxy> proxypass / balancer://tcsrvs/ proxypa***everse / balancer://tcsrvs/ <location /> require all granted </location> </virtualhost>
tomcat服務器配置:
安裝對應的軟件包
java-1.8.0-openjdk tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
準備測試文件
mkdir /usr/share/tomcat/webapps/test/ tomcat-A: cat /usr/share/tomcat/webapps/test/index.jsp <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="blue">TomcatA.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("tomcatA.com","tomcatA.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> tomcat-B: cat /usr/share/tomcat/webapps/test/index.jsp <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="red">TomcatB.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("tomcatB.com","tomcatB.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
而後啓動tomcat服務
systemctl start tomcat.service
此時在瀏覽器測試http://192.168.1.101/test/
以上只是完成了httpd調度後端tomcat主機的需求
當客戶端訪問時,不但願會話信息改變,試想一下,你在電商網站下了單了,而後刷新頁面調度器把你的請求調度到另外一臺機器上,下的單沒了,你做何感覺?因此,爲了不這種現象的發生,咱們經過設置cookie信息,來綁定會話
httpd服務器配置:
cat tomcat-proxy.conf header add set-cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #設置cookie信息 <proxy balancer://tcsrvs> balancermember http://192.168.1.106:8080 route=tomcatA loadfactor=1 balancermember http://192.168.1.107:8080 route=tomcatB loadfactor=1 proxyset lbmethod=byrequests proxyset stickysession=ROUTEID #基於會話粘性來設置cookie </proxy> #route與後端tomcat的jvmRoute對應 <virtualhost *:80> servername lb.tomcat.com proxyvia on proxyrequests off proxypreservehost on <proxy *> require all granted </proxy> proxypass / balancer://tcsrvs/ proxypa***everse / balancer://tcsrvs/ <location /> require all granted </location> </virtualhost>
tomcat主機配置:
vim server.xml <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA"> #修改tomcat主機,jvmRoute是支持負載均衡的
在tomcatB主機也要作相似的修改
完成上述內容就可以實現基於cookie的會話粘性了,在瀏覽器測試http://192.168.1.101/test/就只會調到同一臺主機,當此主機故障會調度到另外一臺主機
上述基於cookie的會話粘性存在一個問題,即客戶端基於cookie訪問後端服務器A,若是A主機故障,httpd會從新調度到B主機上,可是B上沒有以前的會話信息,因此客戶端瀏覽記錄、下單狀況等信息就消失了。
可使用tomcat集羣加單獨的緩存服務器redis解決上述問題,tomcat集羣解決主機單點故障問題,將會話信息單獨存放在緩存服務器上而不是tomcat主機
,不過redis爲了不單點問題也要作高可用,這裏咱們只要能實現會話緩存功能便可。只有高可用你們有興趣能夠本身研究
配置session server的話就不用cookie信息,把httpd配置中的cookie配置刪除
vim tomcat-proxy.conf header add set-cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED proxyset stickysession=ROUTEID #將上述兩行刪掉或者註釋,而後重啓服務
tomcat主機配置集羣:
cat server.xml #在Engine字段下配置下述內容 <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" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <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>
以上內容不少,能夠直接複製,不用作任何修改,兩臺主機都要配置
參考鏈接http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
注意官網模板配置中有兩處錯誤:
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" /> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" /> #官網中此處末尾都沒有加結束符 /
而後修改web.xml
cat web.cml <distributable/> #此處指明tomcat的分佈式集羣
安裝redis,並設置
yum -y install redis vim /etc/redis.conf bind 0.0.0.0 #指定監聽全部地址,默認監聽端口是tcp6379
而後啓動redis服務
接着配置tomcat主機,本處以其中一臺爲例,另外一臺也要按此方式配置
cat context.xml #編輯以下內容 <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="192.168.1.100" port="6379" database="0" maxInactiveInterval="60" /> #192.168.1.100是redis的地址
準備jar包,三個jar包,其下載地址以下
https://github.com/izerui/tomcat-redis-session-manager.git
而後將這三個jar包,放到tomcat的庫目錄中,即/usr/share/tomcat/lib/
重啓tomcat服務
此時打開瀏覽器測試http://192.168.1.101/test/,會發現sessionID不變,但調度的後端主機改變了
總結:
redis只修改監聽地址便可,其餘不用修改任何配置;
httpd只是啓動反代的做用,關鍵是配置對後端主機的調度;
tomcat集羣需修改server.xml和web.xml文件,配合redis緩存還需配置context.xml和準備jar包
結束