Escalando Elasticsearch
Elasticsearch es un motor de análisis y búsqueda NoSQL que es fácil de usar para análisis de registros, búsqueda de texto, análisis en tiempo actual y más. Dicho esto, bajo el capó, Elasticsearch es un sistema complejo y distribuido con muchas palancas para lograr un rendimiento óptimo.
En este weblog, analizamos las soluciones a los desafíos comunes de rendimiento de Elasticsearch a escala, incluida la indexación lenta, la velocidad de búsqueda, el tamaño de fragmentos e índices y la tenencia múltiple. Muchas soluciones se originan a partir de entrevistas y discusiones 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 deba ajustar Elasticsearch para aumentar el rendimiento de la indexación. Brindamos varias prácticas recomendadas para tener a mano los recursos adecuados para la indexación, de modo que la operación no afecte el rendimiento de búsqueda en su aplicación:
- Aumenta el intervalo de actualización: Elasticsearch pone a disposición nuevos datos para buscar al actualizar el índice. Las actualizaciones están configuradas para que ocurran 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.
- Utilizar el API masiva: al ingerir datos a gran escala, se sabe que el tiempo de indexación con la API de actualización tomar semanas. En estos escenarios, puede acelerar la indexación de datos de una manera más eficiente en el uso de recursos mediante la API masiva. Incluso con la API masiva, desea conocer la cantidad de documentos indexados y el tamaño whole de la solicitud masiva para asegurarse de que no obstaculice el rendimiento del clúster. Elastic recomienda comparar el tamaño masivo y, como regla common, es 5-15 MB/solicitud masiva.
- Aumento tamaño del búfer de índice: puede aumentar el límite de memoria para las solicitudes de indexación pendientes por encima del valor predeterminado del 10 % del almacenamiento dinámico. Esto puede recomendarse para cargas de trabajo de indexación pesada, pero puede afectar otras operaciones que requieren mucha memoria.
- Deshabilitar la replicación: puede establecer la replicación en cero para acelerar la indexación, pero no se recomienda si Elasticsearch es el sistema de registro para su carga de trabajo.
- Limite las modificaciones en el lugar y las mutaciones de datos: Las inserciones, actualizaciones y eliminaciones requieren la reindexación de documentos completos. Si está transmitiendo CDC o datos transaccionales en Elasticsearch, es posible que desee considerar almacenar menos datos porque entonces hay 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:
- Crear un índice compuesto: mix los valores de dos campos de cardinalidad baja para crear un campo de cardinalidad alta que se pueda buscar y recuperar fácilmente. Por ejemplo, podría fusionar un campo con el código postal y el mes, si estos son dos campos que suele filtrar para su consulta.
- Habilitar 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, desea estar atento a los puntos de acceso cuando adopte un enrutamiento personalizado.
- Utilizar el tipo de campo de palabra clave para búsquedas estructuradas: cuando desee filtrar según el contenido, como una ID 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.
- alejarse de objetos padre-hijo y anidados: Las relaciones padre-hijo son una buena solución para la falta de soporte de unión en Elasticsearch y han ayudado a acelerar la ingestión y limitar la reindexación. Eventualmente, las organizaciones alcanzan los límites de la memoria con este enfoque. Cuando eso ocurra, podrá acelerar el rendimiento de las consultas mediante la desnormalización de datos.
¿Cómo debo dimensionar 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 para todos sobre cuántos fragmentos debe tener o qué tan grandes deben ser sus fragmentos. La mejor manera de determinar la estrategia es ejecutar pruebas y puntos de referencia en cargas de trabajo de producción uniformes. Aquí hay algunos consejos adicionales a considerar:
- Utilizar el API de combinación forzada: use la API de combinación forzada para reducir la cantidad de segmentos en cada fragmento. Las fusiones de segmentos ocurren automáticamente en segundo plano y eliminan cualquier documento eliminado. 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.
- Cuidado con desequilibrio de carga: Elasticsearch no tiene una buena manera de comprender la utilización de recursos por fragmento y tener eso en cuenta al determinar la ubicación del fragmento. Como resultado, es posible tener fragmentos calientes. Para evitar esta situación, puede considerar tener más fragmentos que notas de datos y fragmentos más pequeños que nodos de datos.
- Utilizar índices basados en el tiempo: Los índices basados en el tiempo pueden reducir la cantidad de índices y fragmentos en su clúster según la retención. Elasticsearch también ofrece una API de índice de transferencia para que pueda pasar a un nuevo índice en función de la antigüedad o el tamaño del documento para liberar recursos.
¿Cómo debo diseñar para multiusuario?
Las estrategias más comunes para la tenencia múltiple son tener un índice por cliente o arrendatario o usar un enrutamiento personalizado. Así es como 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 las 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 es ú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 arrendatario, para especificar el enrutamiento al indexar un documento. Al realizar consultas basadas en un cliente específico, la consulta irá directamente al fragmento que contiene los datos del cliente para tiempos de respuesta más rápidos. El enrutamiento personalizado es un buen enfoque cuando tiene un esquema consistente entre sus clientes y tiene muchos clientes, lo cual es común cuando ofrece un modelo freemium.
¡Escalar o no escalar Elasticsearch!
Elasticsearch está diseñado para análisis de registros y casos de uso de búsqueda de texto. Muchas organizaciones que usan Elasticsearch para análisis en tiempo actual 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 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 actual y consultas de baja latencia a escala. Aprender como migrar fuera de Elasticsearch y explorar el diferencias arquitectónicas entre los dos sistemas.