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

Dernière mise à jour : 17/11/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 uniforme.

Utilisez la formule suivante pour vérifier 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 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.

La fréquence d'actualisation par défaut est d'une seconde. Lorsque vous augmentez cette fréquence, le nœud de données effectue moins d'appels d'API. La fréquence d'actualisation peut être plus courte ou plus rapide en fonction de sa durée. Pour éviter les erreurs 429, une bonne pratique consiste à augmenter la fréquence d'actualisation.

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

Définir 0 comme nombre de réplicas

Si vous prévoyez une indexation intensive, affectez à index.number_of_replicas la valeur « 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 non-volatile memory express (NVMe) rapide et local. 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 d'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 grands segments (au lieu de plusieurs petits segments). Les grands segments fusionnent moins souvent, et plus de threads sont utilisées pour l'indexation plutôt que pour la fusion.

Remarque : l'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 grand.

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 point-terminaison-es et nom-index 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 1 024 Mo, ce qui est idéal pour les instances avec plus de 32 Go de mémoire.

Remarque : choisissez la taille seuil adaptée à votre domaine Amazon ES.

Exécutez à nouveau l'opération d'API _stats pour déterminer 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 vérifié 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 ?