Comment puis-je améliorer les performances d'indexation de mon cluster Amazon Elasticsearch Service ?

Date de la dernière mise à jour : 10/08/2020

Je souhaite optimiser les opérations d'indexation dans Amazon Elasticsearch Service (Amazon ES) pour un débit d'ingestion maximal. Comment faire ?

Solution

Assurez-vous que la distribution des partitions de l'index que vous ingérez entre les nœuds de données est bien uniforme

Utilisez la formule suivante pour confirmer que les partitions sont distribuées uniformément :

Number of shards for index = k * (number of data nodes), where k is the number of shards per node

Par exemple, si l'index contient 24 partitions pour huit nœuds de données, Amazon ES attribue trois partitions à chaque nœud. Pour plus d'informations, consultez la section Démarrer avec Amazon Elasticsearch Service : de combien de partitions ai-je besoin ?

Augmenter la valeur refresh_interval à 60 secondes ou plus

Actualisez votre index Amazon ES pour rendre vos documents disponibles pour la recherche. Notez que l'actualisation de votre index nécessite les mêmes ressources que celles utilisées par l'indexation des threads.

L'intervalle d'actualisation par défaut est d'une seconde. Lorsque vous augmentez l'intervalle d'actualisation, le nœud de données effectue moins d'appels d'API. L'intervalle d'actualisation peut être plus court et plus rapide en fonction de la longueur de l'intervalle d'actualisation. Pour éviter les erreurs 429, une bonne pratique consiste à augmenter l'intervalle d'actualisation.

Remarque : l'intervalle d'actualisation par défaut est d'une seconde pour les index qui reçoivent ou plusieurs demandes de recherche au cours des 30 dernières secondes. Pour plus d'informations sur l'intervalle par défaut mis à jour, consultez _refresh API version 7.x sur le site Web Elasticsearch.

Définir le nombre de réplicas sur 0

Si vous prévoyez une indexation intensive, pensez à définir la valeur index.number_of_replicas sur « 0 ». Chaque réplica duplique le processus d'indexation. Par conséquent, la désactivation des réplicas améliorera les performances de votre cluster. Une fois l'indexation intensive terminée, réactivez les index répliqués.

Important : vous risquez de perdre des données si un nœud échoue alors que les réplicas sont désactivés. Désactivez les réplicas uniquement si vous pouvez tolérer la perte de données pendant une courte durée.

Recherche de la taille optimale de demande en bloc

Commencez par la taille des demandes en bloc de 5 Mio à 15 Mio. Ensuite, augmentez lentement la taille de la demande jusqu'à ce que les performances d'indexation cessent de s'améliorer. Pour plus d'informations, consultez Utilisation et dimensionnement des demandes en bloc sur le site Web d'Elasticsearch.

Remarque : certains types d'instances limitent les demandes en bloc à 10 Mio. Pour plus d'informations, consultez Limites de réseau.

Utilisez un type d'instance ayant des volumes de stockage d'instance SSD (comme I3)

Les instances I3 garantissent un stockage rapide, et local memory express (NVMe). Les instances I3 offrent des performances d'ingestion meilleures que les instances qui utilisent des volumes SSD (gp2) à usage général Amazon Elastic Block Store (Amazon EBS). Pour plus d'informations, consultez Exécuter les clusters de plusieurs péta-octets sur Amazon Elasticsearch Service à l'aide des instances I3.

Réduire la taille de la réponse

Pour réduire la taille de la réponse Amazon ES, utilisez le paramètre filter_path pour exclure les champs inutiles. Assurez-vous de ne pas filtrer un champ nécessaire pour identifier ou réessayer les demandes ayant échoué. Ces champs varient selon le client.

Dans l'exemple suivant, les champs index-name, type-name et took sont exclus de la réponse :

curl -X POST "es-endpoint/index-name/type-name/_bulk?pretty&filter_path=-took,-items.index._index,-items.index._type" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test2", "_id" : "1" } }
{ "user" : "testuser" }
{ "update" : {"_id" : "1", "_index" : "test2"} }
{ "doc" : {"user" : "example"} }

Pour plus d'informations, consultez Réduction de la taille des réponses.

Augmentez la valeur de index.translog.flush_threshold_size

Par défaut, index.translog.flush_threshold_size est défini sur 512 Mo. Cela signifie que le translog est vidé lorsqu'il atteint 512 Mo. Le poids de la charge d'indexation détermine la fréquence du translog. Lorsque vous augmentez index.translog.flush_threshold_size, le nœud effectue cette opération coûteuse moins souvent. Comme les vidages Amazon ES sont des opérations gourmandes en ressources, la réduction de la fréquence des translogs améliore les performances d'indexation. En augmentant la taille du seuil de vidage, le cluster Elasticsearch crée également quelques segments volumineux (au lieu de plusieurs petits segments). Les segments volumineux fusionnent moins souvent et plus de threads sont utilisés pour l'indexation plutôt que pour la fusion.

Remarque : une augmentation de index.translog.flush_threshold_size peut également augmenter le temps nécessaire à la réalisation d'un translog. En cas de défaillance d'une partition, la récupération prendra plus de temps, car le translog est plus volumineux.

Avant d'augmenter index.translog.flush_threshold_size, appelez l'opération d'API suivante pour obtenir les statistiques actuelles des opérations de vidage :

$ curl 'es-endpoint/index-name/_stats/flush?pretty'

Remplacez les es-endpoint et index-name par vos variables respectives.

Dans la sortie, notez le nombre de vidages et le temps total. L'exemple de sortie suivant montre qu'il y a 124 vidages, ce qui a pris 17 690 millisecondes :

"flush" { "total" : 124, "total_time_in_millis" : 17690 }

Pour augmenter la taille du seuil de vidage, appelez l'opération d'API suivante :

$ curl -XPUT 'es-endpoint/index-name/_settings?pretty' -d '{"index":{"translog.flush_threshold_size" : "1024MB"}}'

Dans cet exemple, la taille du seuil de vidage est définie sur 1024 Mo, ce qui est idéal pour les instances avec plus de 32 Go de mémoire.

Remarque : choisissez la taille seuil appropriée pour votre domaine Amazon ES.

Exécutez à nouveau l'opération d'API _stats pour voir si l'activité de vidage a changé :

$ curl 'es-endpoint/index-name/_stats/flush?pretty' 

Remarque : une bonne pratique consiste à augmenter index.translog.flush_threshold_size uniquement pour l'index actuel. Une fois que vous avez confirmé le résultat, appliquez les modifications au modèle d'index.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?