■ 주의사항
- 각 서버간의 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>
'알프레스코' 카테고리의 다른 글
MT(multi-tenancy) 환경에서의 bootstrap 문제. (0) | 2015.01.12 |
---|---|
알프레스코의 티켓이 이유없이 없어지거나, 401 오류가 자주 발생한다면? (0) | 2014.10.22 |
알프레스코에 OAuth2 인증을 붙여보자. (0) | 2014.08.12 |
알프레스코 로그인 Authentication Customizing (0) | 2014.07.29 |
알프레스코 ORACLE 파티셔닝 테스트 (0) | 2014.07.24 |