2012-03-17 11 views
6

Estoy utilizando el ensamblado NHibernate.Search y estoy buscando las mejores prácticas para usar esto con múltiples servidores web.NHibernate Search - Multiple Web Servers

Tenemos un amplio espacio en nuestros servidores web para manejar los índices que estamos generando, así que estoy pensando que la mejor ruta es tener los índices en cada servidor web. Luego, las clases que estoy indexando agregan una columna de versión. Mi única pregunta es si hago esto, NHibernate.Search será lo suficientemente inteligente como para extraer el último registro e indexarlo si digamos que el Servidor Web A actualizó el registro y el índice del Servidor Web B está desactualizado.

La otra opción es almacenar los índices en una ubicación de archivo compartido y extraer de ese recurso de red. Esto parece una solución menos que ideal, ya que no permite una gran redundancia.

¿Cómo están solucionando este problema otros con los índices NHibernate.Search y/o Lucene.NET?

Respuesta

3

En el mismo momento en que decidió colocar sus índices en diferentes máquinas introdujo el problema de "búsqueda distribuida". Cosas como la replicación, la redundancia, la administración, el monitoreo y la agregación de búsquedas se convierten en problemas importantes e interesantes que debe abordar.

Dicho esto, Solr es una de las soluciones recomendadas para el problema. Más, SolrNet puede ayudarlo a integrarlo con Nhibernate.

He usado ambos proyectos en combinación con Nhibernate y puede ser un poco confuso al principio, pero vale la pena más adelante.

En su caso, podría ejecutar Solr en sus servidores web.

+0

¡Hermoso! No me había tomado el tiempo de investigar a Solr todavía. Estaba pensando en la necesidad de "sincronizar estos cambios de NHibernate desde múltiples servidores a los índices de Lucene en múltiples servidores, por lo que probablemente tendrá que crear algo personalizado". Parece que "algo" ya se ha construido en Solr. –

+0

Me encontré con este [enlace sobre Solr] (http://www.lucidimagination.com/content/scaling-lucene-and-solr). Cita: "Para la mayoría de las aplicaciones, si comienza a desarrollar una solución escalable con Lucene, comienza a construir un motor de búsqueda de cerveza casera. Esto generalmente no es inteligente. ... hay una gran cantidad de trabajo para escalar correctamente Lucene máquinas múltiples. Solr ha hecho gran parte de esto, así como muchos otros trabajos de alto nivel, y es sabio aprovecharlo ". Gracias por señalarme en esta dirección! –

+0

Esto es muy bueno. Tomará esta ruta de ahora en adelante. Gracias por la sugerencia. – Brandon

0

su primera idea no funcionaría. los nodos de la granja no se comunican entre sí. dependen de los recursos compartidos como el caché de segundo nivel. Además de eso, no desea índices separados porque se des-sincronizarán.

La ubicación del archivo compartido es el camino a seguir. En lo que respecta a la redundancia, creo que la redundancia para el almacenamiento es absolutamente trivial, puede comenzar con una matriz de ataque

1

Utilizamos el enfoque maestro/esclavo compatible con NHibernate Search y Lucene.net.

Cada WebServer tiene una copia esclava del índice y no indexa.

Cada vez que un servidor web actualiza algo, envía un mensaje a un servicio de back-end (usamos Rhino ServiceBus con msmq) que hace la indexación (cargando el objeto actualizado y reindexándolo).

Cada 10 segundos (necesitamos búsquedas actualizadas, es una práctica común tener un período de gracia de hasta 30 minutos) el servidor web buscará nuevas versiones del índice y lo buscará si es necesario. Funciona bastante bien ya que los cambios son incrementales, por lo que solo se necesita una extracción del índice completo si hacemos una optimización o un re-índice total.

Si necesita una mejor velocidad, puede optimizarla mediante el uso de una implementación de ram en los servidores web, pero con búsquedas de comodines bastante complejas en un índice de 32 mb, seguimos estando muy por debajo de los 10 ms para las consultas.

Otra optimización sería hacer que el servidor web hiciera la indexación, pero solo envíe la copia incremental al backend para agregarla al índice maestro.Esto ahorraría al DB una llamada del servicio de backend aunque con cierta complejidad, ya que tienes que adentrarte en las entrañas de NHibernate Search/Lucene para hacerlo.