Tous les produits
Search
Centre de documentation

Elasticsearch:Utiliser le plug-in de limitation de débit du cluster (aliyun-qos)

Dernière mise à jour :Aug 09, 2026

Le plug-in aliyun-qos est un outil de limitation de débit en lecture et en écriture au niveau du cluster, développé par l'équipe Elasticsearch d'Alibaba Cloud. Lorsque les services en amont ne peuvent pas contrôler le trafic, utilisez le plug-in aliyun-qos pour limiter le débit d'index spécifiques en fonction de la priorité métier. Cela permet de maintenir le trafic à un niveau gérable et de garantir la stabilité de votre cluster Elasticsearch.

Précautions

  • Le plug-in aliyun-qos est préinstallé et ne peut pas être désinstallé. Sa fonctionnalité de limitation de débit est désactivée par défaut. Ce plug-in est conçu pour protéger la stabilité du cluster, et non pour mesurer avec précision le trafic en lecture et en écriture.

  • Version du plug-in : avant d'utiliser le plug-in aliyun-qos, assurez-vous qu'il est mis à jour vers la dernière version. Connectez-vous à la console Kibana et exécutez GET /_cat/plugins?v pour vérifier la version du plug-in.

    La version du plug-in suit le format <cluster version>_ali<internal version number>, par exemple 7.10.0_ali1.6.0.2 ou 8.17.0_ali2.2.0.4.1. Si la version du plug-in n'est pas la plus récente, reportez-vous aux méthodes suivantes pour la mettre à niveau :

    • Pour un cluster V7.10 : dans la console, mettez à niveau le noyau vers la version 1.6.0. Pour plus d'informations, consultez la rubrique Mettre à niveau les versions de cluster.

    • Pour les autres versions de cluster : soumettez un ticket au support Alibaba Cloud pour mettre à niveau le plug-in. Après la mise à niveau, redémarrez manuellement le cluster Elasticsearch pour que la nouvelle version prenne effet.

    • Si la version du plug-in est antérieure à rc4, une erreur unsupported_operation_exception se produit. Le plug-in aliyun-qos ne peut être mis à niveau que sur des clusters exécutant la version 6.7.0 ou ultérieure. Vous devez d'abord mettre à niveau les clusters exécutant des versions antérieures vers la version 6.7.0 ou ultérieure.

Évaluer les seuils

Le plug-in aliyun-qos effectue la limitation de débit au niveau du cluster. Afin de minimiser la surcharge de performance, il ne mesure pas avec précision le trafic en lecture et en écriture sur tous les nœuds ; le trafic réel peut donc différer du trafic mesuré. Avant d'utiliser le plug-in, évaluez le seuil de limitation selon les règles suivantes :

  • Requêtes de recherche

    Seuil de limitation pour les requêtes de recherche = QPS de bout en bout (requêtes par seconde) du client vers Elasticsearch

    Le QPS de bout en bout fait uniquement référence au nombre de requêtes de recherche qui atteignent les nœuds clients par seconde.

  • Requêtes d'écriture

    La règle de calcul du seuil de limitation pour les requêtes d'écriture est similaire à celle des requêtes de recherche, mais nécessite un ajustement en fonction du nombre de réplicas de shards.

    Par exemple, considérons un cluster comportant deux nœuds de données et un index. L'index possède un shard primaire et un shard réplica. Chaque opération d'écriture envoie 10 Mo de données. Étant donné qu'un shard réplica existe, 10 Mo de données sont écrits sur chaque nœud de données. De plus, les tâches internes X-Pack telles que Monitor, Audit et Watcher consomment également du débit d'écriture. Prévoyez une capacité pour ce trafic lors de la définition du seuil.

Activer la limitation de débit

La fonctionnalité de limitation de débit du plug-in aliyun-qos est désactivée par défaut. Activez-la avant utilisation. La commande d'activation varie selon la version du plug-in.

Dernière version V7.10

Autres versions

PUT _cluster/settings
{
  "persistent": {
    "apack.qos.limiter.enabled": true
  }
}
PUT _cluster/settings
{
  "persistent": {
    "apack.qos.ratelimit.enabled": "true"
  }
}

