Pregunta

HELLO SERFICIOS TÉCNICOS,

Asumamos que tenemos un sitio web (PHP) con millones de visitantes al mes y ejecutamos un índice SOLR en el sitio web con 4 millones de documentos alojados. SOLR se está ejecutando en 4 servidores separados donde un servidor es el maestro y se replican otros 3 servidores.

Hay puede insertar miles de documentos en SOLR cada 5 minutos. Y además de eso, el usuario puede actualizar su cuenta, que también debe activar una actualización de SOLR.

Estoy buscando una estrategia segura para reconstruir el índice rápido y seguro sin perder ningún documento. Y tener una estrategia de delta / actualización de segura . He pensado en una estrategia y quiero compartirlo con expertos aquí para escuchar su opinión y si debo ir por este enfoque o si podrían aconsejar algo (totalmente) diferente.

Solr DataImport

Para todas las operaciones, quiero usar un controlador de importación de datos. Quiero mezclar datos y delta importación en un archivo de configuración como el dataimporthandlerdeltlaqueryviaflimport . Estamos utilizando una base de datos MySQL como DataSource.

Índice de reconstrucción

para reconstruir el índice que tengo en cuenta lo siguiente; Creamos un nuevo núcleo llamado 'Reindex' cerca del núcleo 'Live'. Con DataImportHandler, reconstruimos completamente todo el conjunto de documentos (4 millones de documentos), lo que demora aproximadamente 1-2 horas en total. En el índice en vivo, todavía hay algunas minutas algunas actualizaciones, inserciones y eliminaciones.

Después de la reconstrucción, que duró aproximadamente 1-2 horas, el nuevo índice aún no está actualmente actualizado. Para que el retraso sea más pequeño, hacemos una importación 'Delta' contra el nuevo núcleo para comprometer todos los cambios de las últimas 1-2 horas. Cuando se hace esto, que hace un intercambio de núcleos. El controlador de importación 'Delta' normal que corre cada minuto elegirá este nuevo núcleo.

que comete actualizaciones a la núcleo en vivo

Para mantener nuestro núcleo en vivo en la pista, ejecutamos la importación Delta cada minuto. Debido al intercambio central, el núcleo de Reindex (que ahora es el núcleo en vivo) se rastreará en mantenido actualizado. Estoy adivinando que realmente no debería ser un problema si este índice se retrasa durante unos minutos porque DATAImport.properties también se intercambiarán? El Delta-Import ha superado estos minutos de retraso, pero debe ser posible.

Espero que entiendas mi situación y mi estrategia y podríamos aconsejar si lo estoy haciendo de la manera correcta en tus ojos. También me gustaría saber si hay cuellos de botella en los que no pensé. Estamos ejecutando SOLR versión 1.4.

Alguna pregunta que tengo es, ¿qué pasa con la replicación? Si el servidor maestro intercambia el núcleo, ¿cómo manejan los salves?

¿Y hay algún riesgo con perder documentos al intercambiar, etc.?

¡Gracias de antemano!

¿Fue útil?

Solución

¡Buena (y dura) pregunta!

La importación completa es una operación muy pesada, en general, es mejor ejecutar las consultas delta para actualizar solo su índice a los últimos cambios en su RDMS.Obtuve por qué intercambio el Maestro cuando necesita hacer una importación completa: mantendrá actualizado el núcleo en vivo utilizando Delta-Import, mientras que la importación completa se está ejecutando en el nuevo núcleo, ya que toma dos horas.Suena bien, siempre y cuando la importación completa no se use con frecuencia.

Con respecto a la replicación, me aseguraría de que no haya ninguna replicación en curso antes de intercambiar el núcleo maestro.Para obtener más detalles sobre cómo funciona la replicación, puede echar un vistazo a la solr wiki si no lo has hecholo hecho todavía.

Además, me aseguraría de que no haya ningún delta-importación que se ejecute en el núcleo en vivo antes de intercambiar el núcleo maestro.

Otros consejos

Tenemos una situación ligeramente modificada a nuestro fin. Hay dos PortPortandlers DataImportlers, uno para la importación completa, otra para la importación delta. La importación Delta es provocada por un cron cada 3 horas y tarda minutos en completarse. La importación completa de aproximadamente 10 m documentos toman ~ 48hrs (¡loco!). Una gran parte de esto implica la latencia de la red, ya que una gran cantidad de datos se recupera de una tabla MySQL para cada documento. Estas dos mesas residen en dos servidores MySQL diferentes y no se pueden unir.

Tenemos un núcleo 'en vivo', que es el que tiene importaciones de Delta. Presentamos otro núcleo 'reconstruido' y realizamos un índice completo que tarda ~ 48 horas para terminar. En este momento, mantenemos una pista de todos los documentos que se han actualizado / eliminado del núcleo 'en vivo', y luego realicemos una importación de Delta en el núcleo 'reconstruido', para que ambos sean del mismo estado. En un día normal, una vez que ambos núcleos están en el mismo estado, los intercambiaríamos y serviríamos desde la reconstrucción del núcleo. (¿Quién supervisará que el núcleo de la reconstrucción se realiza la indexación completa y también ha aplicado parches delta?)

A veces, querríamos tener tanto el núcleo "en vivo" como la "reconstrucción" al mismo tiempo para "pruebas AB". En aquellos tiempos, tanto el núcleo "VIVO" como "Rebuild" tendrían importaciones de Delta por coherencia, y ambos estarían sirviendo. Sobre la base del resultado, nos gustaría mantener uno y eliminar el otro intercambiando.

Para que toda esta configuración completa esté operativamente estable, planeamos introducir un proceso de monitor que verificaría si el núcleo 'reconstrucción' está indexando o realizado con eso. Si se ha indexado, el proceso del monitor lo actualizaría con los documentos Delta y activar la indexación del Delta CRON para ambos núcleos. Tras la finalización de la fase AB, se descargaría uno de los núcleos y el otro núcleo intercambió. Los crons adicionales se desactivarían entonces.

Hay algunas partes más móviles en este diseño y la confiabilidad del proceso del monitor es fundamental para la operación suave. ¿Alguna sugerencia / alternativas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top