cancel
Showing results for 
Search instead for 
Did you mean: 

Cluster avec Alfresco Community

tpouzet
Champ in-the-making
Champ in-the-making
Bonjour,

J'ai lu attentivement la page sur le wiki sur Alfresco en mode Cluster :
http://wiki.alfresco.com/wiki/Cluster_Configuration_V2.1.3_and_Later

Mais j'ai encore quelques interrogations qui subsistent dans mon esprit, nottament au niveau des emplacements où les données sont sauvegardées. Je vous expose le problème brièvement :
Actuellement, j'ai deux emplacements depuis lesquels j'utilise Alfresco. Un serveur sur le site 1 tourne avec une DB en locale, Et les utilisateurs du site 2 accèdent  à ce serveur au travers du VPN. Le souçis, c'est que ce VPN est lent, et pour télécharger des fichiers depuis le site 2, ça rame. Je voudrais donc migrer vers une topologie comme celle présentée sur ce schéma :

[img]http://img836.imageshack.us/img836/5434/topologiegrappe.png[/img]



Cette topologie s'approcherait de celle présentée sur le wiki :

http://wiki.alfresco.com/current/images/9/91/Alfresco_LB_Diagram.png

Dans mes esprits, le comportement serait le suivant :
-Les utilisateurs se connectent à leur serveur Alfresco sur leurs sites.
-Ils accèdent à la DB commune à tous avec les fichiers communs à tous les sites
-Ils veulent un fichier, le téléchargent depuis le serveur Alfresco de leur site qui le possède en local, très rapidement donc.
-Si ils stockent des nouveaux fichiers, les fichiers sont uploadés sur le serveur Alfresco de leur site.

Ma question : qu'est-ce qu'il se passe avec la DB ? Sur le wiki il est écrit "L2 Cache Replication" et "Single, shared content store ". Pourtant actuellement les documents stockés se trouvent dans %Alfresco_root%/alf_data/ ! Où se trouveraient alors les documents dans une telle topologie ? L'idéal pour moi serait que les documents soient en deux endroits différents, synchronisés chaque nuit par exemple, ou quelque chose du genre. (La mise à l'échelle serait difficile avec une telle idée)

Enfin bref, c'est pas très clair dans ma tête et j'ai pas trop trouvé d'information sur ce comportement assez spécifique quand même. Enfin vous comprendrez que le souçis principal est d'avoir une copie locale à chaque site pour éviter les limitations du VPN !

je vous remercie de votre attention en tout cas !

Thibaut.
6 REPLIES 6

jeanjot
Confirmed Champ
Confirmed Champ
Bonjour

Vous avez aussi la possibilité de faire de la réplication de d'espace documentaire à partir d'un serveur maitre sur un serveur distant. Solution proposé par alfresco pour mettre à disposition des données sur une filiale ne possédant pas un débit suffisant.
ATTENTION, les données repliquées sont uniquement en lecture seules, la synchronisation étant a définir lors de la mise en place de la replication.

Je vous renvoie sur le wiki pour plus d'information :
http://wiki.alfresco.com/wiki/Replication_Service
et sur la documentation en ligne :
http://docs.alfresco.com/3.4/index.jsp

Walace25
Champ in-the-making
Champ in-the-making

Bonjour , stp est ce possible d'integrer REDIS a ALFRESCO ?

tpouzet
Champ in-the-making
Champ in-the-making
Merci pour la réponse rapide ! Je file lire toutes ces informations et me renseigner sur les CMIS de ce pas alors.

tpouzet
Champ in-the-making
Champ in-the-making
Bonjour,

Je suis toujours en train d'essayer de trouver une solution à mon problème de BP qui impacterait le moins les utilisateurs. Il y a quelque chose que j'ai du mal à cerner en rapport avec ces options de réplications. Vous dites qu'il faudra un maître et un esclave, où les données seraient en lecture seule. Il n'est pas possible d'envisager une configuration de pair à pair où les deux serveurs fourniraient un contenu identique, avec alf_data et la DB synchronisés +/- en temps réel ?
J'ai essayé en environnement de test de mettre en oeuvre le scénario Maître/Esclave, avec deux Alfresco possédant chacun leurs BDD locale situés sur le même réseau. J'ai ajouté l'id dans share-config-custom.xml sur l'un de ces noeuds, et j'ai relancé les serveurs. J'ai ensuite été sur l'interface d'administration dans la section "Créer une tâche de réplication". Il m'est alors pas possible de sélectionner ma "Cible de transfert". Y-a-t-il un endroit où je dois spécifier explicitement qui est le Maître et qui est l'esclave, ou est-ce que spécifier "read-only" sur le serveur esclave suffit ?