Désactiver la limitation de débit

Désactivez la fonctionnalité de limitation de débit en définissant le paramètre limiter sur false ou null. La commande varie selon la version.

Méthode

Dernière version V7.10

Autres versions

Définir le paramètre limiter sur false

PUT _cluster/settings
{
  "persistent": {
    "apack.qos.limiter.enabled": false
  }
}
PUT _cluster/settings
{
  "persistent": {
    "apack.qos.ratelimit.enabled": "false"
  }
}

Définir le paramètre limiter sur null

PUT _cluster/settings
{
  "persistent": {
    "apack.qos.limiter.enabled": null
  }
}
PUT _cluster/settings
{
  "persistent": {
    "apack.qos.ratelimit.enabled": null
  }
}

Configurer un limiteur (dernière version V7.10)

Les configurations de limiteur suivantes s'appliquent uniquement au plug-in aliyun-qos pour les clusters V7.10.

Une configuration de limiteur comprend deux parties : limiters et tags. La section tags définit la portée des limites de ressources, tandis que la section limiters définit le type de limitation spécifique et le seuil. Les limiteurs peuvent être standard ou par défaut. Créez un limiteur par défaut en définissant une valeur de tag sur **. Par exemple, vous pouvez définir un débit par défaut pour chaque shard ou un QPS par défaut pour chaque application. Lorsqu'une requête dépasse une limite, Elasticsearch rejette les requêtes suivantes.

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
     ${action}.${limiter_type}:${threshold}
  },
  "tags": {
    ${tagName}:${tagValue}
  },
  "priority":0,
  "params":{
      "watchMode":true
  }
}

Paramètre

Description

Valeur

action

L'action à limiter. Ce paramètre sert à limiter différents types de requêtes.

  • write : Requêtes d'écriture de documents, y compris les opérations index et create.

  • update : Requêtes de mise à jour de documents.

  • delete : Requêtes de suppression de documents.

  • search : Requêtes de recherche.

  • search_shards : Requêtes permettant d'interroger le nombre total de shards d'un index.

limiter_type

Le type de limitation. Trois catégories sont prises en charge : débit, concurrence et limites par requête.

  • rate : Limite de débit. Accepte uniquement des entiers.

  • qps : Taux de requêtes. Accepte uniquement des entiers.

  • tps : Taux d'écriture. Accepte uniquement des entiers.

  • throughput : Débit de données. Pris en charge uniquement pour les actions write, update et delete. Les unités incluent Go, Mo et Ko. La valeur maximale est de 2 Go.

  • thread_count : Limite le nombre de requêtes simultanées.

  • concurrent_count : Concurrence des requêtes, calculée en fonction des opérations spécifiques d'une requête. Par exemple, search_shards.concurrent_count:20 autorise un maximum de 20 requêtes de shards simultanées.

  • max_per_request : Nombre maximal d'opérations d'un certain type au sein d'une seule requête. Par exemple, update.max_per_request:10 autorise un maximum de 10 opérations de mise à jour dans une seule requête Bulk.

  • max_size_per_request : Taille maximale d'une seule requête. Pris en charge uniquement pour les actions write, update et delete.

threshold

Le seuil de limitation.

Un entier supérieur ou égal à -1.

Certains types acceptent des chaînes avec des unités. Pour plus d'informations, consultez la description de limiter_type.

tagName

Le nom du tag.

  • node : Le nom du nœud actuel.

  • is_master : Indique si le nœud actuel est un nœud maître. La valeur de tag correspondante est true ou false.

  • index : Le nom de l'index. Pour plusieurs index, utilisez un tableau. Si un alias est transmis, il est résolu en nom d'index réel. Ce tag est disponible uniquement pour les sous-classes de IndicesRequest.

  • shard : Le nom du shard, au format index[id], par exemple test[0]. Ce tag est disponible uniquement pour les sous-classes de ReplicationRequest.

  • index_in_url : La chaîne d'index issue de l'URL. Si un alias est transmis, ce tag conserve l'alias. Ce tag est disponible uniquement pour les sous-classes de IndicesRequest.

