Ignite Service Grid - Redémarrer

Le 26 fĂ©vrier, nous avons organisĂ© une rencontre Apache Ignite GreenSource, au cours de laquelle les contributeurs au projet open source ont pris la parole. Apache Ignite. Un Ă©vĂ©nement important dans la vie de cette communautĂ© fut la restructuration de la composante Grille de services Ignite, qui vous permet de dĂ©ployer des microservices personnalisĂ©s directement dans un cluster Ignite. Il a parlĂ© de ce processus difficile lors du meetup Viatcheslav Daradur, ingĂ©nieur logiciel et contributeur Apache Ignite depuis plus de deux ans.

Ignite Service Grid - Redémarrer

Commençons par ce qu'est Apache Ignite en gĂ©nĂ©ral. Il s'agit d'une base de donnĂ©es qui est un stockage clĂ©/valeur distribuĂ© avec prise en charge de SQL, de la transactionnalitĂ© et de la mise en cache. De plus, Ignite vous permet de dĂ©ployer des services personnalisĂ©s directement dans un cluster Ignite. Le dĂ©veloppeur a accĂšs Ă  tous les outils fournis par Ignite : structures de donnĂ©es distribuĂ©es, messagerie, streaming, calcul et grille de donnĂ©es. Par exemple, lors de l'utilisation de Data Grid, le problĂšme de l'administration d'une infrastructure distincte pour le stockage des donnĂ©es et, par consĂ©quent, les frais gĂ©nĂ©raux qui en rĂ©sultent disparaissent.

Ignite Service Grid - Redémarrer

À l'aide de l'API Service Grid, vous pouvez dĂ©ployer un service en spĂ©cifiant simplement le schĂ©ma de dĂ©ploiement et, par consĂ©quent, le service lui-mĂȘme dans la configuration.

En rĂšgle gĂ©nĂ©rale, un 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 Cluster Singleton : Ă  tout moment, une instance d'un service utilisateur est garantie d'ĂȘtre disponible dans le cluster. Le second est Node Singleton : une instance du service est dĂ©ployĂ©e sur chaque nƓud du cluster.

Ignite Service Grid - Redémarrer

L'utilisateur peut Ă©galement spĂ©cifier le nombre d'instances de service dans l'ensemble du 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 distribution optimale pour le dĂ©ploiement des services.

De plus, il existe une fonctionnalitĂ© telle que Affinity Service. L'affinitĂ© est une fonction qui dĂ©finit la relation entre les clĂ©s et les partitions et la relation entre les parties et les nƓuds de la topologie. À l'aide de la clĂ©, vous pouvez dĂ©terminer le nƓud principal sur lequel les donnĂ©es sont stockĂ©es. De cette façon, vous pouvez associer votre propre service Ă  un cache de clĂ©s et de fonctions d'affinitĂ©. Si la fonction d'affinitĂ© change, un redĂ©ploiement automatique se produira. De cette façon, le service sera toujours situĂ© Ă  proximitĂ© des donnĂ©es qu’il doit manipuler et, par consĂ©quent, rĂ©duira les frais d’accĂšs aux informations. Ce schĂ©ma peut ĂȘtre appelĂ© une sorte d’informatique colocalisĂ©e.

Maintenant que nous avons compris quelle est la beauté de Service Grid, parlons de son historique de développement.

Qu'y avait-il avant

L'implĂ©mentation prĂ©cĂ©dente de Service Grid Ă©tait basĂ©e sur le cache systĂšme transactionnel rĂ©pliquĂ© d'Ignite. Le mot « cache » dans Ignite fait rĂ©fĂ©rence au stockage. Autrement dit, ce n’est pas quelque chose de temporaire, comme on pourrait le penser. MalgrĂ© le fait que le cache est rĂ©pliquĂ© et que chaque nƓud contient l'intĂ©gralitĂ© de l'ensemble de donnĂ©es, Ă  l'intĂ©rieur du cache, il a une reprĂ©sentation partitionnĂ©e. Cela est dĂ» Ă  l’optimisation du stockage.

Ignite Service Grid - Redémarrer

Que s'est-il passĂ© lorsque l'utilisateur a souhaitĂ© dĂ©ployer le service ?

  • Tous les nƓuds du cluster se sont abonnĂ©s pour mettre Ă  jour les donnĂ©es dans le stockage Ă  l'aide du mĂ©canisme de requĂȘte continue intĂ©grĂ©.
  • Le nƓud initiateur, dans le cadre d'une transaction en lecture validĂ©e, a créé un enregistrement dans la base de donnĂ©es contenant la configuration du service, y compris l'instance sĂ©rialisĂ©e.
  • Lorsqu'il est informĂ© d'une nouvelle entrĂ©e, le coordinateur calcule la rĂ©partition en fonction de la configuration. L'objet rĂ©sultant a Ă©tĂ© réécrit dans la base de donnĂ©es.
  • 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 sommes arrivĂ©s Ă  la conclusion : ce n’est pas ainsi qu’il faut travailler avec les services. Il y avait plusieurs raisons.

