Ignite Service Grid — un nouveau dĂ©part

Le 26 février, nous avons organisé une rencontre sur Apache Ignite GreenSource, avec la participation de contributeurs du projet open source. Apache Ignite. Un événement marquant dans la vie de cette communauté a été la restructuration du composant Ignite Service Grid, qui permet de déployer des microservices personnalisés directement dans le cluster Ignite. Ce processus complexe a été expliqué lors de la rencontre par Vyacheslav Daradur, ingénieur logiciel et contributeur d'Apache Ignite depuis plus de deux ans.

Ignite Service Grid — un nouveau dĂ©part

Commençons par définir ce qu'est réellement Apache Ignite. C'est une base de données qui constitue un stockage distribué Key/Value avec prise en charge de SQL, de la transactionnalité et de la mise en cache. De plus, Ignite permet de déployer des services personnalisés directement dans le cluster Ignite. Les développeurs ont accÚs à tous les outils offerts par Ignite : structures de données réparties, Messaging, Streaming, Compute et Data Grid. Par exemple, en utilisant Data Grid, on évite les problÚmes d'administration d'une infrastructure séparée pour le stockage de données, et par conséquent, les frais généraux qui en découlent.

Ignite Service Grid — un nouveau dĂ©part

En utilisant l'API Service Grid, il est possible de dĂ©ployer un service en spĂ©cifiant simplement, dans la configuration, le schĂ©ma de dĂ©ploiement et, en consĂ©quence, le service lui-mĂȘme.

En gĂ©nĂ©ral, le schĂ©ma de dĂ©ploiement indique le nombre d'instances qui doivent ĂȘtre dĂ©ployĂ©es sur les nƓuds du cluster. Il existe deux schĂ©mas de dĂ©ploiement typiques. Le premier est le Cluster Singleton : Ă  tout moment, un seul exemplaire du service personnalisĂ© sera garanti dans le cluster. Le second est le Node Singleton : une instance du service est dĂ©ployĂ©e sur chaque nƓud du cluster.

Ignite Service Grid — un nouveau dĂ©part

L'utilisateur peut Ă©galement spĂ©cifier le nombre d'instances du service dans tout le cluster et dĂ©finir un prĂ©dicat pour filtrer les nƓuds appropriĂ©s. Dans ce scĂ©nario, Service Grid calculera lui-mĂȘme la rĂ©partition optimale pour le dĂ©ploiement des services.

De plus, il existe une fonctionnalitĂ© appelĂ©e Affinity Service. L'Affinity est une fonction qui dĂ©finit la relation entre les clĂ©s et les partitions, ainsi que la relation entre les partitions et les nƓuds dans la topologie. Par la clĂ©, il est possible de dĂ©terminer le nƓud principal sur lequel les donnĂ©es sont stockĂ©es. Ainsi, vous pouvez associer votre propre service Ă  une clĂ© et au cache de la fonction d'affinitĂ©. En cas de modification de la fonction d'affinitĂ©, un redĂ©ploiement automatique aura lieu. Ainsi, le service sera toujours situĂ© Ă  proximitĂ© des donnĂ©es auxquelles il doit accĂ©der, rĂ©duisant ainsi les frais d'accĂšs Ă  l'information. Ce schĂ©ma peut ĂȘtre considĂ©rĂ© comme une sorte de calcul collocatif.

Maintenant que nous avons exploré les avantages de Service Grid, parlons de son histoire de développement.

Ce qui était avant

La version prĂ©cĂ©dente de Service Grid Ă©tait basĂ©e sur un cache systĂšme rĂ©pliquĂ© transactionnel Ignite. Dans Ignite, par le terme « cache », on entend un stockage. Ce n'est donc pas quelque chose de temporaire, comme on pourrait le penser. Bien que le cache soit rĂ©pliquĂ© et que chaque nƓud contienne l'ensemble des donnĂ©es, Ă  l'intĂ©rieur, le cache prĂ©sente une vision partitionnĂ©e. Cela est liĂ© Ă  l'optimisation des stockages.

Ignite Service Grid — un nouveau dĂ©part

Que se passait-il lorsque l'utilisateur voulait déployer un service ?

  • Tous les nƓuds dans le cluster s'inscrivaient aux mises Ă  jour des donnĂ©es dans le stockage via le mĂ©canisme intĂ©grĂ© de Query Continue.
  • Le nƓud initiateur effectuait une Ă©criture dans la base de donnĂ©es sous une transaction read-committed, qui contenait la configuration du service, y compris une instance sĂ©rialisĂ©e.
  • Lors de la rĂ©ception d'une notification concernant un nouvel enregistrement, le coordinateur calculait la distribution basĂ©e sur la configuration. L'objet obtenu Ă©tait réécrit dans la base.
  • Si un nƓud faisait partie de la distribution, le coordinateur devait le dĂ©ployer.

