標題索引
css
追朔緣由html
方案構建java
方案評估nginx
追朔緣由git
網站集羣會話管理毋庸置疑,互聯網上方案層出不窮,構建穩定、高效、適應業務系統的方案需根據本身的業務發展自行設計,根據以往經驗tomcat構建會話管理時,每每異常莫名奇妙問題恆生,所以自測方案迫在眉睫。
github
方案構建web
1.會話管理apache
一般採用Cookie技術或Session技術,以下爲倆者方案詳解,Cookie技術具體原理及過程以下所示:vim
圖1-1 Cookie會話管理技術流程圖centos
如上所示Cookie技術是調用Serlet接口中的Set-Cookie方法,能夠將會話、網購產品等非重要數據保存Cookie中並經過response報文返回瀏覽器,瀏覽器緩存Cookie,瀏覽器再次訪問Serlet接口時攜帶以前分配的Cookie,從而攜帶以前Cookie中保存的內容。
Session技術具體原理以下所示:
圖1-2 Session會話管理技術流程圖
如上所示Session技術調用Serlet接口的Session方法,能夠將會話ID、網購產品等非重要數據保存會話,經過構建response響應報文返回瀏覽器會話ID,瀏覽器緩存會話ID,瀏覽器再次訪問Serlet接口時攜帶以前分配的會話ID,從而能夠從會話服務器中獲取保存在會話中的內容。
2.核心配置
調度器Cookie轉發
採用調度器採用Cookie會話管理時,會話保持技術主要集中在調度器,服務器端無需採用其餘Cookie或Session技術便可作到會話保持,如apache作調度時核心配置:
[ root@centos7 ~ ]#vim /etc/httpd/conf.d/vhost.conf #apache給請求報文頭部添加Cookie,並轉發 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <Proxy balancer://tcpsv> BalancerMember http://172.18.27.23:8080 route=1 BalancerMember http://172.18.27.24:8080 route=2 #調度採用基於Cookie的會話保持 proxyset stickysession=ROUTEID </Proxy> <VirtualHost *:80> ServerName www.jncsy.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> <Location /> Require all granted </Location> ProxyPass / balancer://tcpsv/ ProxyPa***everse / balancer://tcpsv/ </VirtualHost>
集羣會話同步
參考官方集羣文檔https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html,在每臺tomcat server.xml文件中添加
<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.8" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" <!--定義接收會話同步的IP地址 --> address="172.18.27.23" port="4000" autoBind="100" selectorTimeout="5000" <!--根據服務器數量定義,具體爲服務器數量-1 --> maxThreads="8"/> <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中的文件的末尾中添加
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 開啓會話分佈功能 --> <distributable/> </web-app>
會話服務器
會話服務器採用tomcat+memcache構建,其中tomcat中添加/usr/share/tomcat/bin下添加會話管理包,讓tomcat支持會話管理,在每一個頁面程序中的WEB-INF下常見lib目錄並在此目錄中添加序列化工具,將服務器產生的會話經過序列化工具轉化爲能夠存儲在memcache中的鍵值,具體可參考官網文檔https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration。
核心配置以下:
[ root@nginxser01 lib ]#pwd #上傳序列化工具 /usr/local/tomcat/webapps/test/WEB-INF/lib [ root@nginxser01 lib ]#ls asm-6.0.jar kryo-serializers-0.42.jar msm-kryo-serializer-2.1.1.jar reflectasm-1.11.3.jar kryo-4.0.1.jar minlog-1.3.0.jar objenesis-2.6.jar [ root@nginxser01 lib ]#pwd /usr/local/tomcat/lib #上傳會話管理工具 [ root@nginxser01 lib ]#ls memcached-session-manager-2.1.1.jar memcached-session-manager-tc8-2.1.1.jar spymemcached-2.12.3.jar [ root@nginxser01 conf]# vim server.xml #粘性會話和非粘性會話根據業務需求二選一 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/test" docBase="test"> <!-- 粘性會話主備模式,單臺存儲會話--> <!-- <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.18.27.110:11211,n2:172.18.253.104:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> --> <!--非粘性會話主主模式,兩臺同時存儲會話--> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.18.27.110:11211,n2:172.18.253.104:11211" sticky="false" sessionBackupAsync="false" lockingMode="auto" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context>
方案評估
根據如上3套方案,若業務量相對較小時,建議採用基於Cookie調度,由於網絡NAT技術有可能會產生調度不均衡,可是並不是同一IP會同時產生大量訪問量。若業務量相對較大時,建議採用專用會話管理服務器集羣,專業的工具作專業的事效果會更佳。若服務器資源相對匱乏、內存資源沒法保障時,建議採用會話同步。