tagValue

La valeur du tag.

Une chaîne ou un tableau de chaînes. Si un tableau est utilisé, le tag correspond à n'importe quelle valeur du tableau. La correspondance exacte, la correspondance par préfixe avec un caractère générique et toutes les valeurs sont prises en charge. Exemples :

  • Correspondance exacte : « abc »

  • Correspondance par préfixe : « ab* »

  • Toutes les valeurs : « ** »

    L'utilisation d'une valeur générique définit un limiteur par défaut, ce qui signifie qu'un limiteur spécifique est généré pour toute valeur de ce tag. Par exemple, si vous spécifiez index:"**",search.tps:1, le taux de recherche pour chaque index est limité à 1 par défaut, plutôt que de limiter le taux de recherche total à 1.

priority

La priorité du limiteur.

Un entier. Valeur par défaut : 0.

Une valeur plus élevée indique une priorité plus grande. Lorsqu'une requête correspond à plusieurs limiteurs par défaut, seul celui ayant la priorité la plus élevée prend effet.

params

Paramètres avancés.

watchMode : Indique s'il faut activer le mode de surveillance. Valeurs valides : true et false (par défaut). Lorsqu'elle est définie sur true, Elasticsearch enregistre les nombres de requêtes rejetées dans les métriques, mais n'applique pas les limites. Cela vous permet de prévisualiser l'effet d'une règle avant de l'appliquer, évitant ainsi les mauvaises configurations. Pour plus d'informations sur les API, consultez la section FAQ.

Exemples de configuration de limiteur

Définir la limitation de débit QPS pour les recherches

Limitez le QPS des recherches sur un nœud client en définissant un seuil pour un index. Lorsque le nombre de requêtes de recherche par seconde dépasse le seuil, Elasticsearch rejette les requêtes suivantes.

Les valeurs pour index et index_patterns peuvent être des noms d'index complets ou des noms avec un caractère générique. La commande varie selon la version.

Actions

Dernière version V7.10

Autres versions

Définir la limitation de débit QPS des recherches pour un index unique

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "search.qps": "1000"
  },
  "tags": {
    "index": "twitter"
  }
}
PUT /_qos/_ratelimit/<limiterName>
{
  "search.index_patterns": "twitter",
  "search.max_queries_per_sec": 1000
}

Définir la limitation de débit QPS des recherches pour les index avec un préfixe de nom spécifique

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "search.qps": "1000"
  },
  "tags": {
    "index": "nginx-log-*"
  }
}
PUT /_qos/_ratelimit/<limiterName>
{
  "search.index_patterns": "nginx-log-*",
  "search.max_queries_per_sec": 1000
}

Définir la limitation de débit QPS des recherches pour chaque index individuellement

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "search.qps": "1000"
  },
  "tags": {
    "index": "**"
  }
}

index: représente n'importe quel index. Par exemple, si un cluster comporte trois index A, B et C, la valeur de limitation pour les trois index est de 1000.

Non pris en charge.

Définir une limite totale de QPS de recherche pour tous les index

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "search.qps": "1000"
  },
  "tags": {
    "index": "*"
  }
}

index:* indique n'importe quel index. Par exemple, si un cluster comporte trois index nommés A, B et C, la valeur de limitation totale pour ces trois index est de 1000. Cela a le même effet que de ne pas définir ce tag.

PUT /_qos/_ratelimit/<limiterName>
{
  "search.index_patterns": "*",
  "search.max_queries_per_sec": 1000
}

Vous pouvez définir plusieurs règles. La limitation de débit est déclenchée si une requête correspond à n'importe quelle règle.

Lorsque le QPS de recherche dépasse la limite configurée, le système renvoie un message d'erreur. Le message d'erreur varie selon la version :

  • Dernière version V7.10

    {
      "error": {
        "root_cause": [
          {
            "type": "status_exception",
            "reason": "search blocked, limited by [<limiterName>][search.qps](<limiterId>) threshold:[x]"
          }
        ],
        "type": "status_exception",
        "reason": "search blocked, limited by [<limiterName>][search.qps](<limiterId>) threshold:[x]"
      },
      "status": 429
    }
  • Autres versions

    {
      "error": {
        "root_cause": [
          {
            "type": "rate_limited_exception",
            "reason": "request indices:data/read/search rejected, limited by [l1:t*:1.0]"
          }
        ],
        "type": "rate_limited_exception",
        "reason": "request indices:data/read/search rejected, limited by [l1:t*:1.0]"
      },
      "status": 429
    }

