La création d’une architecture de recherche évolutive est une tâche populaire et importante pour de nombreux systèmes. Il existe différentes solutions pour cette tâche. Le choix du bon dépend des exigences de votre projet.
Parfois, à mesure qu’un projet se développe et que ses exigences changent, vous pouvez rencontrer de nouveaux problèmes que vous ne pouvez pas résoudre avec l’architecture de recherche que vous utilisez. Par exemple, lors de l’augmentation de la quantité de données, en incluant des synonymes dans la recherche, en ajoutant une recherche multilingue, etc. Dans ce cas, vous devez penser à créer une nouvelle architecture de recherche plus efficace et évolutive.
L’architecture de recherche doit prendre en charge la mise à l’échelle rapide en lecture et en écriture requise pour la plupart des cas d’utilisation.
Dans cet article, nous parlerons du principal défi qu’une architecture de recherche efficace doit résoudre. Nous apprendrons également les principaux moyens de mettre en œuvre une telle architecture et quels outils peuvent être utilisés pour ce faire. En fin de compte, nous vous dirons comment accélérer le moteur de recherche.
Défis actuels de l’architecture de recherche
Construire une architecture de recherche évolutive est un défi pour la plupart des programmes de tailles et de complexité variables. Pour le résoudre, il existe plusieurs architectures de recherche différentes.
Cependant, en raison du développement rapide des technologies de l’information, de la création de nouvelles places de marché en forte croissance et des applications SaaS, les solutions existantes ne peuvent plus répondre à toutes les exigences. Par conséquent, il est nécessaire de construire une nouvelle architecture efficace et évolutive capable de résoudre les problèmes modernes.
Examinons les défis auxquels sont actuellement confrontés les développeurs d’architectures de recherche évolutives.
- Évolutivité dynamique. Le nombre de requêtes de recherche que le système reçoit peut varier considérablement en fonction des différents événements. Parfois, la quantité de trafic peut augmenter des dizaines de fois par rapport au trafic quotidien moyen. Pour traiter efficacement les requêtes, les moteurs de recherche doivent être capables d’anticiper la croissance du trafic et de faire évoluer leur infrastructure. Il est important d’ajouter et de supprimer des machines en moins d’une minute et de gérer temporairement l’augmentation du trafic avant qu’une nouvelle machine ne soit disponible. L’évolutivité dynamique réduit les coûts tout en ouvrant de nouvelles opportunités pour l’utilisation créative des moteurs de recherche.
- Un nombre dynamique de fragments. La performance du système et sa capacité à évoluer dépendent de cet indicateur. Pour des performances optimales du moteur de recherche, ce nombre doit être dynamique. Afin d’avoir des performances optimales et la possibilité d’évoluer, il est important de pouvoir régler cette valeur automatiquement.
- Séparation de la recherche et de l’indexation. La mise à l’échelle simultanée du volume de requêtes et du volume de données est un défi pour les moteurs de recherche. L’augmentation des capacités de recherche ou d’indexation nécessite plus de ressources, ce qui rend l’infrastructure très coûteuse. Pour des performances optimales du moteur de recherche et pour éviter l’impact négatif de l’indexation sur la recherche, vous devez dimensionner l’indexation et la recherche séparément.
- Transmission de données parallèle sur le réseau. Au cours de la dernière décennie, la vitesse de transfert des données sur le réseau a été multipliée par environ 100 et continue de croître. Dans le même temps, les processeurs et le stockage de données ne se développent pas aussi rapidement. Pour une mise à l’échelle efficace, cette situation nécessite la création d’un mode différent de transmission des données avec un plus grand pourcentage de parallélisation.
Différences entre les moteurs de recherche et les bases de données
Bien que les moteurs de recherche et les bases de données relationnelles aient beaucoup en commun, il existe également des différences essentielles entre eux.
Les bases de données relationnelles stockent des données structurées sous la forme de tables interdépendantes. Ils vous permettent de traiter beaucoup plus d’informations que les moteurs de recherche. Cependant, l’avantage des moteurs de recherche est qu’ils peuvent analyser des données non structurées. Ils stockent des objets plats au lieu de tables interconnectées. Les moteurs de recherche permettent d’améliorer les performances des opérations de lecture et d’écriture des données en les parallélisant.
Dans les bases de données relationnelles, les informations sont bien organisées et plus fiables. En revanche, dans les moteurs de recherche, l’information n’est pas systématisée et n’est pas stable puisque sa localisation et son contenu peuvent constamment changer.
Les moteurs de recherche sont faciles et rapides à mettre en œuvre. Cependant, contrairement aux bases de données, les moteurs de recherche doivent être mis à jour fréquemment. Leur objectif principal est de fournir un ensemble pertinent de résultats de recherche de haute qualité qui répondent rapidement aux besoins des clients.
Mise à l’échelle des modèles d’architecture
Architecture principale/répliques
Une architecture primaire/réplica est utilisée pour prendre en charge un grand nombre de lectures. Il s’agit de répliquer les données du serveur principal sur plusieurs répliques. Cette architecture vous permet de traiter plusieurs fois plus de requêtes que si vous n’utilisiez qu’une seule copie des données sur un seul serveur. Par exemple, si vous utilisez trois copies de données sur trois serveurs, vous pouvez traiter trois fois plus de requêtes qu’avec une copie sur un serveur.
Pour prendre en charge davantage d’opérations d’écriture, vous devez diviser les données en plusieurs parties plus petites et ajouter plus de CPU pour créer ces parties. De plus, la mise à l’échelle des lectures et des écritures nécessite l’ajout de fragments et la présence de plusieurs copies sur plusieurs machines.
Pour implémenter une architecture primaire/réplica qui réplique les données du serveur maître sur plusieurs répliques, chaque partition doit avoir une version qui accepte les écritures. D’autres répliques utilisent le primaire comme source de vérité. Un fichier journal stocké sur la partition principale est souvent utilisé pour synchroniser les données principales et les répliques. Ce fichier journal contient toutes les écritures reçues par le fragment principal dans un ordre séquentiel. Chaque fragment de réplique lit les écritures de ce journal et les applique localement.
Le principal inconvénient de cette approche est la colocalisation de l’indexation et de la recherche sur la même machine. Comme nous devons créer plusieurs copies des données, l’indexation du processeur et de la mémoire doit être dupliquée. Cela augmente considérablement les coûts. Si vous devez faire évoluer l’indexation et la recherche en même temps, le facteur de réplication augmente et s’applique à davantage de données, ce qui nécessite une énorme quantité de ressources supplémentaires.
L’augmentation de l’utilisation du processeur et de la mémoire pour l’indexation peut également affecter négativement l’expérience de l’utilisateur final si le même ordinateur traite à la fois l’indexation et les requêtes de recherche. Si le trafic de recherche généré par les utilisateurs finaux augmente considérablement, les ressources utilisées pour l’indexation peuvent limiter la capacité à tenir compte de cette augmentation du trafic.
De plus, cette approche limite les capacités de mise à l’échelle automatique, car l’ajout d’un nouveau réplica nécessite d’extraire des données des machines existantes, prend souvent plusieurs heures et ajoute une charge supplémentaire sur les machines. Cela vous oblige à augmenter considérablement la taille de votre architecture et à vous attendre à une augmentation significative des données ou des requêtes.
Réplication d’une structure de données binaire
Une autre façon de créer une architecture de recherche évolutive consiste à répliquer une structure de données binaires validée sur le disque après la fin d’une tâche d’indexation.
Cette approche évite de dupliquer le processeur et la mémoire utilisés pour l’indexation. Cependant, lors de l’écrasement de toutes les structures de données, les fichiers binaires peuvent être volumineux, ce qui entraîne un certain retard.
Le plus souvent, les architectures de recherche traitent un grand nombre d’opérations d’indexation et de recherche à un rythme inférieur à une minute. Par conséquent, dans la plupart des cas, cette approche n’est pas utilisée.
De plus, les moteurs de recherche s’appuient sur des structures de données générationnelles. Cela signifie qu’au lieu d’un seul fichier binaire, il existe un ensemble de fichiers. Lorsqu’un segment reçoit de nouvelles opérations d’indexation, il est stocké dans une structure de données plus petite sur le disque. De nouvelles opérations d’indexation sont effectuées dans la génération zéro jusqu’à ce que des parties des fichiers atteignent une certaine taille et doivent être fusionnées avec la génération 1. Cela est nécessaire pour supprimer les doublons et optimiser l’efficacité de la recherche. L’inconvénient de cette approche est que tous les fichiers sur le disque sont modifiés et que chaque réplique doit obtenir une nouvelle version contenant toutes les fragments de données.
Le processus de fusion des données et leur transfert pour réplication seront influencés par ces facteurs :
- Les taille du fragment détermine la quantité maximale de données à transférer après la fusion de toutes les couches.
- Le nombre de générations. Cela affectera directement la fréquence de fusion de toutes les générations (le nombre de fois où nous devons transférer la taille maximale des données).
Recherche Architecture Principaux services
Pour créer une architecture de recherche, vous devez utiliser trois services : les robots d’exploration, les processeurs de pages Web et l’indexation.
- Les crawlers sont des robots qui sont utilisés pour visiter une page Web, obtenir tous les liens qui s’y trouvent et suivre ces liens. Cela permet aux moteurs de recherche de trouver constamment de nouveaux contenus.
- Les processeurs de page Web lisent le contenu et les métadonnées de la page. Ensuite, vous devez décomposer le contenu de la page Web en formes plus simples qui peuvent être regroupées selon différents critères, par exemple, par sujets, mots-clés, etc. Les métadonnées contiennent des informations utiles telles que des mots-clés, des descriptions, etc.
- L’indexation est utilisée pour organiser les informations trouvées afin qu’elles puissent être lues rapidement et facilement. Vous pouvez utiliser des mots-clés et page rank à cette fin. Cependant, une indexation plus efficace nécessite un peu de recherche et de développement.
Configurer les services de recherche à l’aide de Kubernetes
Kubernetes est une plate-forme de conteneur Docker évolutive qui peut être utilisée pour tous les services nécessaires à la création d’une architecture de recherche. Il vous permet de configurer les services de manière à ce qu’ils fonctionnent quel que soit le matériel utilisé à cet effet. De plus, vous pouvez faire évoluer chaque service séparément en fonction de vos besoins.
Kubernetes vous permet de créer des services et de leur attribuer des adresses IP uniques. Cela permet aux services de communiquer entre eux sans créer de connexions spéciales. De plus, il assure la sécurité de vos services.
Les principaux avantages de l’utilisation de Kubernetes sont :
- Opérations automatisées. Dans Kubernetes, une grande partie du travail complexe impliqué dans la gestion des applications est effectuée automatiquement par des commandes intégrées.
- Abstraction des infrastructures. Kubernetes gère les calculs, la mise en réseau et le stockage pour le compte de vos charges de travail. Cela permet aux programmeurs de ne pas se soucier de la configuration de l’environnement sous-jacent, mais de se concentrer sur le développement d’applications.
- Surveillance de la santé des services. Kubernetes vérifie en permanence la santé de vos services. Il…