Si une erreur se produisait lors du dĂ©ploiement, elle ne pouvait ĂȘtre dĂ©couverte qu'Ă  partir des journaux du nƓud oĂč tout s'Ă©tait passĂ©. Il n'y avait qu'un dĂ©ploiement asynchrone, donc aprĂšs avoir rendu le contrĂŽle Ă  l'utilisateur Ă  partir de la mĂ©thode de dĂ©ploiement, un certain temps supplĂ©mentaire Ă©tait nĂ©cessaire pour dĂ©marrer le service - et pendant ce temps, l'utilisateur ne pouvait rien contrĂŽler. Afin de dĂ©velopper davantage Service Grid, de crĂ©er de nouvelles fonctionnalitĂ©s, d’attirer de nouveaux utilisateurs et de faciliter la vie de chacun, quelque chose doit changer.

Lors de la conception du nouveau Service Grid, nous avons avant tout souhaité apporter une garantie de déploiement synchrone : dÚs que l'utilisateur reprenait le contrÎle depuis l'API, il pouvait immédiatement utiliser les services. Je voulais également donner à l'initiateur la possibilité de gérer les erreurs de déploiement.

De plus, je souhaitais simplifier la mise en Ɠuvre, Ă  savoir s'Ă©loigner des transactions et du rééquilibrage. MalgrĂ© le fait que le cache soit rĂ©pliquĂ© et qu'il n'y ait pas d'Ă©quilibrage, des problĂšmes sont survenus lors d'un dĂ©ploiement Ă  grande Ă©chelle avec de nombreux nƓuds. Lorsque la topologie change, les nƓuds doivent Ă©changer des informations, et avec un dĂ©ploiement Ă  grande Ă©chelle, ces donnĂ©es peuvent peser lourd.

Lorsque la topologie était instable, le coordinateur devait recalculer la répartition des services. Et en général, lorsque vous devez travailler avec des transactions sur une topologie instable, cela peut conduire à des erreurs difficiles à prévoir.

ProblĂšmes

Que sont les changements globaux sans problĂšmes associĂ©s ? Le premier d’entre eux Ă©tait un changement de topologie. Vous devez comprendre qu'Ă  tout moment, mĂȘme au moment du dĂ©ploiement du service, un nƓud peut entrer ou sortir du cluster. De plus, si au moment du dĂ©ploiement le nƓud rejoint le cluster, il sera nĂ©cessaire de transfĂ©rer systĂ©matiquement toutes les informations sur les services vers le nouveau nƓud. Et nous ne parlons pas seulement de ce qui a dĂ©jĂ  Ă©tĂ© dĂ©ployĂ©, mais aussi des dĂ©ploiements actuels et futurs.

Ce n'est qu'un des problĂšmes qui peuvent ĂȘtre rassemblĂ©s dans une liste distincte :

  • Comment dĂ©ployer des services configurĂ©s statiquement au dĂ©marrage du nƓud ?
  • Quitter un nƓud du cluster : que faire si le nƓud hĂ©berge des services ?
  • Que faire si le coordinateur a changĂ© ?
  • Que faire si le client se reconnecte au cluster ?
  • Les demandes d’activation/dĂ©sactivation doivent-elles ĂȘtre traitĂ©es et comment ?
  • Et s’ils appelaient Ă  la destruction du cache et que des services d’affinitĂ© y Ă©taient liĂ©s ?

Et c'est loin d'ĂȘtre tout.

décision

Comme cible, nous avons choisi l’approche Event Driven avec la mise en Ɠuvre d’une communication processus Ă  l’aide de messages. Ignite implĂ©mente dĂ©jĂ  deux composants qui permettent aux nƓuds de transmettre des messages entre eux : communication-spi et Discovery-spi.

Ignite Service Grid - Redémarrer

Communication-spi permet aux nƓuds de communiquer directement et de transmettre des messages. Il est bien adaptĂ© Ă  l’envoi de grandes quantitĂ©s de donnĂ©es. Discovery-spi vous permet d'envoyer un message Ă  tous les nƓuds du cluster. Dans l’implĂ©mentation standard, cela se fait Ă  l’aide d’une topologie en anneau. Il existe Ă©galement une intĂ©gration avec Zookeeper, dans ce cas une topologie en Ă©toile est utilisĂ©e. Un autre point important Ă  noter est que Discovery-spi garantit que le message sera dĂ©finitivement transmis dans le bon ordre Ă  tous les nƓuds.

