paint-brush
4 desafíos de rendimiento de Elasticsearch y cómo resolverlospor@rocksetcloud
4,031 lecturas
4,031 lecturas

4 desafíos de rendimiento de Elasticsearch y cómo resolverlos

por Rockset5m2024/05/16
Read on Terminal Reader

Demasiado Largo; Para Leer

En este blog, analizamos soluciones para desafíos comunes de rendimiento de Elasticsearch a escala, incluida la indexación lenta, la velocidad de búsqueda, el tamaño de índices y fragmentos, y la tenencia múltiple.
featured image - 4 desafíos de rendimiento de Elasticsearch y cómo resolverlos
Rockset HackerNoon profile picture


Escalando Elasticsearch

Elasticsearch es un motor de búsqueda y análisis NoSQL que es fácil de usar para análisis de registros, búsqueda de texto, análisis en tiempo real y más. Dicho esto, bajo el capó Elasticsearch es un sistema complejo y distribuido con muchas palancas que accionar para lograr un rendimiento óptimo.


En este blog, analizamos soluciones para desafíos comunes de rendimiento de Elasticsearch a escala, incluida la indexación lenta, la velocidad de búsqueda, el tamaño de índices y fragmentos, y la tenencia múltiple. Muchas soluciones surgen de entrevistas y debates con líderes de ingeniería y arquitectos que tienen experiencia práctica en la operación del sistema a escala.

¿Cómo puedo mejorar el rendimiento de la indexación en Elasticsearch?

Cuando se trata de cargas de trabajo que tienen un alto rendimiento de escritura, es posible que necesite ajustar Elasticsearch para aumentar el rendimiento de indexación. Proporcionamos varias prácticas recomendadas para tener recursos adecuados disponibles para la indexación, de modo que la operación no afecte el rendimiento de la búsqueda en su aplicación:


  • Aumente el intervalo de actualización : Elasticsearch pone a disposición nuevos datos para realizar búsquedas actualizando el índice. Las actualizaciones están configuradas para que se produzcan automáticamente cada segundo cuando un índice ha recibido una consulta en los últimos 30 segundos. Puede aumentar el intervalo de actualización para reservar más recursos para la indexación.


  • Utilice la API masiva : cuando se ingieren datos a gran escala, se sabe que el tiempo de indexación utilizando la API de actualización lleva semanas . En estos escenarios, puede acelerar la indexación de datos de una manera más eficiente en cuanto a recursos utilizando la API masiva. Incluso con la API masiva, conviene conocer la cantidad de documentos indexados y el tamaño total de la solicitud masiva para asegurarse de que no obstaculice el rendimiento del clúster. Elastic recomienda realizar una evaluación comparativa del tamaño masivo y, como regla general, es de 5 a 15 MB/solicitud masiva .


  • Aumentar el tamaño del búfer de índice : puede aumentar el límite de memoria para solicitudes de indexación pendientes por encima del valor predeterminado del 10 % del montón. Esto puede ser recomendable para cargas de trabajo con mucha indexación, pero puede afectar a otras operaciones que consumen mucha memoria.


  • Deshabilite la replicación: puede configurar la replicación en cero para acelerar la indexación, pero esto no se recomienda si Elasticsearch es el sistema de registro para su carga de trabajo.


  • Limite las inserciones in situ y las mutaciones de datos : las inserciones, actualizaciones y eliminaciones requieren que se reindexen documentos completos. Si está transmitiendo CDC o datos transaccionales a Elasticsearch, es posible que desee considerar almacenar menos datos porque entonces habrá menos datos para reindexar.


  • Simplifique la estructura de datos: tenga en cuenta que el uso de estructuras de datos como objetos anidados aumentará las escrituras y los índices. Al simplificar la cantidad de campos y la complejidad del modelo de datos, puede acelerar la indexación.

¿Qué debo hacer para aumentar mi velocidad de búsqueda en Elasticsearch?