Ce qui ne nous convenait pas

À un moment donnĂ©, nous avons conclu qu'il n'Ă©tait pas possible de travailler ainsi avec les services. Plusieurs raisons ont conduit Ă  cette conclusion.

Si une erreur se produisait lors du dĂ©ploiement, on ne pouvait l'apprendre que par les journaux du nƓud oĂč cela s'est produit. Il n'y avait qu'un dĂ©ploiement asynchrone, donc aprĂšs avoir redonnĂ© le contrĂŽle Ă  l'utilisateur Ă  partir de la mĂ©thode de dĂ©ploiement, il fallait un certain temps supplĂ©mentaire pour dĂ©marrer le service — et pendant ce temps, l'utilisateur ne pouvait rien gĂ©rer. Pour continuer Ă  dĂ©velopper Service Grid, ajouter de nouvelles fonctionnalitĂ©s, attirer de nouveaux utilisateurs et faciliter la vie de tous, il fallait changer quelque chose.

Lors de la conception de la nouvelle Service Grid, notre premiÚre priorité était de garantir un déploiement synchrone : dÚs que l'utilisateur a récupéré le contrÎle de l'API, il peut immédiatement utiliser les services. Nous souhaitions également donner à l'initiateur la possibilité de gérer les erreurs de déploiement.

De plus, nous voulions faciliter la mise en Ɠuvre, notamment en Ă©liminant les transactions et le rééquilibrage. Bien que le cache soit rĂ©pliquĂ© et qu'il n'y ait pas de rééquilibrage, des problĂšmes surviennent lors de dĂ©ploiements massifs avec de nombreux nƓuds. Lorsqu'il y a des changements de topologie, les nƓuds doivent Ă©changer des informations, et pendant un grand dĂ©ploiement, ces donnĂ©es peuvent prendre beaucoup de place.

Lorsque la topologie était instable, le coordonnateur devait recalculer la répartition des services. En général, lorsque l'on doit travailler avec des transactions sur une topologie instable, cela peut entraßner des erreurs difficiles à prévoir.

ProblĂšmes

Quelles globales transformations sans problĂšmes associĂ©s ? Le premier d'entre eux Ă©tait le changement de topologie. Il faut comprendre qu’à tout moment, mĂȘme lors du dĂ©ploiement d’un service, un nƓud peut entrer ou sortir du cluster. De plus, si un nƓud entre dans le cluster pendant le dĂ©ploiement, il faudra transmettre de maniĂšre cohĂ©rente toutes les informations concernant les services au nouveau nƓud. Et il ne s'agit pas seulement de ce qui a dĂ©jĂ  Ă©tĂ© dĂ©ployĂ©, mais aussi des dĂ©ploiements actuels et futurs.

C'est juste un des problÚmes que l'on peut rassembler dans une liste séparée :

  • Comment dĂ©ployer des services statiquement configurĂ©s lors du dĂ©marrage du nƓud ?
  • Sortie d'un nƓud du cluster – que faire si le nƓud hĂ©bergeait des services ?
  • Que faire si le coordonnateur a changĂ© ?
  • Que faire si le client se reconnecte au cluster ?
  • Faut-il traiter les demandes d'activation/dĂ©sactivation et comment ?
  • Et que faire si une destruction du cache a Ă©tĂ© appelĂ©e alors que nous avons des services avec affinitĂ© liĂ©s Ă  lui ?

Et ce n'est pas tout.

Solution

Nous avons choisi d'adopter une approche Event Driven, avec la mise en Ɠuvre de la communication des processus via des messages. Ignite dispose dĂ©jĂ  de deux composants qui permettent aux nƓuds d'Ă©changer des messages entre eux : communication-spi et discovery-spi.

Ignite Service Grid — un nouveau dĂ©part

Communication-spi permet aux nƓuds de communiquer directement et d'envoyer des messages. Il convient bien pour le transfert de grandes quantitĂ©s de donnĂ©es. Discovery-spi permet d'envoyer un message Ă  tous les nƓuds du cluster. Dans l'implĂ©mentation standard, cela se fait selon la topologie "anneau". Il existe Ă©galement une intĂ©gration avec Zookeeper, auquel cas la topologie utilisĂ©e est "Ă©toile". Il est Ă©galement important de noter que discovery-spi garantit que le message sera prĂ©cisĂ©ment livrĂ© dans le bon ordre Ă  tous les nƓuds.