Regardons le protocole de déploiement. Toutes les demandes des utilisateurs pour le déploiement et le non-déploiement sont envoyées via Discovery-spi. Cela donne ce qui suit des garanties:

  • La demande sera reçue par tous les nƓuds du cluster. Cela permettra Ă  la demande de continuer Ă  ĂȘtre traitĂ©e lorsque le coordinateur changera. Cela signifie Ă©galement que dans un message, chaque nƓud disposera de toutes les mĂ©tadonnĂ©es nĂ©cessaires, telles que la configuration du service et son instance sĂ©rialisĂ©e.
  • Un ordre strict de livraison des messages permet de rĂ©soudre les conflits de configuration et les demandes concurrentes.
  • Étant donnĂ© que l'entrĂ©e du nƓud dans la topologie est Ă©galement traitĂ©e via Discovery-spi, le nouveau nƓud recevra toutes les donnĂ©es nĂ©cessaires pour travailler avec les services.

Lorsqu'une requĂȘte est reçue, les nƓuds du cluster la valident et crĂ©ent des tĂąches de traitement. Ces tĂąches sont mises en file d'attente puis traitĂ©es dans un autre thread par un travailleur distinct. Il est mis en Ɠuvre de cette maniĂšre car le dĂ©ploiement peut prendre beaucoup de temps et retarder de maniĂšre intolĂ©rable le flux de dĂ©couverte coĂ»teux.

Toutes les demandes de la file d'attente sont traitĂ©es par le gestionnaire de dĂ©ploiement. Il dispose d'un travailleur spĂ©cial qui extrait une tĂąche de cette file d'attente et l'initialise pour commencer le dĂ©ploiement. AprĂšs cela, les actions suivantes se produisent :

  1. Chaque nƓud calcule indĂ©pendamment la distribution grĂące Ă  une nouvelle fonction d'affectation dĂ©terministe.
  2. Les nƓuds gĂ©nĂšrent un message avec les rĂ©sultats du dĂ©ploiement et l'envoient au coordinateur.
  3. Le coordinateur regroupe tous les messages et gĂ©nĂšre le rĂ©sultat de l'ensemble du processus de dĂ©ploiement, qui est envoyĂ© via Discovery-spi Ă  tous les nƓuds du cluster.
  4. Lorsque le résultat est reçu, le processus de déploiement se termine, aprÚs quoi la tùche est supprimée de la file d'attente.

Ignite Service Grid - Redémarrer
Nouvelle conception basĂ©e sur les Ă©vĂ©nements : org.apache.ignite.internal.processors.service.IgniteServiceProcessor.java

Si une erreur survient lors du dĂ©ploiement, le nƓud inclut immĂ©diatement cette erreur dans un message qu'il envoie au coordinateur. AprĂšs l'agrĂ©gation des messages, le coordinateur disposera d'informations sur toutes les erreurs lors du dĂ©ploiement et enverra ce message via Discovery-spi. Les informations sur les erreurs seront disponibles sur n’importe quel nƓud du cluster.

Tous les Ă©vĂ©nements importants de Service Grid sont traitĂ©s Ă  l’aide de cet algorithme de fonctionnement. Par exemple, changer la topologie est Ă©galement un message via Discovery-spi. Et en gĂ©nĂ©ral, par rapport Ă  ce qui existait auparavant, le protocole s'est avĂ©rĂ© assez lĂ©ger et fiable. De quoi gĂ©rer n’importe quelle situation lors du dĂ©ploiement.

Que va-t-il se passer ensuite

Parlons maintenant des plans. Tout changement majeur apportĂ© au projet Ignite est rĂ©alisĂ© dans le cadre d'une initiative d'amĂ©lioration d'Ignite, appelĂ©e IEP. La refonte de Service Grid dispose Ă©galement d'un IEP - PEI #17 avec le titre moqueur « Vidange d’huile dans le rĂ©seau de service ». Mais en fait, nous n’avons pas changĂ© l’huile moteur, mais tout le moteur.

Nous avons divisĂ© les tĂąches du PEI en 2 phases. La premiĂšre est une phase majeure, qui consiste Ă  retravailler le protocole de dĂ©ploiement. Il est dĂ©jĂ  inclus dans le master, 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
  • Gestion des versions des services
  • TolĂ©rance aux pannes accrue
  • Client lĂ©ger
  • Outils de surveillance et de calcul de diverses mĂ©triques

Enfin, nous pouvons vous conseiller sur Service Grid pour crĂ©er des systĂšmes tolĂ©rants aux pannes et Ă  haute disponibilitĂ©. Nous vous invitons Ă©galement Ă  nous rendre visite au liste de dĂ©veloppement Đž liste d'utilisateur partagez votre expĂ©rience. Votre expĂ©rience est vraiment importante pour la communautĂ© ; elle vous aidera Ă  comprendre oĂč aller ensuite, comment dĂ©velopper le composant Ă  l'avenir.

Source: habr.com

Ajouter un commentaire