estamos diseñando la arquitectura de búsqueda para una aplicación web corporativa. Usaremos Lucene.net para esto. Los índices no serán grandes (aproximadamente 100.000 documentos), pero el servicio de búsqueda siempre debe estar actualizado y siempre actualizado. Habrá nuevos documentos agregados al índice todo el tiempo y búsquedas simultáneas. Como debemos tener una alta disponibilidad para el sistema de búsqueda, tenemos 2 servidores de aplicaciones que exponen un servicio WCF para realizar búsquedas e indexar (se está ejecutando una copia del servicio en cada servidor). El servidor luego usa la API de lucene.net para acceder a los índices.Sincronización de índices de Lucene.net en varios servidores de aplicaciones
El problema es, ¿cuál sería la mejor solución para mantener los índices sincronizados todo el tiempo? Hemos considerado varias opciones:
El uso de un servidor de indexación y teniendo el segundo servidor de acceso los índices a través de SMB: no puede hacerlo porque tenemos un único punto de fallo situación;
Indexación para ambos servidores, esencialmente escribiendo cada índice dos veces: probablemente un rendimiento malo, y la posibilidad de desincronización si, por ejemplo. el servidor 1 indexa OK y el servidor 2 se queda sin espacio en disco o lo que sea;
Usando SOLR o KATTA para ajustar el acceso a los índices: no, no podemos tener tomcat o ejecución similar en los servidores, solo tenemos IIS.
Almacenamiento del índice de la base de datos: me encontré con esto se puede hacer con la versión Java de Lucene (módulo JdbcDirectory), pero no pude encontrar nada similar para Lucene.net. Incluso si esto significara un pequeño golpe de rendimiento, optaríamos por esta opción porque resolvería limpiamente el problema de simultaneidad y sincronización con el desarrollo mínimo.
Uso de Lucene.net DistributedSearch contrib module: No pude archivar un solo enlace con documentación sobre esto. Ni siquiera sé, al mirar el código, qué hace este código, pero me parece que en realidad divide el índice en varias máquinas, que no es lo que queremos.
rsync y amigos, copiando los índices de ida y vuelta entre los 2 servidores: esto se siente harto y propenso a errores, y, si los índices crecen, podría llevar un tiempo, y durante este período estaríamos devolviendo datos corruptos o inconsistentes a los clientes, por lo que tendríamos que desarrollar alguna política de bloqueo ad hoc, que no queremos.
Entiendo que este es un problema complejo, pero estoy seguro de que mucha gente lo ha enfrentado anteriormente. Cualquier ayuda es bienvenida!
Sean, esta es actualmente nuestra opción de candidato. Estoy de acuerdo contigo y con ella en que parece ser la mejor elección. También estoy tratando de encontrar las fuentes de JdbcDirectory para ver si un puerto al servidor .NET + SQL sería factible. Mantendrá la pregunta abierta por un tiempo para ver si surgen nuevos enfoques, aceptará esta respuesta de lo contrario. –
Comprobé lo mismo una vez. No parecía valer la pena el esfuerzo, ya que hay un montón de cosas relacionadas con la transacción de BD que no es trivial para portar a .Net. También hubo quejas de velocidad reducida usando el material de JDBCDirectory. La fuente está en el proyecto Brújula - http://svn.compass-project.org/svn/compass/trunk/src/main/src/org/apache/lucene/store/jdbc/ –
Después de pensar un poco, esto es lo Veo como la solución más viable: cuando se recibe una solicitud de indexación/desinsecación, inserte una fila en una tabla de base de datos compartida que funcione como una cola. Implemente un servicio win32 simple que se ejecute en ambos servidores de aplicaciones y sondee la cola cada X segundos, indexando el contenido localmente. Cuando el contenido se indexa con éxito, el servicio marca el elemento como procesado, de lo contrario, sigue intentándolo. –