Egalement, pour reprendre le schéma que j'ai introduit dans mon premier post, je n'arrive pas à déterminer comment spécifier l'accès à une DB commune sur les deux serveurs. J'ai cru comprendre qu'il n'était pas possible de donner accès à une unique DB à deux serveurs au même moment, car il n'était possible de binder 3306 qu'une seule fois. J'ai tenté de spécifier dans le fichier alfresco-global.properties d'un des serveurs l'utilisation de la DB de l'autre serveur déjà installé, mais sans surprise ça n'a pas fonctionné :
12:13:50,299  WARN  [hibernate.cfg.SettingsFactory] Could not obtain connection metadata
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (null,  message from server: "Host x.x.x.x' is not allowed to connect to this MySQL server")
D'autant plus je pense que pour que cette topologie fonctionne correctement, il faudrait que les répertoires alf_data sur les deux serveurs soient parfaitement synchronisés.

En imaginant l'utilisation d'outils "externes" qui synchroniseraient de manière brutale à la fois la DB et le répertoire des données, est-ce qu'on risquerait pas de voir des effets de bord indésirables apparaître ?

Je vous remercie en tout cas pour votre intérêt et pour avoir lu totu ce que j'avais à dire 🙂

Thibaut.

Pour information,

rguinot
Confirmed Champ
Confirmed Champ
Pour résumer rapidement l'affaire, il y a plusieurs options en effet :

* Si vous avez une instance "principale" (par exemple au siège), et une instance secondaire distante, et que vous voulez donner une copie lecture seule de quelques sous parties de l'arborescence aux utilisateurs du site secondaire, afin d'en accélérer la lecture/l'accès, le replication service est en effet tout a fait approprié.

