Il s'est historiquement Ă©tabli que l'industrie informatique se divise en deux camps conditionnels : ceux qui sont "pour" et ceux qui sont "contre". Et les sujets de dĂ©bat peuvent ĂȘtre absolument arbitraires. Quel est le meilleur systĂšme d'exploitation : Windows ou Linux ? Sur un smartphone, Android ou iOS ? Stocker tout dans le cloud ou le transfĂ©rer sur des dispositifs RAID froids et mettre les disques dans un coffre-fort ? Les dĂ©veloppeurs PHP ont-ils le droit de se faire appeler programmeurs ? Ces dĂ©bats sont parfois d'une nature purement existentielle et ne reposent sur aucune autre base, Ă part l'intĂ©rĂȘt sportif.
Il se trouve qu'avec l'apparition des conteneurs et de toute cette cuisine que nous aimons tant avec Docker et le Kubernetes supposĂ©, les dĂ©bats "pour" et "contre" l'utilisation de nouvelles possibilitĂ©s dans divers domaines de backend ont commencĂ©. (PrĂ©cisons d'emblĂ©e que, bien que Kubernetes soit souvent citĂ© comme orchestrateur dans ce raisonnement, le choix de cet outil en particulier n'est pas fondamental. N'importe quel autre outil que vous jugez plus pratique et familier peut ĂȘtre substituĂ© Ă celui-ci.)
Et, on pourrait penser qu'il s'agissait d'un simple dĂ©bat entre deux cĂŽtĂ©s d'une mĂȘme mĂ©daille. Tout aussi inutile et implacable que l'Ă©ternelle rivalitĂ© entre Windows et Linux, oĂč des personnes sensĂ©es existent quelque part au milieu. Cependant, dans le cas de la conteneurisation, tout n'est pas si simple. Dans de tels dĂ©bats, il n'y a gĂ©nĂ©ralement pas de partie droite, mais dans le cas de "utiliser" ou "ne pas utiliser" des conteneurs pour le stockage des bases de donnĂ©es, tout devient sens dessus dessous. Car, dans un certain sens, tant les partisans que les adversaires de cette approche ont raison.
CÎté lumineux
Décrire briÚvement l'argumentation du CÎté lumineux en une phrase : "Eh, 2019 est dehors !" Cela peut sembler du populisme, sans aucun doute, mais en approfondissant la question, il y a ses avantages. C'est ce que nous allons explorer maintenant.
Imaginons que vous ayez un grand projet web. Il a pu ĂȘtre initialement construit sur la base d'une approche microservices, ou bien il y est arrivĂ© par un chemin Ă©volutif Ă un moment donnĂ© â cela n'a pas vraiment d'importance, en fait. Vous avez rĂ©parti votre projet en diffĂ©rents microservices, configurĂ© l'orchestration, l'Ă©quilibrage de charge, le scaling. Et maintenant, en toute tranquillitĂ©, vous sirotez un mojito dans un hamac pendant les effets de Habr au lieu de redĂ©marrer des serveurs tombĂ©s. Mais dans toutes ces actions, il faut ĂȘtre cohĂ©rent. TrĂšs souvent, seul le code de l'application elle-mĂȘme est containerisĂ©. Et qu'avons-nous d'autre en plus du code ?
C'est exact, les donnĂ©es. Le cĆur de tout projet ce sont ses donnĂ©es : cela peut ĂȘtre une base de donnĂ©es typique comme MySQL, Postgre, MongoDB, ou des stockages utilisĂ©s pour la recherche (ElasticSearch), et des stockages clĂ©-valeur pour le caching â par exemple, redis, etc. Pour le moment, nous ne parlerons pas des solutions de backend problĂ©matiques oĂč la base de donnĂ©es Ă©choue Ă cause de requĂȘtes mal Ă©crites, mais nous discuterons plutĂŽt de la mise en place de la rĂ©silience de cette base de donnĂ©es sous la charge des clients. En effet, lorsque nous containerisons notre application et lui permettons de se redimensionner librement pour traiter n'importe quel nombre de requĂȘtes entrantes, cela augmente inĂ©vitablement la charge sur la base de donnĂ©es.
En fait, le canal d'accÚs à la base de données et le serveur sur lequel elle fonctionne deviennent le goulot d'étranglement dans notre magnifique backend containerisé. Le principal objectif de la virtualisation par conteneur est la mobilité et la flexibilité de la structure, permettant d'organiser la répartition de la charge de pointe sur toute l'infrastructure disponible de la maniÚre la plus efficace possible. Ainsi, si nous ne containerisons pas et ne déployons pas tous les éléments du systÚme sur un cluster, nous commettons une trÚs grave erreur.
Il est beaucoup plus logique de clusteriser non seulement l'application elle-mĂȘme, mais aussi les services chargĂ©s du stockage des donnĂ©es. Lors de la clusterisation et du dĂ©ploiement de serveurs web indĂ©pendants qui rĂ©partissent la charge entre eux dans k8s, nous rĂ©solvons dĂ©jĂ le problĂšme de synchronisation des donnĂ©es â comme les commentaires sur les publications, pour prendre l'exemple d'un mĂ©dia ou d'une plateforme de blog. Nous avons de toute façon une reprĂ©sentation interne du cluster, mĂȘme si elle est virtuelle, de la base de donnĂ©es en tant que ExternalService. La question est que la base de donnĂ©es elle-mĂȘme n'est pas encore clusterisĂ©e â les serveurs web dĂ©ployĂ©s dans le cluster obtiennent les informations sur les changements de notre base de donnĂ©es statique qui fonctionne sĂ©parĂ©ment.
Vous sentez un piĂšge ? Nous utilisons k8s ou Swarm pour rĂ©partir la charge et Ă©viter que le principal serveur web, mais nous ne faisons pas cela pour la base de donnĂ©es. Mais si la base de donnĂ©es tombe, alors il n'y a aucun sens dans notre infrastructure clusterisĂ©e â Ă quoi bon des pages web vides qui renvoient une erreur d'accĂšs Ă la base de donnĂ©es ?
C'est pourquoi il est nĂ©cessaire de clusteriser non seulement les serveurs web, comme c'est gĂ©nĂ©ralement fait, mais aussi l'infrastructure de la base de donnĂ©es. Ce n'est qu'ainsi que nous pouvons garantir une structure pleinement fonctionnelle, mais Ă la fois indĂ©pendante, qui travaillera ensemble. MĂȘme si la moitiĂ© de notre backend "s'effondre" sous la charge, l'autre moitiĂ© survivra, et le systĂšme de synchronisation de la base de donnĂ©es entre eux dans le cluster ainsi que la possibilitĂ© d'une scalabilitĂ© infinie et de dĂ©ploiement de nouveaux clusters aidera Ă atteindre rapidement les capacitĂ©s nĂ©cessaires â tant qu'il y a des racks dans le centre de donnĂ©es.
De plus, le modĂšle de base de donnĂ©es distribuĂ© en clusters permet de dĂ©placer cette base de donnĂ©es lĂ oĂč elle est nĂ©cessaire ; si nous parlons d'un service global, il est assez illogique d'avoir un cluster web quelque part prĂšs de San Francisco tout en dirigeant les paquets vers la base de donnĂ©es en Russie et de retour.
De plus, la conteneurisation de la base de donnĂ©es permet de construire tous les Ă©lĂ©ments du systĂšme Ă un mĂȘme niveau d'abstraction. Ce qui, en retour, rend possible la gestion de ce systĂšme directement depuis le code, par les dĂ©veloppeurs, sans avoir besoin d'impliquer activement les administrateurs. Les dĂ©veloppeurs ont pensĂ© qu'il leur fallait une base de donnĂ©es distincte pour un nouveau sous-projet â facile ! ils ont Ă©crit un fichier yaml, l'ont chargĂ© dans le cluster et c'est prĂȘt.
Et bien sĂ»r, l'exploitation interne est simplifiĂ©e de maniĂšre significative. Dites-moi, combien de fois avez-vous fermĂ© les yeux lorsque qu'un nouveau membre de l'Ă©quipe a tentĂ© d'accĂ©der Ă la base de donnĂ©es en production ? Celle que vous avez, au fait, est unique et tourne justement en ce moment ? Bien sĂ»r, nous sommes tous des adultes ici, et quelque part, nous avons une sauvegarde rĂ©cente, et plus loin - derriĂšre l'Ă©tagĂšre avec les concombres de grand-mĂšre et les vieux skis - une autre sauvegarde, peut-ĂȘtre mĂȘme sur un stockage froid, parce qu'un jour, votre bureau a dĂ©jĂ brĂ»lĂ©. Mais quand mĂȘme, chaque nouvel ajout Ă l'Ă©quipe ayant accĂšs Ă l'infrastructure de production et, bien sĂ»r, Ă la base de donnĂ©es en production, c'est un seau de valium pour tout le monde. Qui sait, peut-ĂȘtre que ce novice est malhabile ? Terrifiant, n'est-ce pas ?
La conteneurisation et, en fait, la topologie physique distribuée de la base de données de votre projet aident à éviter de tels moments de stress. Vous ne faites pas confiance au débutant ? D'accord ! Créons-lui un cluster à lui pour travailler et déconnectons-le des autres clusters de la base de données - la synchronisation se fera uniquement par poussée manuelle et activation synchronisée de deux clés (une pour le leader, l'autre pour l'administrateur). Et tout le monde est heureux.
Il est maintenant temps de se transformer en opposants à la clusterisation des bases de données.
CÎté Obscur
En rĂ©flĂ©chissant Ă pourquoi il ne faut pas conteneuriser la base de donnĂ©es et continuer Ă l'exploiter sur un systĂšme central le serveur, ne tombons pas dans la rhĂ©torique des orthodoxes et dans des affirmations comme « nos ancĂȘtres faisaient tourner les bases de donnĂ©es sur du matĂ©riel, et nous le ferons ! » Au lieu de cela, essayons d'imaginer une situation dans laquelle la conteneurisation apporterait vraiment des dividendes significatifs.
Soyons d'accord, les projets qui nĂ©cessitent rĂ©ellement une base dans un conteneur peuvent ĂȘtre comptĂ©s sur les doigts d'une main mĂȘme d'un fraiseur moyen. Dans la plupart des cas, mĂȘme l'utilisation de k8s ou de Docker Swarm est redondante - ces outils sont souvent employĂ©s en raison de l'engouement gĂ©nĂ©ral pour ces technologies et des conseils d'en haut pour tout passer dans le cloud et les conteneurs. Oui, parce que c'est Ă la mode et que tout le monde le fait.
Dans au moins la moitié des cas, utiliser Kubernetes ou simplement Docker pour un projet est excessif. Le problÚme, c'est que toutes les équipes ou entreprises de sous-traitance engagées pour gérer l'infrastructure du client ne se rendent pas compte de cela. Pire encore, lorsque les conteneurs sont imposés parce qu'ils coûtent un certain montant au client.
En fait, il est communĂ©ment admis que la mafia Docker/Kubernetes Ă©crase littĂ©ralement les clients qui confient ces questions d'infrastructure Ă la sous-traitance. Pour travailler avec des clusters, il faut des ingĂ©nieurs capables de le faire et qui comprennent l'architecture de la solution mise en place. Nous avons dĂ©jĂ dĂ©crit notre cas avec le publication Republic â lĂ , nous avons formĂ© l'Ă©quipe du client Ă travailler dans le contexte de Kubernetes, et tout le monde Ă©tait satisfait. Et c'Ă©tait honnĂȘte. Souvent, les 'implĂ©menteurs' de Kubernetes prennent l'infrastructure du client en otage â car maintenant, seuls eux comprennent comment tout fonctionne, alors que le client n'a pas de spĂ©cialistes.
Et maintenant imaginez que nous confions non seulement la partie serveur web Ă la sous-traitance, mais aussi la gestion de la base de donnĂ©es. Nous avons dit que la base de donnĂ©es est le cĆur, et perdre le cĆur est fatal pour tout organisme vivant. En gros, les perspectives ne sont pas les meilleures. Donc, au lieu du Kubernetes Ă la mode, de nombreux projets devraient simplement ne pas hĂ©siter Ă investir dans un tarif normal chez AWS, qui rĂ©soudrait tous leurs problĂšmes de charge sur leur site/projet. Mais AWS n'est plus Ă la mode, et les apparences sont plus importantes que l'argent â malheureusement, c'est aussi le cas dans le domaine de l'informatique.
D'accord. Peut-ĂȘtre que la mise en cluster est rĂ©ellement nĂ©cessaire pour le projet, mais si tout est clair avec les applications sans Ă©tat, comment alors assurer une connectivitĂ© rĂ©seau adĂ©quate pour une base de donnĂ©es en cluster?
Lorsque nous parlons d'une solution d'ingénierie sans couture, qui est ce que représente la transition vers k8s, notre principale préoccupation est la réplique des données dans une base de données clusterisée. Certaines SGBD sont au départ assez conciliantes quant à la distribution des données entre leurs différentes instances. D'autres, en revanche, ne sont pas si accueillants. Et souvent, le principal critÚre pour choisir un SGBD pour notre projet n'est pas tant sa capacité à se répliquer avec des coûts matériels et d'ingénierie minimaux. Surtout si le projet n'était pas initialement prévu comme microservices, mais a simplement évolué dans cette direction.
Nous pensons qu'il n'est pas nĂ©cessaire de parler de la vitesse des disques rĂ©seau â ils sont lents. C'est-Ă -dire que, s'il y a besoin, nous n'avons pas la possibilitĂ© de relancer une instance de SGBD ailleurs, par exemple lĂ oĂč il y a plus de puissance processeur ou de mĂ©moire vive disponible. Nous allons rapidement atteindre la limite de performance du sous-systĂšme de disques virtualisĂ©s. En consĂ©quence, le SGBD doit ĂȘtre attachĂ© Ă son propre ensemble de machines personnelles, situĂ©es Ă proximitĂ© directe. Sinon, il faut trouver un moyen de synchroniser sĂ©parĂ©ment les donnĂ©es assez rapidement vers les rĂ©serves prĂ©vues.
Pour continuer sur le sujet des systĂšmes de fichiers virtuels : les volumes Docker, malheureusement, ne sont pas sans problĂšme. Dans l'ensemble, pour une tĂąche telle que le stockage fiable Ă long terme des donnĂ©es, il faudrait se contenter de schĂ©mas techniques aussi simples que possible. L'ajout d'une nouvelle couche d'abstraction entre le systĂšme de fichiers du conteneur et celui de l'hĂŽte parent constitue dĂ©jĂ un risque en soi. Mais quand, en plus, des difficultĂ©s surgissent dans le systĂšme de conteneurisation concernant la transmission des donnĂ©es entre ces couches, c'est vraiment problĂ©matique. Ă l'heure actuelle, la plupart des problĂšmes connus et progressifs semblent ĂȘtre Ă©radiquĂ©s. Mais vous comprenez, plus le mĂ©canisme est complexe, plus il est susceptible de se briser.
Ă la lumiĂšre de toutes ces « aventures », il est beaucoup plus avantageux et simple de garder la base de donnĂ©es Ă un seul endroit. MĂȘme si vous avez besoin de la conteneuriser, laissez-la fonctionner de maniĂšre autonome et passez par une passerelle de rĂ©partition pour Ă©tablir une connexion simultanĂ©e avec une base de donnĂ©es qui ne sera lue et Ă©crite qu'une seule fois, Ă un seul endroit. Cette approche rĂ©duit la probabilitĂ© d'erreurs et de dĂ©synchronisations au minimum.
OĂč voulons-nous en venir ? Au fait que la conteneurisation de la base de donnĂ©es n'est pertinente que lĂ oĂč il y a un vrai besoin. On ne peut pas emballer une base SaaS complĂšte et la faire fonctionner comme si vous aviez une vingtaine de microservices â ça ne fonctionne pas ainsi. Et il est crucial de comprendre cela.
Au lieu d'une conclusion
Si vous attendez une réponse claire à la question « virtualiser ou non la base de données », nous sommes désolés : elle n'existe pas ici. Parce qu'à la création de toute solution d'infrastructure, il faut se guider non pas par la mode et le progrÚs, mais avant tout, par le bon sens.
Il existe des projets pour lesquels les principes et outils liĂ©s Ă Kubernetes s'appliquent parfaitement, et dans de tels projets, il y a une certaine harmonie, au moins dans le domaine du backend. Et puis il y a des projets qui nĂ©cessitent non pas la conteneurisation, mais une infrastructure serveur normale, car ils ne peuvent tout simplement pas ĂȘtre redimensionnĂ©s selon un modĂšle de cluster microservices, sinon ils Ă©choueront.
Source : habr.com
