D'une maniĂšre ou d'une autre, historiquement, l'industrie informatique est divisĂ©e en deux camps conditionnels, quelle que soit la raison : ceux qui sont « pour » et ceux qui sont « contre ». De plus, l'objet des litiges peut ĂȘtre totalement arbitraire. Quel systĂšme d'exploitation est le meilleur : Win ou Linux ? Sur un smartphone Android ou iOS ? Devez-vous tout stocker dans les nuages ââou le mettre sur un stockage RAID froid et mettre les vis dans un coffre-fort ? Les personnes PHP ont-elles le droit dâĂȘtre appelĂ©es programmeurs ? Ces conflits sont parfois de nature exclusivement existentielle et nâont dâautre fondement que lâintĂ©rĂȘt sportif.
Il se trouve qu'avec l'avĂšnement des conteneurs et toute cette cuisine bien-aimĂ©e avec docker et k8 conditionnels, les dĂ©bats « pour » et « contre » l'utilisation de nouvelles capacitĂ©s dans divers domaines du backend ont commencĂ©. (RĂ©servons Ă l'avance que mĂȘme si Kubernetes sera le plus souvent indiquĂ© comme orchestrateur dans cette discussion, le choix de cet outil particulier n'a pas d'importance fondamentale. Au lieu de cela, vous pouvez le remplacer par tout autre qui vous semble le plus pratique et le plus familier. .)
Et, semble-t-il, il sâagirait dâun simple diffĂ©rend entre les deux faces dâune mĂȘme mĂ©daille. Aussi insensĂ© et impitoyable que l'Ă©ternelle confrontation entre Win et Linux, dans laquelle des personnes adĂ©quates existent quelque part au milieu. Mais dans le cas de la conteneurisation, tout nâest pas si simple. Habituellement, dans de tels litiges, il n'y a pas de bon cĂŽtĂ©, mais dans le cas de « l'utilisation » ou de la « non-utilisation » de conteneurs pour stocker des bases de donnĂ©es, tout bascule. Car dans un certain sens, les partisans comme les opposants de cette approche ont raison.
CÎté lumineux
Lâargument de Light Side peut ĂȘtre briĂšvement dĂ©crit en une seule phrase : « Bonjour, 2k19 est par la fenĂȘtre ! » Cela ressemble bien sĂ»r Ă du populisme, mais si lâon examine la situation en dĂ©tail, cela a ses avantages. Trions-les maintenant.
Disons que vous avez un grand projet Web. Il aurait pu ĂȘtre initialement construit sur la base d'une approche de microservice, ou Ă un moment donnĂ©, il y est parvenu par un chemin Ă©volutif - ce n'est pas trĂšs important, en fait. Vous avez dispersĂ© notre projet en microservices distincts, mis en place l'orchestration, l'Ă©quilibrage de charge et la mise Ă l'Ă©chelle. Et maintenant, la conscience tranquille, vous sirotez un mojito dans un hamac pendant les effets habra au lieu de relever les serveurs tombĂ©s. Mais dans toutes vos actions, vous devez ĂȘtre cohĂ©rent. TrĂšs souvent, seule lâapplication elle-mĂȘme (le code) est conteneurisĂ©e. Quâavons-nous dâautre Ă part le code ?
C'est vrai, les donnĂ©es. Le cĆur de tout projet rĂ©side dans ses donnĂ©es : il peut s'agir soit d'un SGBD typique - MySQL, Postgre, MongoDB, soit d'un stockage utilisĂ© pour la recherche (ElasticSearch), d'un stockage clĂ©-valeur pour la mise en cache - par exemple, redis, etc. Actuellement, nous ne le sommes pas. nous parlerons des options d'implĂ©mentation backend tordues lorsque la base de donnĂ©es plante en raison de requĂȘtes mal Ă©crites, et nous parlerons plutĂŽt de garantir la tolĂ©rance aux pannes de cette mĂȘme base de donnĂ©es sous la charge du client. AprĂšs tout, lorsque nous conteneurisons notre application et lui permettons d'Ă©voluer librement pour traiter un nombre illimitĂ© de requĂȘtes entrantes, cela augmente naturellement 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 s'exĂ©cute deviennent le chas de l'aiguille dans notre magnifique backend conteneurisĂ©. Dans le mĂȘme temps, le motif principal de la virtualisation des conteneurs est la mobilitĂ© et la flexibilitĂ© de la structure, qui nous permettent d'organiser le plus efficacement possible la rĂ©partition des pics de charge sur l'ensemble de l'infrastructure dont nous disposons. Autrement dit, si nous ne conteneurisons pas et ne dĂ©ployons pas tous les Ă©lĂ©ments existants du systĂšme dans le cluster, nous commettons une trĂšs grave erreur.
Il est beaucoup plus logique de regrouper non seulement l'application elle-mĂȘme, mais Ă©galement les services chargĂ©s de stocker les donnĂ©es. En regroupant et en dĂ©ployant des serveurs Web qui fonctionnent de maniĂšre indĂ©pendante et rĂ©partissent la charge entre eux dans les k8, nous rĂ©solvons dĂ©jĂ le problĂšme de la synchronisation des donnĂ©es - les mĂȘmes commentaires sur les publications, si nous prenons comme exemple une plate-forme de mĂ©dia ou de blog. Dans tous les cas, nous disposons dâune reprĂ©sentation intra-cluster, voire virtuelle, de la base de donnĂ©es en tant que ExternalService. Le problĂšme est que la base de donnĂ©es elle-mĂȘme n'est pas encore clusterisĂ©e - les serveurs Web dĂ©ployĂ©s dans le cube obtiennent des informations sur les modifications de notre base de donnĂ©es de combat statique, qui tourne sĂ©parĂ©ment.
Vous voyez le hic ? Nous utilisons k8s ou Swarm pour rĂ©partir la charge et Ă©viter la panne du serveur principal. serveur WebMais nous ne le faisons pas pour la base de donnĂ©es. Or, si la base de donnĂ©es tombe en panne, toute notre infrastructure en cluster devient inutilisable : Ă quoi bon afficher des pages web vides renvoyant des erreurs dâaccĂšs Ă la base de donnĂ©es ?
C'est pourquoi il est nĂ©cessaire de regrouper non seulement les serveurs Web, comme cela se fait habituellement, mais Ă©galement l'infrastructure des bases de donnĂ©es. Ce n'est qu'ainsi que nous pourrons garantir une structure qui fonctionne pleinement au sein d'une seule Ă©quipe, tout en Ă©tant indĂ©pendante les unes des autres. De plus, mĂȘme si la moitiĂ© de notre backend « s'effondre » sous la charge, le reste survivra, et le systĂšme de synchronisation des bases de donnĂ©es entre elles au sein du cluster et la possibilitĂ© d'Ă©voluer et de dĂ©ployer sans cesse de nouveaux clusters aideront Ă atteindre rapidement la capacitĂ© requise - si seulement il y avait des racks dans le centre de donnĂ©es.
De plus, le modĂšle de base de donnĂ©es distribuĂ© en clusters vous permet d'amener cette mĂȘme base de donnĂ©es lĂ oĂč elle est nĂ©cessaire ; Si nous parlons d'un service mondial, il est alors tout Ă fait illogique de crĂ©er un cluster Web quelque part dans la rĂ©gion de San Francisco et d'envoyer en mĂȘme temps des paquets lors de l'accĂšs Ă une base de donnĂ©es dans la rĂ©gion de Moscou et inversement.
De plus, la conteneurisation de la base de donnĂ©es vous permet de construire tous les Ă©lĂ©ments du systĂšme au mĂȘme niveau d'abstraction. Ce qui, Ă son tour, permet de gĂ©rer ce mĂȘme systĂšme directement Ă partir du code, par les dĂ©veloppeurs, sans la participation active des administrateurs. Les dĂ©veloppeurs pensaient qu'un SGBD distinct Ă©tait nĂ©cessaire pour le nouveau sous-projet - c'est simple ! j'ai Ă©crit un fichier yaml, je l'ai tĂ©lĂ©chargĂ© sur le cluster et vous avez terminĂ©.
Et bien entendu, le fonctionnement interne est grandement simplifiĂ©. Dites-moi, combien de fois avez-vous fermĂ© les yeux lorsqu'un nouveau membre de l'Ă©quipe a mis la main dans la base de donnĂ©es de combat pour le travail ? Lequel, en fait, est le seul que vous possĂ©dez et qui tourne en ce moment ? Bien sĂ»r, nous sommes tous des adultes ici, et quelque part nous avons une nouvelle sauvegarde, et encore plus loin - derriĂšre l'Ă©tagĂšre avec les concombres et les vieux skis de grand-mĂšre - une autre sauvegarde, peut-ĂȘtre mĂȘme dans une chambre froide, car votre bureau a dĂ©jĂ pris feu une fois. Mais tout de mĂȘme, chaque introduction d'un nouveau membre de l'Ă©quipe ayant accĂšs Ă l'infrastructure de combat et, bien sĂ»r, Ă la base de donnĂ©es de combat est un seau de validol pour tout le monde. Eh bien, qui le connaĂźt, un dĂ©butant, peut-ĂȘtre qu'il est croisĂ© ? C'est effrayant, vous en conviendrez.
La conteneurisation et, en fait, la topologie physique distribuée de la base de données de votre projet permettent d'éviter de tels moments de validation. Vous ne faites pas confiance à un débutant ? D'ACCORD! Donnons-lui son propre cluster avec lequel travailler et déconnectons la base de données des autres clusters - synchronisation uniquement par push manuel et rotation synchrone de deux clés (une pour le chef d'équipe, l'autre pour l'administrateur). Et tout le monde est content.
Et maintenant, il est temps de se muer en opposants au clustering de bases de données.
CÎté obscur
Lorsqu'on se demande pourquoi il n'est pas judicieux de conteneuriser la base de donnĂ©es et de continuer Ă l'exĂ©cuter sur un serveur central, il convient de se pencher sur la question. serveurĂvitons de nous abaisser Ă des rhĂ©toriques orthodoxes et Ă des affirmations comme « Nos grands-pĂšres construisaient des bases de donnĂ©es sur du matĂ©riel, et nous ferons de mĂȘme ! ». Essayons plutĂŽt d'imaginer une situation dans laquelle la conteneurisation apporterait rĂ©ellement des avantages concrets.
D'accord, les projets qui nĂ©cessitent vraiment une base dans un conteneur ne peuvent pas ĂȘtre comptĂ©s sur les doigts d'une main par le meilleur opĂ©rateur de fraiseuse. Pour la plupart, mĂȘme l'utilisation de K8 ou de Docker Swarm elle-mĂȘme est redondante - on a trĂšs souvent recours Ă ces outils en raison du battage mĂ©diatique gĂ©nĂ©ral des technologies et de l'attitude du « tout-puissant » en la personne des sexes pour tout pousser dans le nuages ââet conteneurs. Eh bien, parce que maintenant c'est Ă la mode et tout le monde le fait.
Dans au moins la moitiĂ© des cas, utiliser Kubernetis ou simplement Docker sur un projet est redondant. Le problĂšme est que toutes les Ă©quipes ou sociĂ©tĂ©s dâexternalisation engagĂ©es pour maintenir lâinfrastructure du client nâen sont pas conscientes. Câest pire quand les conteneurs sont imposĂ©s, car cela coĂ»te une certaine quantitĂ© de piĂšces au client.
En gĂ©nĂ©ral, il existe une opinion selon laquelle la mafia des dockers/cubes Ă©crase bĂȘtement les clients qui sous-traitent ces problĂšmes d'infrastructure. AprĂšs tout, pour travailler avec des clusters, nous avons besoin d'ingĂ©nieurs capables et comprenant gĂ©nĂ©ralement l'architecture de la solution implĂ©mentĂ©e. Nous avons dĂ©jĂ dĂ©crit notre cas avec la publication Republic - nous y avons formĂ© l'Ă©quipe du client pour qu'elle travaille dans les rĂ©alitĂ©s de Kubernetis, et tout le monde Ă©tait satisfait. Et c'Ă©tait convenable. Souvent, les « exĂ©cutants » de K8 prennent l'infrastructure du client en otage - car maintenant eux seuls comprennent comment tout fonctionne lĂ -bas ; il n'y a pas de spĂ©cialistes du cĂŽtĂ© du client.
Imaginez maintenant que de cette maniĂšre nous externalisons non seulement la partie serveur web, mais Ă©galement la maintenance de la base de donnĂ©es. Nous avons dit que la BD est le cĆur et que la perte du cĆur est mortelle pour tout organisme vivant. Bref, les perspectives ne sont pas des meilleures. Ainsi, au lieu du battage mĂ©diatique Kubernetis, de nombreux projets ne devraient tout simplement pas se soucier du tarif normal pour AWS, ce qui rĂ©soudra tous les problĂšmes de charge sur leur site/projet. Mais AWS n'est plus Ă la mode et les frimeurs valent plus que l'argent - malheureusement, dans l'environnement informatique aussi.
D'ACCORD. Peut-ĂȘtre que le projet a vraiment besoin d'un clustering, mais si tout est clair avec les applications sans Ă©tat, comment pouvons-nous organiser une connectivitĂ© rĂ©seau dĂ©cente pour une base de donnĂ©es en cluster ?
Si nous parlons d'une solution d'ingĂ©nierie transparente, ce qu'est la transition vers k8s, alors notre principal casse-tĂȘte est la rĂ©plication des donnĂ©es dans une base de donnĂ©es en cluster. Certains SGBD sont initialement assez fidĂšles Ă la rĂ©partition des donnĂ©es entre leurs instances individuelles. Beaucoup dâautres ne sont pas aussi accueillants. Et bien souvent, le principal argument dans le choix d'un SGBD pour notre projet n'est pas la capacitĂ© de le rĂ©pliquer avec des coĂ»ts de ressources et d'ingĂ©nierie minimes. Surtout si le projet n'Ă©tait pas initialement prĂ©vu comme un microservice, mais Ă©voluait simplement dans cette direction.
Nous pensons qu'il n'est pas nĂ©cessaire de parler de la vitesse des lecteurs rĂ©seau : ils sont lents. Ceux. Nous n'avons toujours pas de rĂ©elle opportunitĂ©, si quelque chose se produit, de redĂ©marrer une instance de SGBD quelque part oĂč il y a plus, par exemple de puissance de processeur ou de RAM libre. Nous aborderons trĂšs rapidement les performances du sous-systĂšme de disque virtualisĂ©. En consĂ©quence, le SGBD doit ĂȘtre connectĂ© Ă son propre ensemble personnel de machines situĂ©es Ă proximitĂ© immĂ©diate. Ou il est nĂ©cessaire de refroidir sĂ©parĂ©ment une synchronisation des donnĂ©es suffisamment rapide pour les rĂ©serves supposĂ©es.
Poursuivant le sujet des systĂšmes de fichiers virtuels : les volumes Docker, malheureusement, ne sont pas sans problĂšmes. En gĂ©nĂ©ral, en matiĂšre de stockage fiable de donnĂ©es Ă long terme, j'aimerais me contenter des schĂ©mas les plus simples techniquement. Et ajouter une nouvelle couche dâabstraction du FS du conteneur au FS de lâhĂŽte parent est un risque en soi. Mais lorsque le fonctionnement du systĂšme de support de conteneurisation rencontre Ă©galement des difficultĂ©s de transmission des donnĂ©es entre ces couches, alors câest vraiment un dĂ©sastre. Ă lâheure actuelle, la plupart des problĂšmes connus de lâhumanitĂ© progressiste semblent avoir Ă©tĂ© Ă©radiquĂ©s. Mais vous lâaurez compris, plus le mĂ©canisme est complexe, plus il se casse facilement.
Ă la lumiĂšre de toutes ces « aventures », il est beaucoup plus rentable et plus facile de conserver la base de donnĂ©es au mĂȘme endroit, et mĂȘme si vous devez conteneuriser l'application, laissez-la s'exĂ©cuter seule et, via la passerelle de distribution, recevez une communication simultanĂ©e avec le base de donnĂ©es, qui ne sera lue et Ă©crite quâune seule fois et au mĂȘme endroit. Cette approche rĂ©duit au minimum le risque d'erreurs et de dĂ©synchronisation.
Vers quoi mĂšne-t-on ? De plus, la conteneurisation des bases de donnĂ©es est appropriĂ©e lĂ oĂč il existe un rĂ©el besoin. Vous ne pouvez pas remplir une base de donnĂ©es complĂšte dâapplications et la faire tourner comme si vous disposiez de deux douzaines de microservices â cela ne fonctionne pas de cette façon. Et cela doit ĂȘtre clairement compris.
Au lieu de sortie
Si vous attendez une conclusion claire « virtualiser ou non la base de données », alors nous vous décevrons : elle ne sera pas là . Car lors de la création d'une solution d'infrastructure, il ne faut pas se laisser guider par la mode et le progrÚs, mais avant tout par le bon sens.
Il existe des projets pour lesquels les principes et les outils fournis avec Kubernetis s'adaptent parfaitement, et dans de tels projets, la paix rĂšgne au moins dans le domaine du backend. Et il y a des projets qui n'ont pas besoin de conteneurisation, mais d'une infrastructure de serveur normale, car ils ne peuvent fondamentalement pas ĂȘtre adaptĂ©s au modĂšle de cluster de microservices, car ils tomberont.
Source: habr.com