Dans ce cas, vous avez deux instances indépendantes (2 contentstores, 2 bases de données, 2 jeu d'indexes lucene), et vous envoyez de manière régulière du contenu de l'un vers l'autre, via la définition de transfer targets et de jobs de réplication. Voir http://wiki.alfresco.com/wiki/Transfer_Service#Creating_a_new_Transfer_Target_Through_Alfresco_Share... à mon avis pour l'étape qui vous manque.

Cela suppose qu'il y ait bcp + de lectures que d'écritures sur le site secondaire pour etre bénéfique. les ecritures peuvent etre redirigées vers le serveur source si nécessaire. 

* Si vous souhaitez que les 2 instances soient parfaitement synchronisées, et accessible en lecture / écriture des 2 cotés, des solutions de clustering peuvent être envisagées (http://wiki.alfresco.com/wiki/Cluster_Configuration_V2.1.3_and_Later#Scenarios), mais attention : ce n'est pas forcément adapté si les serveurs sont séparés par des grandes "distances". L'invalidation des caches ehcache à travers le cluster en pâtira.

En ce qui concerne la base de données, il y a confusion entre le port de bind 3306, qui est uniquement côté serveur, et les clients. En l'occurrence, il vous manque sans doute un GRANT ( voir http://dev.mysql.com/doc/refman/5.1/en/grant.html), pour autoriser l'accès par le réseau depuis le deuxième serveur. mais la encore, s'il y a une forte latence d'accès à la base depuis le deuxième site, les performances sur ce site en pâtiront.

N'oubliez pas également que chaque noeud doit posséder son propre jeu indépendant d'indexes lucene. Ceux ci sont reconstruit de chaque côté en suivant la table des transactions et en rejouant/réindexant périodiquement les noeuds concernés par  les transactions non-locales.

Ces 2 solutions sont très différentes et répondent à des besoins différents. Et aucune des 2 ne dispense d'avoir des bons backups, indépendants, testés, planifiés, offline, etc (voir http://wiki.alfresco.com/wiki/Backup_and_Restore).

tpouzet
Champ in-the-making
Champ in-the-making
J'ai mesuré la latence du réseau entre les deux sites en pleine journée, sur une mesure de cinq minutes j'ai 30.5ms de latence (71ms RTT), en imaginant mettre en oeuvre NTP il ne devrait pas y avoir de souçis à ce niveau là je pense, et les index devraient se synchroniser correctement.

J'ai continué à me documenter sur le sujet et un peu mieu cerné le mode de fonctionnement de Alfresco. J'estime que faire fonctionner Alfresco en Cluster serait la meilleur option disponible pour ce que je veux faire : Les utilisateurs pourront, de où qu'ils se trouvent, télécharger et uploader (deux activités équivalentes) ce qu'ils désirent sur le serveur, avec un débit acceptable (a compter du fait que la synchro sur les données s'est faite). L'exemple cité dans le wiki me semble donc très approprié, et je souhaiterais déjà le faire marcher en environnement de test. Bon comme beaucoup de choses en informatique, ça marche rarement du premier coup !

Pour situer rapidement le contexte, deux machines virtuelles tournent sous CentOS 5.6 à jour, sans serveur graphique, sur le même sous réseau IP.

OS : CentOS 5.6
Alfresco : Community 3.4.d
DB : MySQL
Réseau IP : 192.168.0.162 et 192.168.0.161, netmask : 255.255.255.224 (Netmask correspond au réseau 192.168.0.160 ==> 192.168.0.192)
Serveur A : 192.168.0.161 = "alfresco3"
Serveur B : 192.168.0.162 = "alfresco2"
Sur chacunes, j'ai installé Alfresco Community 3.4.d, en gardant les paramètres par défaut et ne faisant pas de bidouilles particulières, installation standart donc.
L'installation est faite dans ce répertoire : /srv/alfresco-3.4.d/ et j'utilise MySQL comme DB (la DB fournie par défaut, encore une fois).
Tout premièrement, j'ai crée un répertoire que je considère comme contenant le contenu partagé sur chaque serveur à cet emplacement : /share/alfresco-3.4.d/alf_data/
Sur le serveur 192.168.0.162 j'ai monté le répertoir /share/alfresco-3.4.d/alf_data dans /share/alfresco-3.4.d/alf_data avec NFS :

/etc/exports

# fsid=0 signifie que c'est le repertoire root
/share/ alfresco2/255.255.255.224(rw,fsid=0,root_squash,async)
/share/alfresco-3.4.d/alf_data/ alfresco2/255.255.255.224(rw,root_squash,async)
==>
[thibaut@alfresco3 ~]$ sudo mount -t nfs4 alfresco3:/alfresco-3.4.d/alf_data/ /share/alfresco-3.4.d/alf_data/

Une fois cette configuration de départ faite, j'ai suivit le wiki sur les configurations. A ce stage, les login, upload de fichiers marchent parfaitement sur chacun des serveurs. Les évènements sont loggés dans la db ( select * from alf_content_data ; ). Je commence donc avec ce premier fichier modifié pour spécifier la synchronisation des index lucenes :

/srv/alfresco-3.4.d/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/repository.properties
 Repository configuration
repository.name=alfresco3
# Directory configuration
dir.root=./alf_data
dir.contentstore=${dir.root}/contentstore
dir.contentstore.deleted=${dir.root}/contentstore.deleted
dir.auditcontentstore=${dir.root}/audit.contentstore
# The location for lucene index files
dir.indexes=${dir.root}/lucene-indexes
# The location for index backups
dir.indexes.backup=${dir.root}/backup-lucene-indexes
# The location for lucene index locks
dir.indexes.lock=${dir.indexes}/locks
# Is the JBPM Deploy Process Servlet enabled?
# Default is false. Should not be enabled in production environments as the
# servlet allows unauthenticated deployment of new workflows.
system.workflow.deployservlet.enabled=false
# ######################################### #
# Index Recovery and Tracking Configuration #
# ######################################### #
#
# Recovery types are:
#    NONE:     Ignore
#    VALIDATE: Checks that the first and last transaction for each store is represented in the indexes
#    AUTO:     Validates and auto-recovers if validation fails
#    FULL:     Full index rebuild, processing all transactions in order.  The server is temporarily suspended.
index.recovery.mode=VALIDATE
# FULL recovery continues when encountering errors
index.recovery.stopOnError=false
index.recovery.stopOnError=false
index.recovery.maximumPoolSize=5
# Set the frequency with which the index tracking is triggered.
# For more information on index tracking in a cluster:
#    http://wiki.alfresco.com/wiki/High_Availability_Configuration_V1.4_to_V2.1#Version_1.4.5.2C_2.1.1_an...
# By default, this is effectively never, but can be modified as required.
#    Examples:
#       Never:                   * * * * * ? 2099
#       Once every five seconds: 0/5 * * * * ?
#       Once every two seconds : 0/2 * * * * ?
#       See http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
index.tracking.cronExpression=0/5 * * * * ?
index.tracking.adm.cronExpression=${index.tracking.cronExpression}
index.tracking.avm.cronExpression=${index.tracking.cronExpression}
# Other properties.
index.tracking.maxTxnDurationMinutes=10
index.tracking.reindexLagMs=1000
index.tracking.maxRecordSetSize=1000
index.tracking.maxTransactionsPerLuceneCommit=100
index.tracking.disableInTransactionIndexing=false
# Index tracking information of a certain age is cleaned out by a scheduled job.
# Any clustered system that has been offline for longer than this period will need to be seeded
# with a more recent backup of the Lucene indexes or the indexes will have to be fully rebuilt.
# Use -1 to disable purging.  This can be switched on at any stage.
index.tracking.minRecordPurgeAgeDays=30

# Reindexing of missing content is by default 'never' carried out.
# The cron expression below can be changed to control the timing of this reindexing.
# Users of Enterprise Alfresco can configure this cron expression via JMX without a server restart.
# Note that if alfresco.cluster.name is not set, then reindexing will not occur.
index.reindexMissingContent.cronExpression=* * * * * ? 2099

# Change the failure behaviour of the configuration checker
system.bootstrap.config_check.strict=true

# The name of the cluster
#   Leave this empty to disable cluster entry
alfresco.cluster.name=alftest
[…]

Ce qui semble important à mes yeux dans ce fichier :
index.tracking.cronExpression=0/5 * * * * ?
index.recovery.mode=VALIDATE sur alfresco3
index.recovery.mode=FULL sur alfresco2

alfresco.cluster.name=alftest

J'ai ensuite modifié le second fichier spécifié dans le wiki pour la replication du contenu

/srv/alfresco-3.4.d/tomcat/shared/classes/alfresco/extension/replicating-content-services-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>
   <!–
    This file is not included in the application context by default.
    If you include this file, please ensure that you review the sample
    beans contained here.
    –>

   <bean id="localDriveContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
      <constructor-arg>
         <value>./alf_data/</value>
      </constructor-arg>
   </bean>
   <bean id="networkContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
      <constructor-arg>
         <value>/share/alfresco-3.4.d/alf_data/</value>
      </constructor-arg>
   </bean>
   <bean id="fileContentStore" class="org.alfresco.repo.content.replication.ReplicatingContentStore" >
      <property name="primaryStore">
         <ref bean="localDriveContentStore" />
      </property>
      <property name="secondaryStores">
         <list>
            <ref bean="networkContentStore" />
         </list>
      </property>
      <property name="inbound">
         <value>true</value>
      </property>
      <property name="outbound">
         <value>true</value>
      </property>
      <property name="retryingTransactionHelper">
         <ref bean="retryingTransactionHelper"/>
      </property>
   </bean>
</beans>


Les lignes qui me semblent importantes sur ce fichier :
<bean id="localDriveContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
==> <value>./alf_data/</value>

<bean id="networkContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
==> <value>/share/alfresco-3.4.d/alf_data/</value>

Une fois ces manipulations faites, j'ai renommé le fichier ehcache-custom.xml.sample.cluster en ehcache-custom.xml mais je n'ai pas touché à son contenu. Il spécifie l'@Mcast 230.0.0.1 mais c'est la@Mcast par défaut donc je suppose que de ne pas y toucher devrait aller.

/srv/alfresco-3.4.d/tomcat/shared/classes/alfresco/extension/ehcache-custom.xml
<ehcache>
    <diskStore
      path="java.io.tmpdir"/>

    <!–
       The 'heartbeatInterval' property is the only one used for the JGroups-enabled implementation
    –>
    <cacheManagerPeerProviderFactory
        class="org.alfresco.repo.cache.AlfrescoCacheManagerPeerProviderFactory"
        properties="heartbeatInterval=5000,
                    peerDiscovery=automatic,
                    multicastGroupAddress=230.0.0.1,
                    multicastGroupPort=4446"
    />

    <cacheManagerPeerListenerFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
    />
    <!–
         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.
    –>
[…]

Une fois ces modifications faites, j'ai d'abord démarré alfresco3 où se trouve index.recovery.mode=VALIDATE, puis alfresco2 où se trouve index.recovery.mode=FULL. Une fois ce stade atteint, Un problème majeur se pose : Impossible d'utiliser aucun des connecteurs : ftp, webdav, http. Mes étapdes de troubleshoot :
[thibaut@alfresco3 ~]$ sudo lsof -nPi | grep java
java      2545    root   17u  IPv6  12220       TCP *:52036 (LISTEN)
java      2545    root   38u  IPv6  12222       TCP *:8080 (LISTEN)
java      2545    root   43u  IPv6  13236       TCP 127.0.0.1:39121->127.0.0.1:8080 (ESTABLISHED)
java      2545    root   44u  IPv6  13228       TCP 127.0.0.1:8080->127.0.0.1:39121 (ESTABLISHED)
java      2545    root   45u  IPv6  12477       TCP *:8009 (LISTEN)
java      2545    root  117u  IPv6  12478       TCP 127.0.0.1:8005 (LISTEN)
java      2545    root  237u  IPv6  12274       TCP *:34828 (LISTEN)
java      2545    root  247u  IPv6  12295       TCP 127.0.0.1:50500 (LISTEN)
java      2545    root  248u  IPv6  12296       TCP *:50508 (LISTEN)
java      2545    root  251u  IPv6  12342       TCP *:38940 (LISTEN)
java      2545    root  255u  IPv6  12310       TCP 127.0.0.1:33378->127.0.0.1:3306 (ESTABLISHED)
java      2545    root  256u  IPv6  12312       TCP 127.0.0.1:33379->127.0.0.1:3306 (ESTABLISHED)
java      2545    root  257u  IPv6  12314       TCP 127.0.0.1:33380->127.0.0.1:3306 (ESTABLISHED)
java      2545    root  258u  IPv6  12316       TCP 127.0.0.1:33381->127.0.0.1:3306 (ESTABLISHED)
java      2545    root  259u  IPv6  12318       TCP 127.0.0.1:33382->127.0.0.1:3306 (ESTABLISHED)
java      2545    root  260u  IPv6  12320       TCP 127.0.0.1:33383->127.0.0.1:3306 (ESTABLISHED)
java      2545    root  261u  IPv6  12322       TCP 127.0.0.1:33384->127.0.0.1:3306 (ESTABLISHED)

[thibaut@alfresco3 ~]$ watch tail /srv/alfresco-3.4.d/tomcat/logs/catalina.out
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable
WARN : org.alfresco.wcm.client.util.impl.GuestSessionFactoryImpl - WQS unable to connect to repository: Introuvable

J'obsèrve toutes les deux secondes une nouvelle ligne dans le log de tomcat, toujours la même. J'ai été vérifier la validité du fichier wcmqs-api.properties, qui semble correct à mes yeux (on y retrouve les deux secondes) :

/srv/alfresco-3.4.d/tomcat/webapps/wcmqs/WEB-INF/classes/alfresco/wcmqs-api.properties
#
# WCM QS configuration properties
#
wcmqs.api.alfresco=http://localhost:8080/alfresco
wcmqs.api.user=admin
wcmqs.api.password=*******

wcmqs.api.alfresco.cmis=%{wcmqs.api.alfresco}/service/cmis
wcmqs.api.alfresco.webscript=%{wcmqs.api.alfresco}/service/api/

#Type of asset factory to use. Either "cmis" or "webscript" (case-sensitive)
wcmqs.api.assetFactoryType=webscript
#wcmqs.api.assetFactoryType=cmis


wcmqs.api.repositoryPollMilliseconds=2000
wcmqs.api.websiteCacheSeconds=300
wcmqs.api.sectionCacheSeconds=60

En analysant étape par étape mes modification, je constate que l'erreur vient probablement du fichier replicating-content-services-context.xml car lorsque je le vire, et relance le serveur, ça remarche :
[thibaut@alfresco3 ~]$ sudo mv /srv/alfresco-3.4.d/tomcat/shared/classes/alfresco/extension/replicating-content-services-context.xml /srv/alfresco-3.4.d/tomcat/shared/classes/alfresco/extension/replicating-content-services-context.xml.sample
[thibaut@alfresco3 ~]$ /etc/init.d/alfresco restart
=> connexion à http://alfresco3:8080/alfresco/ fonctionne correctement.


Après relecture des tutoriaux et mes maigres tentatives de compréhension des mécanismes en jeu, je n'arrive donc pas à mettre en place cette architecture. Est-ce que vous voyez une grosse bêtise dans mes démarches de configurations et plus particulièrement dans ce fichier replicating-content-services-context.xml ? Sachant que j'ai aussi essayé avec la configuration :
<bean id="localDriveContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
==> <value>/srv/alfresco-3.4.d/alf_data/</value>

Je vous remercie pour votre patience et intérêt en tout cas !

Thibaut.

Sources :
http://www.slideshare.net/alfresco/06192008-high-availability-clustering-with-alfresco
http://wiki.alfresco.com/wiki/Cluster_Configuration_V2.1.3_and_Later