CAS负载均衡配置

阅读更多

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: 

...
   
DirectoryIndex index.html index.jsp   

...

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

ProxyRequests Off

    BalancerMember ajp://127.0.0.1:20009 loadfactor=1 route=jvm1
    BalancerMember ajp://127.0.0.1:30009 loadfactor=1 route=jvm2

其中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

         ServerAdmin [email protected]
         ServerName localhost
         ServerAlias localhost
         ProxyPass / balancer://cluster/ stickysession=JSESSIONID nofailover=Off
         ProxyPassReverse / balancer://cluster/

注意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):

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

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

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

 

配置CAS实现票据共享

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


    org.hibernate
    hibernate-entitymanager
    3.3.1.ga


    org.hibernate
    hibernate-commons-annotations
    3.3.0.ga


    org.hibernate
    hibernate-annotations
    3.3.0.ga


    org.hibernate
    hibernate
    3.2.4.sp1


    concurrent
    concurrent
    1.3.4


   commons-dbcp
   commons-dbcp
   1.2.2

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


       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">
   
        Configuration for the default TicketRegistry which stores the tickets in-memory and cleans them out as specified intervals.
   

   
   
       
   

   
       
       
           
               
               
           

       

       
           
                ${database.hibernate.dialect}
                update
           

       

   

            p:entityManagerFactory-ref="entityManagerFactory" />
   
   
   
       
       
       
       
       
       
       
       
       
       
          
   

    
   
   
    
   
   
            p:ticketRegistry-ref="ticketRegistry" />
    
            p:targetObject-ref="ticketRegistryCleaner"
        p:targetMethod="clean" />
    
            p:jobDetail-ref="jobDetailTicketRegistryCleaner"
        p:startDelay="20000"
        p:repeatInterval="5000000" />
   
       
           
               
           

       

   

以上大多数是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中增加一行:

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


               expireSessionsOnShutdown="false"
           notifyListenersOnReplication="true"/>
   
                    className="org.apache.catalina.tribes.membership.McastService"
            address="228.0.0.4"
            port="45564"
            frequency="500"
            dropTime="3000"
            mcastTTL="1"/>
                    className="org.apache.catalina.tribes.transport.nio.NioReceiver"
            address="auto"
            port="4000"
            autoBind="0"
            selectorTimeout="100"
            maxThreads="6"/>
       
         
       

       
       
   

               filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
   

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

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

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


历史上的今天:

CAS负载均衡配置——SSL篇 2009-08-06

随机文章:

CAS负载均衡配置——SSL篇 2009-08-06
CAS代理配置 2010-01-27
让CAS支持客户端自定义登陆页面——客户端篇 2009-03-23
让CAS支持客户端自定义登陆页面——服务器篇 2009-03-23
让CAS支持客户端自定义登陆页面——原理篇 2009-03-23

你可能感兴趣的:(Hibernate,Tomcat,Apache,Bean,quartz)