알프레스코

알프레스코 클러스터링 구성 정리

naucika 2014. 7. 24. 17:33

 주의사항 

  • 각 서버간의 DATETIME 동기화를 반드시 확인하자. (안맞음 헛짓거리 함)
  • 커뮤니케이션 버젼은 캐시 클러스터링을 지원하지 않는다. (4.1X 기준) 물론, ehcache 를 사용할 수 없고, default 캐시를 사용하도록 되어 있다. 즉슨, 아래 가이드대로 ehcache 설정을 하더라도 동작하지 않는다. 동작하도록 하는 방법은 enterprise 에서 일부 관련 소스와 jar 들을 빼오면 되나, 여기선 언급하지 않는다. :-)
  • OS의 max fil open (ulimt) 반드시 확인할 것. (1024 보다 작으면 캐시가 비워진다)

 /shared/classes/alfresco/extension/ehcahe-custom.xml

  • 각 로컬서버 하위 캐싱을 RMI로 동기화 한다.
  • 캐싱자체가 동기화 되는것이 아니라, 로컬 캐시자체가 변경되면, 다른 서버쪽의 캐시로 Brodcast 한다. 
  • 캐시 클러스터를 구성하지 않으면, 1번기에 데이터가 변경되도, 2번기에 데이터에선 보이지 않는 문제 발생함. (즉슨, 이중화시엔 필수 요소라 하겠다.)

<cacheManagerPeerListenerFactory

        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 

        properties="socketTimeoutMillis=10000" 

    />

    <!--

         To control the cache peer URLs, replace the 'cacheManagerPeerListenerFactory' with the following

         and set the properties statically, in alfresco-global.properties or via java -D options.

         Only the hostName needs to be set as the others have sensible defaults.

    -->


    <cacheManagerPeerListenerFactory

        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 

        properties="hostName=${alfresco.ehcache.rmi.hostname},

                    port=${alfresco.ehcache.rmi.port},

                    remoteObjectPort=${alfresco.ehcache.rmi.remoteObjectPort},

                    socketTimeoutMillis=${alfresco.ehcache.rmi.socketTimeoutMillis}" 

    />

■ /shared/classes/alfresco-global.properties


1번기 (근데 java property 파일은 highlight 를 뭘로 줘야 하나.. :-)

###Cluster Configs Alfresco Node 1

alfresco.cluster.name=AlfrescoCluster

alfresco.jgroups.defaultProtocol=TCP

alfresco.tcp.start_port=7800

#Add the list of alfresco nodes here-dns or ip

alfresco.tcp.initial_hosts=10.2.41.21[7800],10.2.41.22[7800]

# ip or dns of local alfresco server

alfresco.ehcache.rmi.hostname=10.2.41.21

# Should be same as alfresco.ehcache.rmi.hostname

alfresco.rmi.services.external.host=10.2.41.22

alfresco.ehcache.rmi.port=40001

alfresco.ehcache.rmi.remoteObjectPort=45001



###Cluster Configs Alfresco Node 2

alfresco.cluster.name=AlfrescoCluster

alfresco.jgroups.defaultProtocol=TCP

alfresco.tcp.start_port=7800

#Add the list of alfresco nodes here-dns or ip

alfresco.tcp.initial_hosts=10.2.41.21[7800],10.2.41.22[7800]

# ip or dns of local alfresco server

alfresco.ehcache.rmi.hostname=10.2.41.21

# Should be same as alfresco.ehcache.rmi.hostname

alfresco.rmi.services.external.host=10.2.41.22

alfresco.ehcache.rmi.port=40001

alfresco.ehcache.rmi.remoteObjectPort=45001



####Alfresco repository extension for ####

index.tracking.cronExpression=0/5 * * * * ?

index.recovery.mode=AUTO

index.tracking.reindexLagMs=5000

index.tracking.maxTxnDurationMinutes=10

index.tracking.maxTransactionsPerLuceneCommit=100

index.recovery.maximumPoolSize=5

index.tracking.disableInTransactionIndexing=false

