Con motivo del último curso de administración de Alfresco que hemos
impartido, preparamos un taller relativo a la puesta en marcha de
cluster de Alfresco, con dos nodos. El
esquema es similar al expuesto en la wiki de Alfresco, con dos
instancias de Alfresco balanceadas por un Apache via mod-balancer y
mod_jk. Las dos instancias estaban en la misma máquina, lo cual
dificultó la configuración debido a que hubo que cambiar numerosos
puertos para el nodo 2, desde los puertos de los conectores http, ajp
y demás hasta los del rmi. Esta parte hubiese sido más sencilla con
dos máquinas virtuales, una con cada nodo, por ejemplo.
En la prueba de concepto se recogían las principales problemáticas:
- Utilizamos un almacén físico común para el repositorio. Además
probamos la característica de replicación del almacén de contenido
de los nodos en local: En nuestra prueba la simulamos con una
replicación a dos almacenes locales de contenidos. - En el esquema, utilizamos una base de datos común a ambas
instancias, es decir, no se protege contra errores de la base de datos. - El balanceador por su parte reduce la carga de los contenedores de
servlets (tomcat) y proporciona redundancia en caso de fallos. Antes
de poner el balancer, probamos con dos navegadores sobre los nodos
correspondientes subiendo contenidos en un nodo y refrescando en el
otro y buscando en el otro. - Replicamos la sesión del cliente y las cachés con ehcache y
jgroups: Es necesario activar ehcache-custom.xml en el directorio de
extensiones, y jgroups en alfresco-global.properties. - Sincronizamos los índices de Lucene: El almacén de índices local
de cada nodo y el cron de sincronización se definen en alfresco-global.properties.
Os dejo la estructura de directorios de nuestro esquema:
cesar@baco /opt/cluster $ tree -d -L 2 . |-- alfresco1 | |-- bin | |-- index | |-- index-backup | |-- licenses | `-- tomcat |-- alfresco2 | |-- bin | |-- index | |-- index-backup | |-- licenses | `-- tomcat `-- store |-- audit.contentstore |-- contentstore |-- contentstore.deleted `-- oouser
A continuación, un ejemplo del archivo de configuración global de
Alfresco, para el nodo 1. Para el resto de los nodos se necesita una
config similar y si están en la misma máquina hay que cambiar los puertos.
dir.root=/opt/cluster/store dir.indexes=/opt/cluster/alfresco1/index dir.indexes.backup=/opt/cluster/alfresco1/index-backup # Cluster alfresco.cluster.name=testcluster index.recovery.mode=AUTO # Jgroups alfresco.jgroups.defaultProtocol=TCP alfresco.tcp.initial_hosts=baco.zylk.net[7800],baco.zylk.net[7810] # Hibernate cache hibernate.cache.use_second_level_cache=false # Lucene index.tracking.cronExpression=0/5 * * * * ? index.recovery.mode=AUTO index.tracking.reindexLagMs=10000 index.tracking.maxTxnDurationMinutes=10 index.recovery.maximumPoolSize=5 index.tracking.maxTransactionsPerLuceneCommit=100 # # Sample database connection properties #------------- db.name=alfresco32ee db.username=alfresco db.password=alfresco db.host=localhost db.port=3306 # # External locations #------------- ooo.exe=/usr/bin/soffice img.root=/usr img.exe=/usr/bin/convert swf.exe=/usr/bin/pdf2swf # # MySQL connection #------------- db.driver=org.gjt.mm.mysql.Driver db.url=jdbc:mysql://${db.host}:${db.port}/${db.name} # # Disable CIFS and FTP # cifs.enabled=false ftp.enabled=false
Las pruebas son Alfresco Enterprise 3.2, ya que la
característica de jgroups no esta presente para la Community.
Es útil en la preparación trazar con log4j para ehcache y jgroups.
log4j.logger.org.alfresco.repo.jgroups=DEBUG log4j.logger.org.alfresco.enterprise.repo.cache.jgroups=DEBUG log4j.logger.net.sf.ehcache.distribution=DEBUG log4j.logger.org.alfresco.repo.node.index.IndexTransactionTracker=DEBUG log4j.logger.org.alfresco.repo.node.index.AVMRemoteSnapshotTracker=DEBUG
Enlaces:
- http://ecmarchitect.com/archives/2009/06/08/1001
- http://wiki.alfresco.com/wiki/Cluster_Configuration_V2.1.3_and_Later
La imagen pertenece a: