Opencms: replicación de índices de Solr

Nosotros tenemos una configuración de un maestro donde la gente edita y dos esclavos para servir las webs de OpenCms. El problema que nos encontramos es que en el disco compartido donde tienen los índices de Solr varias instancias de OpenCms (1 del maestro y 2 de los esclavos) intentaban manipular el mismo índice, y esto daba problemas de bloqueo para hacer los updates y commits. Además si un maestro hace las modificaciones, los esclavos no se enteran de las modificaciones. También había un problema con el cacheado de los esclavos, que no se enteran de los cambios en los contenidos del maestro y no actualizan las caches, por que cachean aunque la tengas desactivado y a tamaño cero.

La solución ha sido complicada pero efectiva.Ehmos replicado el índice Solr Online del maestro en los esclavos, y definiendo un servlet para que los esclavos se enteren de las actualizaciones en el maestro. Todo está basado en la configuración de las realizaciones de Apache Solr (http://wiki.apache.org/solr/SolrReplication) y la clase de OpenCms OpenCmsSolrHandler.

Paso a detallar la configuración del maestro:

– Instalamos un módulo con unas pequeñas modificaciones de CmsSolrIndex.java y una nueva clase OpenCmsHandleSolrReplicationHandler.java creada por nosotros (si alguien tiene interés que contacte con nosotros)

– Configuramos la replicación en WEB-INF/solr/conf/solrconfig.xml dentro de OpenCms con la información de la wiki:

[code]

<requestHandler name=»/replication» class=»solr.ReplicationHandler»>

<lst name=»master»>

<str name=»replicationAfter»>commit</str>

<str name=»replicationAfter»>startup</str>

</lst>

[/code]

– configuramos WEB-INF/web.xml un servlet con nuestra clase OpenCmsSolrReplicationServlet .

 

La configuración de los esclavos es más sencilla.

– Configuracmos el índice en  WEB-INF/config/opencms-search.xml

[code]

<directory>index_esclavoID</directory>

[/code]

– Configuramos la replicación en WEB-INF/solr/conf/solrconfig.xml

[code]

<requestHandler name=»/replication» class=»sold.ReplicationHandler»>

<lst name=»slave»>

<str name=»masterURL»>http://IP:PUERTO/replication</str>

<str name=»pollInterval»>00:00:20</str>

</lst>

</requestHandler>

[/code]

Con esto hemos logrado que los índices se actualicen sin bloqueos ni problemas.