Rationalisation de l'autorisation
Imaginez que vous entrez dans un bar, que le videur vous demande votre carte d'identité pour vous y donner accès, puis que le barman fait de même à chaque fois que vous commandez à boire. Voici la façon dont l'autorisation procédait aux vérifications avant la version 7.16 : chaque nœud (la porte d’entrée dans notre exemple) et chaque partition (les commandes de boissons) nécessitaient une vérification de l'autorisation. Et s'il suffisait d'une seule vérification d'identité au moment où vous entrez dans le bar ? Appliquons cette idée à l'autorisation dans Elasticsearch.
Elasticsearch permet aux utilisateurs de configurer un contrôle d'accès basé sur les attributs/rôles afin d'accorder une autorisation précise en fonction des champs, des documents ou des niveaux d'index. Auparavant, le mot authorize
se retrouvait dans de nombreuses requêtes de recherche afin que les requêtes non autorisées n'aient pas accès aux données non justifiées. Toutefois, la vigilance de la fonctionnalité d'autorisation a un coût. En outre, une part de cette logique ne se scale pas de manière horizontale à mesure que la taille du cluster grandit. Par exemple, fournir les fonctionnalités requises pour tous les champs de l'ensemble des index au sein d'un grand cluster pourrait prendre plusieurs secondes, voire quelques minutes. La majeure partie de ce temps d'exécution serait consacré à des tâches liées à l'autorisation.
La version 7.16 permet de relever ces défis sur deux fronts :
- Les améliorations algorithmiques accélèrent l'autorisation des requêtes individuelles, qu'il s'agisse d'une requête REST ou d'une communication entre les nœuds au niveau de la couche de transport (c'est-à-dire pour l'ensemble du réseautage interne entre les nœuds) au sein d'un cluster Elasticsearch.
- Dans la plupart des cas, l'autorisation des requêtes internes est héritée des vérifications précédentes ou devient un processus bien moins cher. Avant la version 7.16, Elasticsearch exécutait la même logique que pour la requête externe initiale lors de l'autorisation des requêtes de transport internes au sein du cluster. Cette technique évitait l'introduction d'un éventail d'attaques dans les communications internes entre les nœuds qui permettraient à un utilisateur malveillant de générer des requêtes internes afin de contourner la logique d'autorisation. Il est désormais possible d'arriver au même résultat pour des coûts bien inférieurs en ignorant l'expansion des caractères génériques dans les sous-requêtes, en ignorant l'autorisation pour les requêtes locales de nœuds (c'est-à-dire à l'intérieur du même nœud) et en diminuant le nombre global de requêtes nécessaires pour mener des opérations, comme la recherche.
Diminution des requêtes de partition à l'étape pre-filter
Une nouvelle stratégie de recherche a été mise en œuvre dans la version 7.16 aux étapes pre-filter
afin de diminuer le nombre de requêtes jusqu'à atteindre une par nœud correspondant. Avant la version 7.16, la première étape d'une recherche qui essaie de filtrer toutes les partitions d'une requête ne contenant pas de données pertinentes nécessitait une requête par partition depuis le nœud de coordination jusqu'à un nœud de données. Lorsqu'une requête concernait des milliers de partitions simultanément, il fallait envoyer des milliers de requêtes par recherche depuis le nœud de coordination, gérer des milliers de réponses sur le nœud de coordination, mais aussi gérer toutes ces requêtes sur les nœuds de données et y répondre. Si le cluster scalait pour comprendre davantage de nœuds de données, la gestion d'un tel nombre de requêtes était bien plus performante sur ces nœuds, mais pas sur le nœud de coordination.
Avec la version 7.16, la stratégie exécutant l'étape pre-filter
a été modifiée afin d'envoyer une seule requête par nœud à ce moment, ce qui permet de couvrir toutes les partitions du nœud concerné. La figure 1 ci-dessous l'illustre parfaitement bien. Ainsi, un cluster contenant des milliers de partitions sur trois nœuds de données verrait le nombre de requêtes réseau effectuées à l'étape initiale de recherche passer de plusieurs milliers à trois au maximum, indépendamment du nombre de partitions sur lequel la recherche porte. Étant donné que le nombre de requêtes en fonction des partitions envoyées avant la version 7.16 contenait globalement les mêmes données que l'ensemble des partitions (c'est-à-dire la requête de recherche), en envoyant une seule requête par nœud, ces informations ne sont plus dupliquées pour plusieurs requêtes. Ainsi, le nombre d'octets à envoyer sur le réseau est considérablement réduit.