Définir la limitation de débit TPS pour les écritures

Limitez le nombre de requêtes d'écriture par seconde reçues par un nœud client en définissant un seuil TPS (transactions par seconde). Lorsque le nombre de requêtes d'écriture par seconde dépasse le seuil, Elasticsearch rejette les requêtes suivantes.

Les valeurs pour index et index_patterns peuvent être des noms d'index complets ou des noms avec un caractère générique. La commande varie selon la version.

Dernière version V7.10

Autres versions

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "write.tps": "100000"
  },
  "tags": {
    "index": "nginx-log-*"
  }
}

Non pris en charge

Définir la limitation de débit pour les requêtes Bulk

Limitez le débit d'écriture des requêtes Bulk API sur un nœud client en définissant une limite en octets par seconde. Lorsque le débit d'écriture dépasse cette limite, Elasticsearch rejette les requêtes suivantes.

Les valeurs pour index et index_patterns peuvent être des noms d'index complets ou des noms avec un caractère générique. La commande varie selon la version.

Dernière version V7.10

Autres versions

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "write.throughput": "100MB"
  },
  "tags": {
    "index": "nginx-log-*"
  }
}
PUT /_qos/_ratelimit/<limiterName>
{
  "bulk.index_patterns": "nginx-log-*",
  "bulk.max_throughput_in_bytes": 104857600
}

Vous pouvez définir plusieurs règles. La limitation de débit est déclenchée si une requête correspond à n'importe quelle règle.

Définir la limitation de taille des requêtes pour les requêtes Bulk

Limitez la taille d'une seule requête Bulk API sur un nœud client. Si une requête dépasse cette limite de taille, Elasticsearch la rejette.

Les valeurs pour index et index_patterns peuvent être des noms d'index complets ou des noms avec un caractère générique. La commande varie selon la version.

Dernière version V7.10

Autres versions

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "write.max_size_per_request": "1000"
  },
  "tags": {
    "index": "nginx-log-*"
  }
}
PUT /_qos/_ratelimit/<limiterName>
{
  "bulk.index_patterns": "nginx-log-*",
  "bulk.max_request_size_in_bytes": 1000
}

Vous pouvez définir plusieurs règles. La limitation de débit est déclenchée si une requête correspond à n'importe quelle règle.

Lorsque la taille d'une seule requête d'écriture dépasse la limite configurée, le système renvoie un message d'erreur. Le message d'erreur varie selon la version :

  • Dernière version V7.10

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "status_exception",
            "reason" : "write_size blocked, limited by [<limiterName>][write.max_size_per_request](<limiterId>) threshold:[x] try acquire [x]"
          }
        ],
        "type" : "status_exception",
        "reason" : "write_size blocked, limited by [<limiterName>][write.max_size_per_request](<limiterId>) threshold:[x] try acquire [x]"
      },
      "status" : 400
    }
  • Autres versions

    {
      "error": {
        "root_cause": [
          {
            "type": "rate_limited_exception",
            "reason": "request indices:data/write/bulk rejected, limited by [b2:ByteSizePreSeconds:992.0]"
          }
        ],
        "type": "rate_limited_exception",
        "reason": "request indices:data/write/bulk rejected, limited by [b2:ByteSizePreSeconds:992.0]"
      },
      "status": 413
    }

Définir la limitation de concurrence pour les requêtes de shards

Réduisez la charge de votre cluster en définissant le nombre de requêtes de shards simultanées. Les valeurs pour index et index_patterns peuvent être des noms d'index complets ou des noms avec un caractère générique. La commande varie selon la version.

Dernière version V7.10

Autres versions

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "search_shards.concurrent_count": "10"
  },
  "tags": {
    "index": "nginx-log-*"
  }
}