Considérons le protocole de déploiement. Toutes les demandes d'utilisateur pour déployer et désaffecter sont envoyées via discovery-spi. Cela offre les garanties:

  • La demande sera reçue par tous les nƓuds du cluster. Cela permettra de continuer Ă  traiter la demande en cas de changement de coordinateur. Cela signifie Ă©galement qu'avec un seul message, chaque nƓud recevra toutes les mĂ©tadonnĂ©es nĂ©cessaires, telles que la configuration du service et son instance sĂ©rialisĂ©e.
  • L'ordre strict de livraison des messages permet de rĂ©soudre les conflits de configuration et les demandes concurrentes.
  • Puisque l'entrĂ©e d'un nƓud dans la topologie est Ă©galement traitĂ©e par discovery-spi, le nouveau nƓud recevra toutes les donnĂ©es nĂ©cessaires pour travailler avec les services.

Lors de la rĂ©ception d'une demande, les nƓuds du cluster la valident et forment des tĂąches Ă  traiter. Ces tĂąches sont empilĂ©es dans une queue et ensuite traitĂ©es dans un autre thread par un worker sĂ©parĂ©. Cela est rĂ©alisĂ© ainsi car le dĂ©ploiement peut prendre un temps considĂ©rable et retarder la prĂ©cieuse flux de discovery est inacceptable.

Toutes les demandes de la queue sont traitées par le gestionnaire de déploiement. Il possÚde un worker spécial qui extrait une tùche de cette queue et l'initialise pour commencer le déploiement. AprÚs cela, les actions suivantes se produisent :

  1. Chaque nƓud calcule de maniĂšre autonome la distribution grĂące Ă  une nouvelle fonction d’assignation dĂ©terministe.
  2. Les nƓuds forment un message avec les rĂ©sultats du dĂ©ploiement et l'envoient au coordinateur.
  3. Le coordinateur agrĂšge tous les messages et forme le rĂ©sultat de l'ensemble du processus de dĂ©ploiement, qui est envoyĂ© via discovery-spi Ă  tous les nƓuds du cluster.
  4. Lors de la réception du résultat, le processus de déploiement se termine, aprÚs quoi la tùche est supprimée de la queue.

Ignite Service Grid — un nouveau dĂ©part
Nouveau design basé sur les événements : org.apache.ignite.internal.processors.service.IgniteServiceProcessor.java

Si une erreur se produit lors du dĂ©ploiement, le nƓud inclut immĂ©diatement cette erreur dans le message qu'il envoie au coordinateur. AprĂšs l'agrĂ©gation des messages, le coordinateur disposera d'informations sur toutes les erreurs survenues pendant le dĂ©ploiement et transmettra ce message via discovery-spi. Les informations sur les erreurs seront accessibles depuis n'importe quel nƓud du cluster.

Tous les événements importants dans le Service Grid sont traités selon cet algorithme de fonctionnement. Par exemple, un changement de topologie est également un message via discovery-spi. En général, si l'on compare à ce qu'il y avait auparavant, le protocole s'est révélé assez léger et fiable. Suffisamment pour traiter n'importe quelle situation pendant le déploiement.

Que va-t-il se passer ensuite

Parlons maintenant des projets. Toute amélioration majeure dans le projet Ignite est réalisée sous la forme d'une initiative d'amélioration d'Ignite, appelée IEP. Le redesign du Service Grid a également un IEP - IEP n°17 avec un nom humoristique « Changement d'huile dans le Service Grid ». Mais en fait, nous n'avons pas changé l'huile dans le moteur, mais le moteur entier.

Nous avons divisé les tùches dans l'IEP en 2 phases. La premiÚre est une grande phase qui consiste à retravailler le protocole de déploiement. Elle est déjà intégrée dans la branche principale, vous pouvez essayer le nouveau Service Grid qui apparaßtra dans la version 2.8. La deuxiÚme phase comprend de nombreuses autres tùches :

  • RedĂ©ploiement Ă  chaud
  • Versionnage des services
  • Augmentation de la rĂ©silience
  • Client lĂ©ger
  • Outils de surveillance et de comptage de diverses mĂ©triques

Enfin, nous vous recommandons Service Grid pour la construction de systÚmes hautement disponibles et tolérants aux pannes. Nous vous invitons également à nous rejoindre sur dev-list et user-list pour partager votre expérience. Votre expérience est vraiment importante pour la communauté, elle aidera à comprendre quelle direction prendre et comment développer le composant à l'avenir.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster