CAS集群分为服务器端集群和客户端集群。
CAS服务器端集群主要解决两个问题: session同步和Ticket(票据)仓库共享。
由于这里将CAS服务器端应用部署在tomcat上,因此session同步的配置方法和普通的tomcat session同步一样。这里给出一个例子:
在$CATALINA_HOME/conf/server.xml中的 节点添加如下的配置片段:
<Host>
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<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"
ttl="1"/>
<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"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
并给 节点添加一个 jvmRoute的属性,其属性值可以随意取,比如 jvm2, 只要保证在集群环境内是唯一的。
在$CATALINA_HOME/webapps/cas/WEB-INF/web.xml中添加
详细的tomcat集群配置细节参考 http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html 或
http://tomcat.apache.org/tomcat-6.0-doc/config/cluster.html
Ticket仓库同步的做法可以使用集中式缓存,比如memcached, redis; 或者使用数据库集中保存; 如果使用缓存插件,比如ehcached,jbossCache,则需要配置缓存同步策略。
ehcache集群方案一般有三种: RMI, jgroups, EhCache Server. cas-server-integration-ehcache模块给出了RMI集群方案。RMI集群方案有两种缓存同步模式: 自动和手动。 如果使用自动模式,则把ehcache-replicated.xml里面的<!-- Manual Peer Discovery -->
块注释掉,并根据实际情况修改<cacheManagerPeerProviderFactory>
节点内的multicastGroupAddress属性和multicastGroupPort属性。如果使用手动模式 ,请参考这里
打开$CATALINA_HOME/cas/WEB-INF/spring-configuration/ticketRegistry.xml, 将
<bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" />
换成
<bean id="cache" class="org.jasig.cas.util.JBossCacheFactoryBean"
p:configLocation="classpath:jbossTicketCacheReplicationConfig.xml" />
注意: classpath:和jbossTicketCacheReplicationConfig.xml之间不能用空格
将$CAS_HOME/cas-server-integration-jboss/src/test/resources/jbossTestCache.xml复制到$CATALINA_HOME/webapps/cas/WEB-INF/classes目录,并重命名为jbossTicketCacheReplicationConfig.xml.
打开jbossTicketCacheReplicationConfig.xml,将下面的片段注释掉:
<!-- <depends>jboss:service=TransactionManager</depends> -->
和
<!-- <attribute name="TransactionManagerLookupClass">org.jboss.cache.transaction.DummyTransactionManagerLookup</attribute> -->
找到<attribute name="ClusterConfig">
节点,根据实际情况修改<UDP>
子节点的mcast_addr属性和mcast_port属性(这是jbosscache缓存通信的广播地址和端口,确保不要和其他地址重叠)。 此外,如果你的集群节点都位于同一个子网, 那么将<UDP>
子节点的ip_ttl属性设置为“1”. 如果你的系统使用IPv6或bonding服务,那么你可能需要根据实际情况修改<UDP>
子节点的bind_addr属性。
下载jgroups-2.6.5.GA.jar, jboss-common-core-2.2.8.GA.jar, jbosscache-core-2.2.2.GA.jar , cas-server-integration-jboss-3.5.2.jar,并把他们复制到$CATALINA_HOME/webapps/cas/WEB-INF/lib目录。
参考资料:
[https://wiki.jasig.org/display/CASUM/Clustering+CAS][4]