Non pris en charge

Vous pouvez définir plusieurs règles. La limitation de débit est déclenchée si une requête correspond à n'importe quelle règle.

Définir plusieurs configurations de limiteur

Définissez plusieurs limites au sein d'une seule configuration de limiteur. Les valeurs pour index et index_patterns peuvent être des noms d'index complets ou des noms avec un caractère générique. La commande varie selon la version.

Dernière version V7.10

Autres versions

PUT /_qos/limiter/<limiterName>
{
  "limiters": {
    "search.qps": "1000",
    "write.tps": "100000",
    "write.throughput": "1000000",
    "write.max_size_per_request": "1000",
    "search_shards.concurrent_count": "10"
  },
  "tags": {
    "index": "nginx-log-*"
  }
}

Non pris en charge

Vous pouvez définir plusieurs règles. La limitation de débit est déclenchée si une requête correspond à n'importe quelle règle.

Obtenir les configurations de limiteur

La commande pour obtenir les configurations de limiteur varie selon la version.

Actions

Dernière version V7.10

Autres versions

Obtenir toutes les configurations de limiteur

GET /_qos/limiter
GET /_qos/_ratelimit

Obtenir une configuration de limiteur spécifique unique

GET /_qos/limiter/<limiterName>
GET /_qos/_ratelimit/<limiterName>

Obtenir plusieurs configurations de limiteur spécifiques. Séparez plusieurs noms de limiteurs par des virgules (,). Les caractères génériques ne sont pas pris en charge.

GET /_qos/limiter/<limiterName1,limiterName2>
GET /_qos/_ratelimit/<limiterName1,limiterName2>

Supprimer les configurations de limiteur

La commande pour supprimer les configurations de limiteur varie selon la version.

Actions

Dernière version V7.10

Autres versions

Supprimer une configuration de limiteur spécifique unique

DELETE /_qos/limiter/<limiterName>
DELETE /_qos/_ratelimit/<limiterName>

Supprimer plusieurs configurations de limiteur spécifiques. Séparez plusieurs noms de limiteurs par des virgules (,). Les caractères génériques ne sont pas pris en charge.

DELETE /_qos/limiter/<limiterName1,limiterName2>
DELETE /_qos/_ratelimit/<limiterName1,limiterName2>

FAQ

Q : Comment obtenir les métriques de surveillance liées à la limitation de débit ?

R : Utilisez les API suivantes :

  • Obtenir les données de métriques actuelles

    • Obtenir les données actuelles pour toutes les métriques

      GET /_qos/limiter/nodes/stats
    • Obtenir les données de métriques actuelles pour un nœud spécifique

      GET /_qos/limiter/nodes/{nodeId}/stats
    • Obtenir les données de métriques actuelles pour un nœud et un limiteur spécifiques

      GET /_qos/limiter/nodes/{nodeId}/stats/{limiterIds}
  • Obtenir les données de métriques historiques

    • Obtenir les données historiques pour toutes les métriques

      GET /_qos/limiter/metric
    • Obtenir les données de métriques historiques pour un limiteur spécifique

      GET /_qos/limiter/metric/{limiterId}

Remarques sur les mises à niveau du plug-in

Lorsque vous mettez à niveau le plug-in aliyun-qos vers la dernière version, tenez compte des points suivants :

  • En raison des différences de mécanisme d'implémentation entre les anciennes et les nouvelles versions, la fonctionnalité de limitation de débit peut être temporairement indisponible pendant le processus de mise à niveau. Elle se rétablit automatiquement après la mise à niveau du plug-in sur le nœud maître.

  • Pendant le processus de conversion des données, certains limiteurs peuvent échouer à la conversion depuis l'ancien format. Si une conversion échoue, exécutez la commande suivante pour réessayer. Si la commande renvoie une erreur, exécutez-la plusieurs fois jusqu'à ce que hasError soit false.

    POST /_qos/limiter/ops/upgrade

    Si la commande précédente renvoie un message d'erreur (tel que unknown action), cela indique que le cluster ne possède pas d'ancien limiteur. Vous pouvez ignorer le message.