`
yeminping
  • 浏览: 180530 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

(转)CAS负载均衡配置

    博客分类:
  • JAVA
阅读更多

http://fallenlord.blogbus.com/logs/43591716.html

总述

首先,我是用的CAS Server版本是3.3.1,Servlet容器是Tomcat

负载均衡方案以Apache Http Server作为前端均衡服务器,后台用多台Tomcat进行承载,此方案分为三步:

  1. 配置Apache和Tomcat实现请求转发(负载均衡)
  2. 配置CAS实现Ticket共享(或复制)
  3. 配置Tomcat实现Session复制,这里主要是为了复制Web  Flow的flowExecutionKey(CAS使用了Spring Web Flow)

以下分别实现这三步的配置

 

实现负载均衡

Apache配置

我们选用Apache Proxy Module来进行负载均衡,之所以不使用JK Module是因为后者配置较为复杂配置与部署
我们使用Apache Http服务器2.2.11版,因为2.2版本比2.0版本在Proxy模块上有较大的改进,2.0版的Proxy模块即使在后台宕机了之后依然会将请求进行转发,然后抛出502 Proxy异常,而2.2修复了这个问题
首先下载Apache  Http  Server  2.2.11  for  Linux版本:http://httpd.apache.org/,然后将其解压。configure安装:

./configure --prefix=/opt/tools/apache-httpd-2.2.11 --enable-rewrite=shared --enable-speling=shared --enable-so --with-included-apr --enable-ssl --enable-dav=share \
--enable-proxy=share --enable-proxy-connect=share --enable-proxy-ftp=share --enable-proxy-http=share --enable-proxy-ajp=share --enable-proxy-balancer=share

第一排--prefix请改为实际目录地址,第二排的是proxy相关模块,建议全部装上。然后执行make

make && make install

安装完成之后,到apache服务器的路径上(/opt/tools/apache-httpd-2.2.11),编辑conf/httpd.conf: 

...
<IfModule dir_module>   
DirectoryIndex index.html index.jsp   
</IfModule>
...

设定默认的转向稳健加入index.jsp,由于安装的时候内置了proxy相关的module,因此此处不必特别声明LoadModule。然后编辑conf/extra/httpd-vhosts.conf,首先添加Proxy配置:

ProxyRequests Off
<Proxy balancer://cluster>
    BalancerMember ajp://127.0.0.1:20009 loadfactor=1 route=jvm1
    BalancerMember ajp://127.0.0.1:30009 loadfactor=1 route=jvm2
</Proxy>

其中balancer://cluster是balancer协议下的虚拟路径,用于声明此Proxy的地址,cluster为自定义地址,可以随意设定。
BalancerMember的格式为:BalancerMember  [balancerurl]  url  [key=value  [key=value  ...]],其中balancerurl参数只有在BalancerMember元素不在Proxy标签内时才需要指定
按照我们的配置,第一个参数为后台应用(Tomcat)AJP协议的地址,这个地址对应着Tomcat中配置的AJP端口URL;  loadfactor表示权值,取值为1-100,表示有多少次请求转向此Member之后再跳到下一个Member; 最后route参数必须与Tomcat中Engine标签的jvmRoute属性对应配置与部署

接下来定义虚拟主机:

NameVirtualHost *:80
<VirtualHost *:80>
         ServerAdmin guolin@xxx.com
         ServerName localhost
         ServerAlias localhost
         ProxyPass / balancer://cluster/ stickysession=JSESSIONID nofailover=Off
         ProxyPassReverse / balancer://cluster/
</VirtualHost>

注意ProxyPass和ProxyPassReverse中的第二个地址必须与之前的Proxy声明的地址相同且以"/"结尾,第一个地址表示映射到根目录,即访问http://host/即可转向Proxy; stickysession表示Apache根据HTTP请求HEAD中的哪个属性来获取转向请求;  onfailover参数设为On时,若后台服务器宕机的话会中断会话,一般来说后台服务器不支持Session复制的话应该设为On
至此Apache Http服务器配置完成,但现在启动还没用,因为Tomcat尚未配置

Tomcat配置

建立两个Tomcat服务器实例,这里使用的是Tomcat  6.0.20,修改TOMCAT_HOME下的conf/server.xml文件,将其Engine标签后加上jvmRoute="jvm1"(另一个为jvm2):

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

然后设定AJP连接器的端口为我们配置Proxy的BalancerMember元素时设定的端口20009(另一个设为30009):

<Connector port="20009" protocol="AJP/1.3" redirectPort="20443" />

负载均衡即完成(如果需要的话,可以直接将HTTP/HTTPS的Connector都注释掉,仅留下AJP连接器)
先启动两个TOMCAT实例,然后启动Apache HTTP服务器,访问http://hostname/,多次刷新页面,可以观察到是轮流转向两个不同的Tomcat实例的停止其中一个Tomcat,再次多次刷新,发现仅仅只是转向那台正常的服务器了,至此负载均衡配置成功

注意
当其中一台Tomcat宕机以后再重启,Apache依然会认为此机器是死的,必须重启Apache才行

 

配置CAS实现票据共享

票据共享可以选用多种方式,CAS提供的基本都是基于Cache和DB的,任意选用一种,只要保证多个CAS实例间可以共享到票据即可,这里我们挑选了JPA方式
首先扩展之前我们需要确定一下我们的项目包含一些需要的依赖,主要是Hibernate的一些相关包,以下是POM.xml文件片段,也可以考虑使用更新的包,但请注意可能的依赖冲突:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.3.1.ga</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-commons-annotations</artifactId>
    <version>3.3.0.ga</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-annotations</artifactId>
    <version>3.3.0.ga</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate</artifactId>
    <version>3.2.4.sp1</version>
</dependency>
<dependency>
    <groupId>concurrent</groupId>
    <artifactId>concurrent</artifactId>
    <version>1.3.4</version>
</dependency>
<dependency>
   <groupId>commons-dbcp</groupId>
   <artifactId>commons-dbcp</artifactId>
   <version>1.2.2</version>
</dependency>

接下来只需要修改ticketRegistry.xml文件即可:

<?xml version="1.0" encoding="UTF-8"?>
<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"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    <description>
        Configuration for the default TicketRegistry which stores the tickets in-memory and cleans them out as specified intervals.
    </description>
    <!-- Ticket Registry -->
    <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.JpaTicketRegistry">
        <constructor-arg index="0" ref="entityManagerFactory" />
    </bean>
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="true" />
                <property name="showSql" value="${database.hibernate.show.sql}" />
            </bean>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">${database.hibernate.dialect}</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="entityManagerFactory" />
    <tx:annotation-driven transaction-manager="transactionManager" />
    <!-- 数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
        <property name="maxActive" value="40" />
        <property name="maxIdle" value="30" />
        <property name="maxWait" value="10000" />
        <property name="defaultAutoCommit" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="30" />
        <property name="logAbandoned" value="false" />  
    </bean>
    
    <!-- Ticket Registry -->
    <!-- 默认的ticket registry,放内存里CAS服务器端改造
    <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" />
    -->
    
    <!--Quartz -->
    <!-- TICKET REGISTRY CLEANER -->
    <bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"
        p:ticketRegistry-ref="ticketRegistry" />
    
    <bean id="jobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
        p:targetObject-ref="ticketRegistryCleaner"
        p:targetMethod="clean" />
    
    <bean id="triggerJobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
        p:jobDetail-ref="jobDetailTicketRegistryCleaner"
        p:startDelay="20000"
        p:repeatInterval="5000000" />
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref local="triggerJobDetailTicketRegistryCleaner" />
            </list>
        </property>
    </bean>
</beans>

以上大多数是Hibernate配置Spring的标准配置,其中所有的${...}符号均为Spring配置文件的替换符,接下来我们在cas.properties文件中增加这些替换符的配置:

database.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
database.driver=oracle.jdbc.driver.OracleDriver
database.url=jdbc:oracle:thin:@jx-iit-dev00.jx.baidu.com:1521:iitdb
database.username=sso
database.password=XXX
database.hibernate.show.sql=true

这样JPA的持久化就完成了

 

配置Tomcat实现Session复制

如果一个服务器是无状态的,那么它可以很容易的横向扩展。理论上CAS将票据存储分离到了数据库中应该已经是无状态的了,但很遗憾,CAS 3.x中使用了Spring Web Flow框架,这个框架要求使用一个flowExecutionKey来确定流程位置,它正是存储在Session中。因此我们无法实现SNA(Share Nothing Architecture)

首先配置CAS的web.xml中增加一行:

<distributable />

然后分别编辑两个Tomcat实例下的conf/server.xml,Engine元素下加入:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
    <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"
            mcastTTL="1"/>
        <Receiver
            className="org.apache.catalina.tribes.transport.nio.NioReceiver"
            address="auto"
            port="4000"
            autoBind="0"
            selectorTimeout="100"
            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=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

其中Membership元素的address和port是网络组播地址和端口,需要确认所在网络允许组播;
Receiver的port属性表示监听端口,如果两个应用在同一个机器上请设定两个不同的值

重新启动Tomcat,尝试登录,现在CAS应该可以正常工作了

如果需要配置SSL连接,可以参见我另一篇文章:CAS集群配置——SSL篇


历史上的今天:

分享到:
评论
1 楼 vil 2016-10-16  
请问CAS 单点登录加负载均衡后,httpClient timeout 什么回事呢??就是每次TCG的时候超时(子应用url是负载均衡IP哦)

相关推荐

    CAS JPA-Ticket存储解决负载均衡配置

    在本文档中,我们将讨论如何通过JPA(Java Persistence API)存储来配置CAS的Ticket共享,以支持负载均衡。 【实现负载均衡】 负载均衡通常通过在多个服务器之间分配网络流量来提高系统的响应时间和可用性。对于...

    CAS负载均衡实战

    配置Apache和Tomcat实现请求转发(负载均衡) 配置CAS实现Ticket共享(或复制) 配置Tomcat实现Session复制,这里主要是为了复制Web Flow的flowExecutionKey(CAS使用了Spring Web Flow)

    tomcat8 + nginx + memcached + cas 实现负载均衡的配置包

    #对 "/Dossm3RabbitMQConsumer/" 启用负载均衡 location /Dossm3RabbitMQConsumer/ { proxy_pass http://localhost:8086; #保留用户真实信息 proxy_set_header X-Real-IP $remote_addr; proxy_set_header ...

    负载均衡施工方案文档

    2. 配置文件数量较多,包括Apache的httpd.conf和httpd-vhosts.conf,以及负载均衡配置文件workers.properties和Tomcat的server.xml。而单点登录系统的配置文件较少,包括CAP.xml、cas.properties等。 3. Apache+...

    H3C 云计算CAS产品典型配置案例汇总集.rar

    H3C_CAS存储负载均衡操作指导书 H3C_CAS存储在线扩容操作指导书 H3C_CAS端口镜像特性操作指导书 H3C_CAS_SSV用户自助服务特性说明书 H3C_CAS_V2V离线迁移操作指导书 H3C_CAS_VDI虚拟桌面功能操作指导书 H3C_...

    东北证券投顾通Apache配置Weblogic负载均衡1

    ### 东北证券投顾通Apache配置Weblogic负载均衡详解 #### 一、概述 本文旨在详细介绍如何使用Apache作为中间件来实现Weblogic集群的负载均衡。通过本教程,您将了解整个配置流程,并掌握必要的技术要点。负载均衡...

    H3C-CAS-DRX特性开局指导V1.0.docx

    该配置包括 LB 相关配置、服务器负载均衡配置、CAS 平台动态资源扩展配置等。 二、LB 相关配置 LB(Load Balancer)是 DRX 解决方案中的关键组件,负责将业务流量分配到多个服务器上,提高业务系统的可用性和性能...

    exchange 2010 cas array adn nlb

    总而言之,Exchange 2010通过配置CAS数组和NLB技术,确保了邮件系统的高可用性和负载均衡,同时保证了客户端在服务中断时的无缝连接。这不仅提供了良好的用户体验,还增强了系统整体的可靠性和稳定性。在实施中,...

    Jboss集群配置

    在提供的文件中,`Jboss集群配置.doc`可能是详细的配置步骤文档,`Apache与Jboss负载均衡教程.pptx`可能包含Apache和JBoss集成的教程,而`jboss集群_jboss5[1].1_apache2.2.4.rar`则可能包含具体的配置示例和必要的...

    CAS4.2.7文档 html版本

    3. **性能优化**:负载均衡、缓存策略等提高系统性能的方法。 **协议与工作流程** "protocol"文件可能详细解释了CAS支持的各种认证协议的工作原理,如CAS Protocol、CAS v2、CAS v3以及CAS v4等。了解这些协议可以...

    CAS单点登录

    这通常涉及到配置共享的票证存储(如Redis或Memcached)以及负载均衡器。当一台服务器出现故障时,其他服务器可以接管工作,保证服务不间断。 7. CAS扩展性: CAS可以通过扩展点支持自定义认证策略、票证验证逻辑...

    cas spnego认证方式(即加ad域的windows主机应用免登录)高可用集群方案(目前来看国内第一份资料,本人探索出来的)

    4. **部署Nginx负载均衡器**:配置Nginx作为前端负载均衡器,负责将外部请求分发至后端的CAS服务器集群。 ##### 3.2 实现SPNEGO认证 1. **配置CAS支持SPNEGO**:在CAS服务器上启用SPNEGO认证机制,确保CAS能够接收...

    django+cas环境部署

    2. **Nginx**:作为前端的负载均衡器和反向代理服务器,Nginx监听外部端口8000,并将请求转发至内部Django应用所在的5050端口。此外,Nginx还负责反向代理Elasticsearch服务,使得外部可以直接通过Nginx的8081端口...

    sso/cas单点登录Java maven版 含服务端客服端

    3. 服务发现:如果有多台CAS服务器,可能需要配置负载均衡,确保服务的高可用性。 4. 定期清理:定期清理过期的票据和会话,防止安全风险。 5. 监控与日志:设置合理的监控指标,记录系统运行状态,便于问题排查和...

    CAS部署说明

    CAS(Central Authentication Service)是一种基于...对于大型系统,还需要考虑负载均衡、高可用性和灾难恢复等更复杂的配置。在实际部署中,应根据具体需求和环境调整这些配置,确保CAS能够满足组织的安全认证需求。

    基于java语言开发的cas单点登录系统

    例如,可以使用Nginx作为反向代理和负载均衡器,Eureka或Consul作为服务发现机制。 7. **微服务架构**:现代的CAS系统往往采用微服务架构,将不同的功能模块拆分成独立的服务,如认证服务、监控服务等。这种架构...

    cas单点登录

    8. **故障转移与高可用性**:为了提高系统的可靠性,可以设置多个CAS服务器,实现负载均衡和故障转移,确保即使单个服务器出现问题,其他服务器仍能继续提供服务。 综上所述,"cas 单点登录"涉及到了身份验证、系统...

    cas4.1最新版

    6. **性能优化**:可能对服务器性能进行了优化,如缓存机制、负载均衡支持等,以处理大量并发的认证请求。 7. **监控与日志**:提供详细的日志记录和监控工具,帮助管理员追踪和诊断系统问题。 8. **国际化支持**...

Global site tag (gtag.js) - Google Analytics