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. . Un événement important dans la vie de cette communauté fut la restructuration de la composante , 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 , ingénieur logiciel et contributeur Apache Ignite depuis plus de deux ans.

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.

Ă 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.

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.

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.

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 :
- Chaque nĆud calcule indĂ©pendamment la distribution grĂące Ă une nouvelle fonction d'affectation dĂ©terministe.
- Les nĆuds gĂ©nĂšrent un message avec les rĂ©sultats du dĂ©ploiement et l'envoient au coordinateur.
- 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.
- 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.

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 - 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 Đž 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
