I've attached this to: https://issues.jasig.org/browse/CAS-750

Though we're currently still testing this setup, I believe we have a general 
setup for CAS 3.4.2 to run with Terracotta (assuming this will work with 4.x as 
well.) Though anyone's environment will differ somewhat, I'm assuming most 
people are running something similar to our setup (multiple nodes of CAS server 
with an external load balancer.) I'll list details below with some notes 
inline. I'm all ears for any suggestions or corrections.

Some notes though about Terracotta CAS support:

re: https://wiki.jasig.org/display/CASUM/Terracotta
I believe this documentation should be updated as CAS doest not come delivered 
with an /etc/terracotta directory

re: 
https://source.jasig.org/cas3/tags/cas-server-3.4.2/etc/terracotta/sample-terracotta-config.xml
Also, the sample setups are missing some pretty basic components IMHO and 
should be updated.

Background:
In our dev environment we run one instance CAS, not load balanced, and run 
Terracotta on the same machine.
In our test and production environments we run 2 machines per environment, with 
each machine running CAS server and Terracotta server. Load balancing is 
hardware based (CISCO ACE) and is not sticky.

Software versions:
CAS 3.4.2
Tomcat 5.5.27
Terracotta 3.2.1_1 (version tested with other products run with terracotta) 
Java jdk1.6.0_13

Important portions below are:
<tc-properties> This sets up how nodes will check one one another for 
keepalive. We do a 30s to allow for networking inconsistencies, etc.
<ha> Allows for the server nodes to see one another and configure themselves as 
the active or passive roles (first come first server in our setup).
<modules> The modules listed below I believe are critical for this to work 
properly. 
org.jasig.cas.ticket.ServiceTicketImpl.grantTicketGrantingTicket(..) write lock 
was missing from earlier versions of the default config.

Here's the file itself:
---tc-config.xml---
<?xml version="1.0" encoding="UTF-8"?>
<tc:tc-config 
xsi:schemaLocation="http://www.terracotta.org/schema/terracotta-4.xsd"; 
xmlns:tc="http://www.terracotta.org/config"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>

    <!-- NAU sample Terracotta Configuration for CAS -->

    <tc-properties>
      <!-- Network Active/Passive for failover from Active to Passive  -->
      <!-- The Nodes keeps tabs on each other to failover from Active to 
Passive -->
      <!-- 
http://www.terracotta.org/documentation/ga/product-documentation-16.html#50462727_19590
 -->
      <!-- L2 - L2 -->
      <!-- Max Time = (ping.idletime) + socketConnectCount * [(ping.interval * 
ping.probes) + (socketConnectTimeout * ping.interval)] -->
      <!-- 5000 + 5[ (3 * 1000) + (2 * 1000) ] = 5000 + 25000 = 30000 ms -->
      <!-- The health checker declares the node dead in 25 seconds -->
      <property name="l2.healthcheck.l2.ping.enabled"         value="true" />
      <property name="l2.healthcheck.l2.ping.idletime"        value="5000"  />
      <property name="l2.healthcheck.l2.ping.interval"        value="1000"  />
      <property name="l2.healthcheck.l2.ping.probes"          value="3"     />
      <property name="l2.healthcheck.l2.socketConnect"        value="true"  />
      <property name="l2.healthcheck.l2.socketConnectTimeout" value="2"     />
      <property name="l2.healthcheck.l2.socketConnectCount"   value="5"     />

      <!-- Terracotta-Server and Client-JVMs correspondences -->
      <!-- L2 - L1  L2 Terracotta Server L1 Client -->
      <!-- 5000 + 5[ (3 * 1000) + (2 * 1000) ] =5000 + 25000 = 30000 ms -->
      <!-- Terracotta server keeping tabs on client i.e. apache/tomcat 
