技术分享 CAS单点登录 服务端配置 查看内容

cas 入门之三十:cas 集群tomcat session组播复制

老高 | 发布于 2017-05-05 14:47| 浏览()| 评论() | 收藏() | 点赞() | 打印

摘要: ​这个方案相对比较简单容易测试,但是性能不太好,在生产应用当tomcat服务器数量不是很多的进候可以一试,如果多了就改为memcached-session-manager方式吧。

这个方案相对比较简单容易测试,但是性能不太好,在生产应用当tomcat服务器数量不是很多的进候可以一试,如果多了就改为memcached-session-manager方式吧。

假设tomcat1:192.168.1.100:8080  

tomcat2:192.168.1.101:8080

nginx 192.168.1.103:80  域名cas.test.com 进行负载均衡tomcat1,tomcat2

cas的组播集群修改步骤:

1.修改cas.properties中的host.name,这个值可以保证产生的ticket是全局唯一的 ;

2.修改web.xml 增加 <distributable /> ;

3.ticket的外部存储,可以应用jpa,ehcache,memcache等方法参考相关的文章;

4.修改ticketGrantingTicketCookieGenerator.xml 文件中

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas"  />

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas"  p:cookieDomain="cas.test.com"/>

5.修改warnCookieGenerator.xml文件中的

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas"  />

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas"   p:cookieDomain="cas.test.com"/>

进行4,5两步的修改为了让tomcat1产生的cookie能够被tomcat2所读取。

6.tomcat session复制,关于tomcat的session复制集群。

关于以组播的方式构建tomcat集群,则tomcat的server.xml的配置如下:

将 <Engine name="Catalina" defaultHost="localhost" >

改为 <Engine name="Catalina" defaultHost="localhost" jvmRoute="t105"> 其中jvmRoute 这个参数要全局唯一,即要集群中的所有服务器的配置是唯一的。

并在下面

<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->

增加如下配置:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<!--
<Manager className="org.apache.catalina.ha.session.DeltaManager"
	   expireSessionsOnShutdown="false"  
	   notifyListenersOnReplication="true"/> 这种是all to all 的复制-->
<!-- 这种是主从式的复制 -->
<Manager className="org.apache.catalina.ha.session.BackupManager" 
	expireSessionsOnShutdown="false"  
	notifyListenersOnReplication="true"  
	mapSendOptions="6"/>  
	<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"/>
		<!--如果auto值报错,则将值改为运行tomcat的机器ip地址  -->
		<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
			address="auto"
			port="4001"
			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.TcpPingInterceptor" staticOnly="true" />
		<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
			<Member className="org.apache.catalina.tribes.membership.StaticMember" port="4000" host="10.1.0.100"
				uniqueId="{10,1,0,100,0,0,0,0,0,0,0,0,0,0,0,0}" />
			<Member className="org.apache.catalina.tribes.membership.StaticMember" port="4000" host="10.1.0.101"
				uniqueId="{10,1,0,101,0,0,0,0,0,0,0,0,0,0,0,0}" />    
		</Interceptor>
	  -->

		<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
	</Channel>

	<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
		 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/> 
		 
	<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>

每个tomcat中都需要配置,但是需要保证jvmRoute值不同。对于tomcat运行在windows系统上,则配置至此完毕,将tomcat运行即可看到相关的组播信息。但是如果tomcat是运行在linux系统,则需要进行如下的设置,因为linux默认是不开启组播服务的,可以通过

1./sbin/ifconfig -a 查看相应的服务器的网卡是否支持组播,如果输出  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

则表示网卡支持组播,如果不支持,则需要重新编译linux内核重新安装系统,这个我们就不考虑了。

2.如果从第一步,可知网卡支持组播,则执行如下命令(这个命令的执行需要root账号来执行):

/sbin/route add –net 224.0.0.0  netmask 240.0.0.0  dev eth0

这样linux配置至此完毕,运行tomcat可看到相关的组播信息。

发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)

表情