Cuando sus consultas tardan demasiado en ejecutarse, puede significar que necesita simplificar su modelo de datos o eliminar la complejidad de la consulta. Aquí hay algunas áreas a considerar:


  • Cree uníndice compuesto : combine los valores de dos campos de baja cardinalidad para crear un campo de alta cardinalidad que se pueda buscar y recuperar fácilmente. Por ejemplo, podría combinar un campo con código postal y mes, si estos son dos campos que comúnmente filtra para su consulta.


  • Habilite el enrutamiento personalizado de documentos: Elasticsearch transmite una consulta a todos los fragmentos para devolver un resultado. Con el enrutamiento personalizado, puede determinar en qué fragmento residen sus datos para acelerar la ejecución de consultas. Dicho esto, conviene estar atento a los puntos de acceso al adoptar enrutamiento personalizado.


  • Utilice el tipo de campo de palabra clave para búsquedas estructuradas: cuando desee filtrar según el contenido, como una identificación o un código postal, se recomienda utilizar el tipo de campo de palabra clave en lugar del tipo de número entero u otros tipos de campos numéricos para una recuperación más rápida.


  • Aléjese de los objetos anidados y entre padres e hijos : las relaciones entre padres e hijos son una buena solución para la falta de compatibilidad con la unión en Elasticsearch y han ayudado a acelerar la ingesta y limitar la reindexación. Con el tiempo, las organizaciones llegan a límites de memoria con este enfoque. Cuando eso ocurra, podrá acelerar el rendimiento de las consultas realizando la desnormalización de los datos.

¿Cómo debo dimensionar los fragmentos e índices de Elasticsearch para escalar?

Muchos desafíos de escalamiento con Elasticsearch se reducen a la estrategia de fragmentación e indexación. No existe una estrategia única que se ajuste a todos los casos sobre cuántos fragmentos debe tener o qué tan grandes deben ser. La mejor manera de determinar la estrategia es ejecutar pruebas y evaluaciones comparativas en cargas de trabajo de producción uniformes. Aquí hay algunos consejos adicionales a considerar:


  • Utilice la API Force Merge : utilice la API Force Merge para reducir la cantidad de segmentos en cada fragmento. Las fusiones de segmentos se realizan automáticamente en segundo plano y eliminan los documentos eliminados. El uso de una combinación forzada puede eliminar manualmente documentos antiguos y acelerar el rendimiento. Esto puede consumir muchos recursos y, por lo tanto, no debería ocurrir durante el uso máximo.


  • Tenga cuidado con el desequilibrio de carga : Elasticsearch no tiene una buena forma de comprender la utilización de recursos por fragmento y tenerlo en cuenta al determinar la ubicación de los fragmentos. Como resultado, es posible tener fragmentos calientes. Para evitar esta situación, es posible que desee considerar la posibilidad de tener más fragmentos que notas de datos y fragmentos más pequeños que nodos de datos.


  • Utilice índices basados en el tiempo : los índices basados en el tiempo pueden reducir la cantidad de índices y fragmentos en su clúster en función de la retención. Elasticsearch también ofrece una API de índice de renovación para que pueda pasar a un nuevo índice según la antigüedad o el tamaño del documento para liberar recursos.

¿Cómo debo diseñar para multiinquilino?

Las estrategias más comunes para multiinquilino son tener un índice por cliente o inquilino o utilizar enrutamiento personalizado. A continuación le indicamos cómo puede sopesar las estrategias para su carga de trabajo:


  • Índice por cliente o inquilino: la configuración de índices separados por cliente funciona bien para empresas que tienen una base de usuarios más pequeña, de cientos a unos pocos miles de clientes, y cuando los clientes no comparten datos. También resulta útil tener un índice por cliente si cada cliente tiene su propio esquema y necesita mayor flexibilidad.


  • Enrutamiento personalizado: el enrutamiento personalizado le permite especificar el fragmento en el que reside un documento, por ejemplo, ID de cliente o ID de inquilino, para especificar la ruta al indexar un documento. Cuando se realiza una consulta basada en un cliente específico, la consulta irá directamente al fragmento que contiene los datos del cliente para obtener tiempos de respuesta más rápidos. El enrutamiento personalizado es un buen enfoque cuando tienes un esquema consistente entre tus clientes y tienes muchos clientes, lo cual es común cuando ofreces un modelo freemium.

¡A escalar o no escalar Elasticsearch!

Elasticsearch está diseñado para casos de uso de análisis de registros y búsqueda de texto. Muchas organizaciones que utilizan Elasticsearch para análisis en tiempo real a escala tendrán que hacer concesiones para mantener el rendimiento o la rentabilidad, incluida la limitación de la complejidad de las consultas y la latencia de la ingesta de datos. Cuando comienza a limitar los patrones de uso, su intervalo de actualización excede su SLA o agrega más conjuntos de datos que deben unirse, puede tener sentido buscar alternativas a Elasticsearch.


Rockset es una de las alternativas y está diseñado específicamente para la ingesta de datos de transmisión en tiempo real y consultas de baja latencia a escala. Aprenda cómo migrar desde Elasticsearch y explore las diferencias arquitectónicas entre los dos sistemas.