shibboleth -->
      <!-- The health checker declares the client dead in 25 seconds -->
      <!-- Max Time = (ping.idletime) + socketConnectCount * [(ping.interval * 
ping.probes) + (socketConnectTimeout * ping.interval)] -->
      <property name="l2.healthcheck.l1.ping.enabled"         value="true"  />
      <property name="l2.healthcheck.l1.ping.idletime"        value="5000"  />
      <property name="l2.healthcheck.l1.ping.interval"        value="1000"  />
      <property name="l2.healthcheck.l1.ping.probes"          value="3"     />
      <property name="l2.healthcheck.l1.socketConnect"        value="true " />
      <property name="l2.healthcheck.l1.socketConnectTimeout" value="2"     />
      <property name="l2.healthcheck.l1.socketConnectCount"   value="5"     />

      <!-- Client-JVMs and Terracotta Server correspondences -->
      <!-- L1 - L2  L2 Terracotta Server L1 Client -->
      <!-- 5000 + 5[ (3 * 1000) + (2 * 1000) ] =5000 + 25000 = 30000 ms -->
      <!-- Client server keeping tabs on Terracotta Servers -->
      <!-- The health checker declares the client dead in 25 seconds -->
      <!-- Max Time = (ping.idletime) + socketConnectCount * [(ping.interval * 
ping.probes) + (socketConnectTimeout * ping.interval)] -->
      <property name="l1.healthcheck.l2.ping.enabled"         value="true"  />
      <property name="l1.healthcheck.l2.ping.idletime"        value="5000"  />
      <property name="l1.healthcheck.l2.ping.interval"        value="1000"  />
      <property name="l1.healthcheck.l2.ping.probes"          value="3"     />
      <property name="l1.healthcheck.l2.socketConnect"        value="true"  />
      <property name="l1.healthcheck.l2.socketConnectTimeout" value="2"     />
      <property name="l1.healthcheck.l2.socketConnectCount"   value="5"     />
        
      <property name="l2.nha.tcgroupcomm.reconnect.enabled" value="true" />
      <property name="l2.nha.tcgroupcomm.reconnect.timeout" value="15000" />
      <property name="l2.l1reconnect.enabled" value="true" />
      <property name="l2.l1reconnect.timeout.millis" value="15000" />
    </tc-properties>

    <servers>
        <!-- Replicate server entry for all nodes running cas/terracotta -->
        <server name="test1" host="XXX" bind="IP">
            <dso-port>9510</dso-port>
            <jmx-port>9520</jmx-port>
            <data>cluster/data</data>
            <logs>cluster/logs</logs>
            <dso>
              <persistence>
                <mode>permanent-store</mode>
              </persistence>
            </dso>
        </server>
        <!-- High Availability for multiple servers (used in DEV & TEST ENVs) 
-->        
        <ha>
            <mode>networked-active-passive</mode>
            <networked-active-passive>
                <election-time></election-time>
            </networked-active-passive>
        </ha>
    </servers>

    <clients>
        <logs>/cluster/clients</logs>

        <!-- Tomcat module is dependent on tomcat version
             Spring webflow and security also necessary -->
        <modules>
            <module name="tim-vector" version="2.6.3" 
group-id="org.terracotta.modules"/>
            <module name="tim-tomcat-5.5"/>
            <module name="tim-spring-webflow-2.0"/>
            <module name="tim-spring-security-2.0"/>
        </modules>
    </clients>

    <application>
        <dso>
            <web-applications>
                <web-application>cas</web-application>
            </web-applications>
            <roots>
                <!-- Defined Shared Roots -->
                <root>
                    <!--The In-Memory Ticket Registry-->
                    
<field-name>org.jasig.cas.ticket.registry.DefaultTicketRegistry.cache</field-name>
                </root>
                <root>
                    <!--The registered Services  -->
                    
<field-name>org.jasig.cas.services.DefaultServicesManagerImpl.services</field-name>
                </root>
            </roots>

            <locks>
                <!--Locks for the shared Tickets-->
                <named-lock>
                    <method-expression>* 
