高可用笔记(8) CAS集群

简介: CAS是耶鲁大学提供的一套开源的单点登录系统。这里用ehcache做同步缓存实现CAS集群。

测试环境

host1 192.168.30.1
host2 192.168.30.2

准备环境

在host1和host2的tomcat目录下(/var/lib/tomcat/webapps/)部署cas.war

高可用方案

cas_ha

在cas/WEB-INF/classes下新建文件ehcache-replicated.xml:


<ehcache name="ehCacheTicketRegistryCache" 
         updateCheck="false" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

   <diskStore path="java.io.tmpdir/cas"/>

    <!-- Automatic Peer Discovery
       <cacheManagerPeerProviderFactory 
            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
            properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"
            propertySeparator="," />
       -->
   
   <!-- Manual Peer Discovery -->
<!-- 注意,这里配置远程ehcache主机的ip -->
   <cacheManagerPeerProviderFactory 
                class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
                properties="peerDiscovery=manual,
                rmiUrls=//remotehost:40001/org.jasig.cas.ticket.ServiceTicket|//remotehost:40001/org.jasig.cas.ticket.TicketGrantingTicket" />
  
               <!-- 这里配置本机ehcache的port -->
   <cacheManagerPeerListenerFactory 
            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
            properties="port=40001" />
</ehcache>

备份原来的/cas/WEB-INF/spring-configuration/ticketRegistry.xml,重新建一个ticketRegistry.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to Jasig under one or more contributor license
    agreements. See the NOTICE file distributed with this work
    for additional information regarding copyright ownership.
    Jasig licenses this file to you under the Apache License,
    Version 2.0 (the "License"); you may not use this file
    except in compliance with the License.  You may obtain a
    copy of the License at the following location:

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
    <description>
        Configuration for the EhCache TicketRegistry which stores the tickets in a distributed EhCache and cleans
        them out as specified intervals.
    </description>

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache-replicated.xml" />
        <property name="shared" value="false" />
        <property name="cacheManagerName" value="ticketRegistryCacheManager" />
    </bean>

    <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.EhCacheTicketRegistry"
            p:serviceTicketsCache-ref="serviceTicketsCache"
            p:ticketGrantingTicketsCache-ref="ticketGrantingTicketsCache" />

    <bean id="abstractTicketCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean" abstract="true">
        <property name="cacheManager" ref="cacheManager" />
        <property name="diskExpiryThreadIntervalSeconds" value="0" />
        <property name="diskPersistent" value="false" />
        <property name="eternal" value="false" />
        <property name="maxElementsInMemory" value="10000" />
        <property name="maxElementsOnDisk" value="0" />
        <property name="memoryStoreEvictionPolicy" value="LRU" />
        <property name="overflowToDisk" value="false" />
        <property name="bootstrapCacheLoader">
            <ref local="ticketCacheBootstrapCacheLoader"/>
        </property>
    </bean>
    
    <bean id="serviceTicketsCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean" parent="abstractTicketCache">
        <description>
            Service Tickets (ST) and Proxy Tickets are only valid for short amount of time (default is 10 seconds), and
            most often are removed from the cache when the ST is validated.  The ST cache must be replicated quickly
            since validation is expected within a few second after its creation.  The CAS instance validating the ST may
            not be one that created the ST, since validation is a back-channel service-to-CAS call that is not aware of
            user session affinity.  Synchronous mode is used to ensure all CAS nodes can validate the ST.
        </description>
        <property name="cacheName" value="org.jasig.cas.ticket.ServiceTicket" />
             
        <property name="cacheEventListeners">
            <ref local="ticketRMISynchronousCacheReplicator"/>
        </property>
        
        <!-- 
            The maximum number of seconds an element can exist in the cache without being accessed. 
            The element expires at this limit and will no longer be returned from the cache. 
            The default value is 0, which means no TTI eviction takes place (infinite lifetime).
         -->
        <property name="timeToIdle" value="0" />
        
        <!-- 
            The maximum number of seconds an element can exist in the cache regardless of use. 
            The element expires at this limit and will no longer be returned from the cache. 
            The default value is 0, which means no TTL eviction takes place (infinite lifetime).
        -->
        <property name="timeToLive" value="300" />
    </bean>
    
    <bean id="ticketGrantingTicketsCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean" >
        <description>
            Ticket Granting Tickets (TGT) are valid for the lifetime of the SSO Session.  They become invalid either
            by expiration policy (default 2 hours idle, 8 hours max) or by explicit user sign off via /cas/login.
            The TGT cache can be replicated slowly because TGT are only manipulated via web user started operations
            (mostly grant service ticket) and thus benefit of web session affinity.
        </description>
        
        <property name="cacheName" value="org.jasig.cas.ticket.TicketGrantingTicket" />
              
        <property name="cacheEventListeners">
            <ref local="ticketRMIAsynchronousCacheReplicator"/>
        </property>
        
        <!-- 
            The maximum number of seconds an element can exist in the cache regardless of use. 
            The element expires at this limit and will no longer be returned from the cache. 
            The default value is 0, which means no TTL eviction takes place (infinite lifetime).
            
            For this sample configuration, 2 hours of inactivity before ticket granting tickets 
            are expired automatically
        -->
         
        <property name="timeToIdle" value="7201" />
        
        <!-- 
            The maximum number of seconds an element can exist in the cache without being accessed. 
            The element expires at this limit and will no longer be returned from the cache. 
            The default value is 0, which means no TTI eviction takes place (infinite lifetime).
         -->
        <property name="timeToLive" value="0" />
    </bean>
    
    <bean id="ticketRMISynchronousCacheReplicator" class="net.sf.ehcache.distribution.RMISynchronousCacheReplicator">
        <constructor-arg name="replicatePuts" value="true"/> 
        <constructor-arg name="replicatePutsViaCopy" value="true"/> 
        <constructor-arg name="replicateUpdates" value="true"/>  
        <constructor-arg name="replicateUpdatesViaCopy" value="true"/>  
        <constructor-arg name="replicateRemovals" value="true"/>       
    </bean>
    
    <bean id="ticketRMIAsynchronousCacheReplicator" class="net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator" parent="ticketRMISynchronousCacheReplicator">
        <constructor-arg name="replicationInterval" value="10000"/>  
        <constructor-arg name="maximumBatchSize" value="100"/>       
    </bean>
    
    <bean id="ticketCacheBootstrapCacheLoader" class="net.sf.ehcache.distribution.RMIBootstrapCacheLoader">
        <constructor-arg name="asynchronous" value="true"/>  
        <constructor-arg name="maximumChunkSize" value="5000000"/>  
    </bean>
            