■ Apache 로드 밸런싱

  • apache 는 mode_jk 보단 설정이 편리하고, sticky 세션쿠키를 복제하며, 관리콘솔을 지원하는 mode_proxy 를 사용했습니다.
  • 세부설정에 대해서는 모두 파악하진 않았지만, alfresco 관련문서에서 가이드 해준 방법대로 셋팅했습니다.
  • ProxyPassResverse 라는 항목이 있는데, redirect 와 관련된 제어를 하는 것 같은데, 아직 모르겠음.
  • http://localhost/balancer-manager 를 통해, 현재 클러스터 현황을 모니터링 할 수 있으며, 가상 테스트를 할 수 있습니다.
<VirtualHost *:80>
                ProxyRequests off
                ServerName 10.2.41.21
                DocumentRoot /var/www
                <Directory />
                                Options FollowSymLinks
                                AllowOverride None
                </Directory>
                <Directory /var/www/>
                                Options Indexes FollowSymLinks MultiViews
                                AllowOverride None
                                Order allow,deny
                                allow from all
                </Directory>
                 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
                <Directory "/usr/lib/cgi-bin">
                                AllowOverride None
                                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                                Order allow,deny
                                Allow from all
                </Directory>

                 ErrorLog logs/error.log
                
                # Possible values include: debug, info, notice, warn, error, crit,
                # alert, emerg.
                LogLevel warn
                CustomLog logs/access.log combined    
        <Proxy balancer://alfresco-cluster>
                # alfresco node1
                BalancerMember ajp://10.2.41.21:8009 min=10 max=100 route=node1 loadfactor=1
                # alfresco node2
                BalancerMember ajp://10.2.41.22:8009 min=20 max=200 route=node2 loadfactor=2
                 # Security "technically we aren't blocking
                # anyone but this the place to make those
                # changes
                Order Deny,Allow
                Deny from none
                Allow from all
                 # Load Balancer Settings
                # We will be configuring a simple Round
                # Robin style load balancer.  This means
                # that all alfresco nodes take an equal share of
                # of the load.
                #ProxySet lbmethod=byrequests
                ProxySet stickysession=JSESSIONID|jsessionid
         </Proxy>

        # balancer-manager
        # This tool is built into the mod_proxy_balancer
        # module and will allow you to do some simple
        # modifications to the balanced group via a gui
        # web interface.
        <Location /balancer-manager>
                SetHandler balancer-manager
                 # I recommend locking this one down to your
                # your office
                Order deny,allow
                Allow from all
        </Location>

        # Point of Balance
        # This setting will allow to explicitly name the
        # the location in the site that we want to be
        # balanced, in this example we will balance "/" 
        # or everything in the site.
        ProxyPass /balancer-manager !  
    ProxyPass /alfresco balancer://alfresco-cluster/alfresco
    ProxyPass /share balancer://alfresco-cluster/share
 </VirtualHost>


■ 톰캣 클러스터 및 FailOver 구성

  • http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html 를 참조하자.
  • tomat7 기준으로, 세션클러스터를 구성함.
    • /alf_home/conf/server.xml
    • 기본 셋팅으론, 모든 세션 객체가 클러스터 되지 않기 때문에, 확장 컨피그레이션을 사용함.
    • tomcat guide 에서는 receiver 를 auto 로 셋팅하게 되어 있는데 그렇게 하면, 각각 로컬이 물리질 않습니다. 자신의 IP로 셋팅해야 합니다.
    • was-app 에 (share/alfresco) web.xml 에 <distributable/> 을 반드시 명시해 줘야 합니다.
  • share/alfresco 서버를 분리했다면, share 를 기준으로 failover 를 구성한다. (어차피 alfresco 는 ticket 발행함.)
<!-- apache ajp port matching -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
<!-- cluster setting -->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
                 channelSendOptions="8">

          <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"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
                      address="10.2.41.21" 
                      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"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" 
                    tempDir="/tmp/war-temp/" 
                    deployDir="/tmp/war-deploy/" 
                    watchDir="/tmp/war-listen/" 
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>