org.jasig.cas.ticket.registry.DefaultTicketRegistry.*(..)</method-expression>
                    <lock-level>write</lock-level>
                    <lock-name>ticketRegistryLock</lock-name>
                </named-lock>
                <named-lock>
                    <method-expression>* 
org.jasig.cas.ticket.AbstractTicket.updateState(..)</method-expression>
                    <lock-level>write</lock-level>
                    <lock-name>ticketWriteLock</lock-name>
                </named-lock>
                <named-lock>
                    <method-expression>* 
org.jasig.cas.ticket.AbstractTicket.*(..)</method-expression>
                    <lock-level>read</lock-level>
                    <lock-name>ticketReadLock</lock-name>
                </named-lock>
                <named-lock>
                    <method-expression>* 
org.jasig.cas.CentralAuthenticationServiceImpl.*(..)</method-expression>
                    <lock-level>write</lock-level>
                    <lock-name>casWriteLock</lock-name>
                </named-lock>
                <named-lock>
                    <method-expression>* 
org.jasig.cas.ticket.TicketGrantingTicketImpl.grantServiceTicket(..)
                    </method-expression>
                    <lock-level>write</lock-level>
                    <lock-name>tgtWriteLock2</lock-name>
                </named-lock>
                <named-lock>
                    <method-expression>* 
org.jasig.cas.ticket.TicketGrantingTicketImpl.expire(..)</method-expression>
                    <lock-level>write</lock-level>
                    <lock-name>tgtWriteLock2</lock-name>
                </named-lock>
               <named-lock>
                   <method-expression>* 
org.jasig.cas.ticket.ServiceTicketImpl.grantTicketGrantingTicket(..)
                   </method-expression>
                   <lock-level>write</lock-level>
                   <lock-name>tgtWriteLock2</lock-name>
               </named-lock>

                <!-- Service Registry Distribution Locks -->
                <named-lock>
                    <method-expression>* 
org.jasig.cas.services.DefaultServicesManagerImpl.findServiceBy(..)
                    </method-expression>
                    <lock-level>read</lock-level>
                    <lock-name>serviceFindReadLock</lock-name>
                </named-lock>
                <named-lock>
                    <method-expression>* 
org.jasig.cas.services.DefaultServicesManagerImpl.getAllServices(..)
                    </method-expression>
                    <lock-level>read</lock-level>
                    <lock-name>serviceReadLock</lock-name>
                </named-lock>
                <named-lock>
                    <method-expression>* 
org.jasig.cas.services.DefaultServicesManagerImpl.*(..)</method-expression>
                    <lock-level>write</lock-level>
                    <lock-name>serviceWriteLock</lock-name>
                </named-lock>
                <named-lock>
                    <method-expression>* 
org.jasig.cas.web.flow.GenerateServiceTicketAction.doExecute(..)
                    </method-expression>
                    <lock-level>write</lock-level>
                    <lock-name>stActionWriteLock</lock-name>
                </named-lock>
            </locks>

            <instrumented-classes>
                <include>
                    <class-expression>org.jasig.cas.ticket.*</class-expression>
                </include>
                <include>
                    
<class-expression>org.jasig.cas.ticket.support.*</class-expression>
                </include>
                <include>
                    
<class-expression>org.jasig.cas.authentication.principal.*</class-expression>
                </include>
                <include>
                    <class-expression>org.jasig.cas.util.*</class-expression>
                </include>
                <include>
                    
<class-expression>org.jasig.cas.authentication.*</class-expression>
                </include>
                <include>
                    
<class-expression>org.jasig.cas.services.RegisteredServiceImpl</class-expression>
                </include>
            </instrumented-classes>

        </dso>
    </application>

</tc:tc-config>
---tc-config.xml---


Raymond Walker
Software Systems Engineer Sr.
ITS Northern Arizona University
[email protected]
Phone 928-523-0334


-- 
You are currently subscribed to [email protected] as: 
[email protected]
To unsubscribe, change settings or access archives, see 
http://www.ja-sig.org/wiki/display/JSG/cas-user

Reply via email to