</beans>

在/cas/WEB-INF/lib下加入jars:

cas-server-integration-ehcache-3.5.2.1.jar
ehcache-core.jar

重启两台主机的tomcat,done!

如果是源码编译

在cas-server-webapp的pom.xml中加入:

    <dependency>
      <groupId>org.jasig.cas</groupId>
      <artifactId>cas-server-integration-ehcache</artifactId>
      <version>${project.version}</version>
    </dependency>

然后重新打包,done!

目录
相关文章
|
6月前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
438 0
|
4月前
|
存储 数据库
zookeeper 集群环境搭建及集群选举及数据同步机制
zookeeper 集群环境搭建及集群选举及数据同步机制
72 2
|
4月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
|
6月前
|
缓存 NoSQL Java
Redis缓存高可用集群
Redis缓存高可用集群
|
存储 缓存 NoSQL
Redis的高可用实现方案:哨兵与集群
Redis的高可用实现方案:哨兵与集群
|
NoSQL Java Redis
Redisson集群管理工具、对Redis节点的操作
Redisson集群管理工具、对Redis节点的操作
290 1
|
存储 移动开发 NoSQL
微服务轮子项目(29) -Redis 单机、主从复制、哨兵、cluster集群、持久化方案(下)
微服务轮子项目(29) -Redis 单机、主从复制、哨兵、cluster集群、持久化方案(下)
84 0
|
NoSQL Redis 数据安全/隐私保护
微服务轮子项目(29) -Redis 单机、主从复制、哨兵、cluster集群、持久化方案(上)
微服务轮子项目(29) -Redis 单机、主从复制、哨兵、cluster集群、持久化方案
61 0
|
缓存 NoSQL 安全
缓存杂谈(六) Redis的高并发及主从集群入门
Redis的高并发及主从集群入门
101 0
缓存杂谈(六) Redis的高并发及主从集群入门
|
缓存 NoSQL 网络安全
23-微服务技术栈(高级):分布式缓存Redis哨兵集群
在上一节我们完成主从集群的搭建,虽然解决了读的压力,但是当集群主节点宕机时,系统架构有没有备用方案呢?如果没有是不是缓存层就直接失效、甚至异常了呢?在此基础之上我们可以借助于哨兵完成新主节点的选举,实现集群的自动恢复。
183 0