{"id":92570,"date":"2020-08-28T19:42:21","date_gmt":"2020-08-28T17:42:21","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker"},"modified":"2020-08-28T19:42:21","modified_gmt":"2020-08-28T17:42:21","slug":"modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Introduction<\/h1>\n<p><\/p>\n<p>Il y a quelque temps, on m'a confi\u00e9 la t\u00e2che de d\u00e9velopper un cluster tol\u00e9rant aux pannes pour <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, fonctionnant dans plusieurs centres de donn\u00e9es, interconnect\u00e9s par fibre optique dans une m\u00eame ville, et capable de r\u00e9sister \u00e0 la d\u00e9faillance (par exemple, une coupure de courant) d'un centre de donn\u00e9es. Pour le logiciel responsable de la tol\u00e9rance aux pannes, j'ai choisi <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, car c'est la solution officielle de RedHat pour cr\u00e9er des clusters tol\u00e9rants aux pannes. Elle est appr\u00e9ci\u00e9e car RedHat en assure le support, et c'est une solution universelle (modulaire). Gr\u00e2ce \u00e0 elle, il sera possible d'assurer la tol\u00e9rance aux pannes non seulement pour PostgreSQL, mais aussi pour d'autres services, que ce soit en utilisant des modules standards ou en les cr\u00e9ant pour des besoins sp\u00e9cifiques.<\/p>\n<p><\/p>\n<p>\u00c0 cette solution, une question l\u00e9gitime s'est pos\u00e9e : dans quelle mesure un cluster tol\u00e9rant aux pannes sera-t-il r\u00e9ellement tol\u00e9rant aux pannes ? Pour le d\u00e9couvrir, j'ai d\u00e9velopp\u00e9 un banc d'essai qui simule diverses pannes sur les n\u0153uds du cluster, attend la reprise du fonctionnement, restaure le n\u0153ud d\u00e9faillant et continue le test en boucle. Au d\u00e9part, ce projet s'appelait hapgsql, mais avec le temps, je me suis lass\u00e9 d'un nom comportant si peu de voyelles. J'ai donc commenc\u00e9 \u00e0 nommer les bases de donn\u00e9es tol\u00e9rantes aux pannes (et l'IP flottante qui les d\u00e9signe) <strong>krogan<\/strong> (un personnage d'un jeu vid\u00e9o qui a tous ses organes vitaux doubl\u00e9s), tandis que les n\u0153uds, les clusters et le projet lui-m\u00eame s'appellent <strong>tuchanka<\/strong> (la plan\u00e8te habit\u00e9e par les krogan).<\/p>\n<p><\/p>\n<p>Actuellement, la direction a autoris\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">\u00e0 ouvrir le projet \u00e0 la communaut\u00e9 open source sous licence MIT<\/a><\/noindex>. Le README sera bient\u00f4t traduit en anglais (car les principaux utilisateurs devraient \u00eatre les d\u00e9veloppeurs de Pacemaker et PostgreSQL), et j'ai d\u00e9cid\u00e9 de pr\u00e9senter la vieille version russe du README (en partie) sous la forme de cet article.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/7ebb04b3e56337060e981da319192a28.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Les clusters sont d\u00e9ploy\u00e9s sur des machines virtuelles <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. Au total, 12 machines virtuelles seront d\u00e9ploy\u00e9es (pour un total de 36GiB), qui formeront 4 clusters tol\u00e9rants aux pannes (diff\u00e9rentes options). Les deux premiers clusters sont compos\u00e9s de deux serveurs PostgreSQL, situ\u00e9s dans diff\u00e9rents centres de donn\u00e9es, et d'un serveur g\u00e9n\u00e9ral <em>witness<\/em> c <strong>quorum device<\/strong> (situ\u00e9 sur une machine virtuelle bon march\u00e9 dans un troisi\u00e8me centre de donn\u00e9es), qui r\u00e9sout l'incertitude <strong>50%\/50%<\/strong>, en donnant sa voix \u00e0 l'une des parties. Le troisi\u00e8me cluster se compose de trois centres de donn\u00e9es : un ma\u00eetre, deux esclaves, sans <strong>quorum device<\/strong>. Le quatri\u00e8me cluster se compose de quatre serveurs PostgreSQL, deux par centre de donn\u00e9es : un ma\u00eetre et les autres en tant que r\u00e9pliques, et utilise aussi <em>witness<\/em> c <strong>quorum device<\/strong>. Le quatri\u00e8me supporte la d\u00e9faillance de deux serveurs ou d'un centre de donn\u00e9es. Cette solution peut \u00eatre, si n\u00e9cessaire, \u00e9tendue \u00e0 un plus grand nombre de r\u00e9pliques.<\/p>\n<p><\/p>\n<p>Service de temps pr\u00e9cis <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> est \u00e9galement reconfigur\u00e9 pour la r\u00e9silience, mais utilise la m\u00e9thode du <code>ntpd<\/code> (<em>mode orphelin<\/em>). Le serveur principal <em>witness<\/em> sert de serveur NTP central, distribuant son temps \u00e0 tous les clusters, synchronisant ainsi tous les serveurs entre eux. Si <em>witness<\/em> tombe en panne ou se retrouve isol\u00e9, l'un des serveurs du cluster commencera alors \u00e0 distribuer son temps (au sein du cluster). Un cache aux <strong>proxy HTTP<\/strong> a \u00e9galement \u00e9t\u00e9 configur\u00e9 sur <em>witness<\/em>, permettant aux autres machines virtuelles d'acc\u00e9der aux d\u00e9p\u00f4ts Yum. En r\u00e9alit\u00e9, des services tels que le temps pr\u00e9cis et le proxy seront probablement h\u00e9berg\u00e9s sur des serveurs d\u00e9di\u00e9s, et dans cette configuration, ils sont plac\u00e9s sur <em>witness<\/em> uniquement pour \u00e9conomiser sur le nombre de machines virtuelles et l'espace.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versions<\/h1>\n<p><\/p>\n<p>v0. Fonctionne avec CentOS 7 et PostgreSQL 11 sur VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Structure des clusters<\/h1>\n<p><\/p>\n<p>Tous les clusters sont destin\u00e9s \u00e0 \u00eatre h\u00e9berg\u00e9s dans plusieurs centres de donn\u00e9es, regroup\u00e9s dans un r\u00e9seau plat et doivent r\u00e9sister \u00e0 la d\u00e9faillance ou \u00e0 l'isolement d'un centre de donn\u00e9es. Par cons\u00e9quent, <strong>est impossible<\/strong> utiliser pour se prot\u00e9ger contre <strong>le split-brain<\/strong> la technologie standard Pacemaker, appel\u00e9e <em>STONITH<\/em> (Shoot The Other Node In The Head) ou <em>fencing<\/em>. Son principe : si les n\u0153uds dans le cluster commencent \u00e0 soup\u00e7onner qu'un n\u0153ud est d\u00e9fectueux, qu'il ne r\u00e9pond pas ou se comporte de mani\u00e8re incorrecte, ils le d\u00e9connectent de force via des dispositifs \u00ab externes \u00bb, par exemple, une carte de gestion IPMI ou un UPS. Mais cela ne fonctionnera que dans les cas o\u00f9, en cas de d\u00e9faillance unique d'un serveur, l'IPMI ou l'UPS continuent de fonctionner. Ici, une protection contre une d\u00e9faillance beaucoup plus catastrophique est pr\u00e9vue, lorsque tout le centre de donn\u00e9es tombe en panne (par exemple, manque d'alimentation). Et dans un tel cas, tous les <em>dispositifs stonith<\/em>(IPMI, UPS, etc.) ne fonctionneront \u00e9galement pas.<\/p>\n<p><\/p>\n<p>Au lieu de cela, le syst\u00e8me repose sur l'id\u00e9e de quorum. Tous les n\u0153uds ont une voix, et seuls ceux qui voient plus de la moiti\u00e9 de tous les n\u0153uds peuvent fonctionner. Ce nombre, \u00ab moiti\u00e9+1 \u00bb, s'appelle <strong>quorum<\/strong>. Si le quorum n'est pas atteint, le n\u0153ud d\u00e9cide qu'il est en isolation r\u00e9seau et doit d\u00e9sactiver ses ressources, c'est-\u00e0-dire que c'est une sorte de <strong>protection contre le split-brain<\/strong>. Si le logiciel responsable de ce comportement ne fonctionne pas, un watchdog, par exemple bas\u00e9 sur IPMI, doit intervenir.<\/p>\n<p><\/p>\n<p>Si le nombre de n\u0153uds est pair (cluster dans deux centres de donn\u00e9es), une incertitude appel\u00e9e peut survenir <strong>50%\/50%<\/strong> (<em>fifty-fifty<\/em>), lorsque l'isolation r\u00e9seau divise le cluster exactement en deux. C'est pourquoi, pour un nombre pair de n\u0153uds, on ajoute <strong>quorum device<\/strong> \u2014 un d\u00e9mon peu exigeant qui peut \u00eatre ex\u00e9cut\u00e9 sur la machine virtuelle la moins ch\u00e8re dans le troisi\u00e8me centre de donn\u00e9es. Il donne sa voix \u00e0 l'un des segments (qu'il voit), et ainsi r\u00e9sout l'incertitude 50%\/50%. Le serveur sur lequel sera ex\u00e9cut\u00e9 le dispositif de quorum, je l'ai appel\u00e9 <em>witness<\/em> (terminologie de repmgr, que j'ai aim\u00e9e).<\/p>\n<p><\/p>\n<p>Les ressources peuvent \u00eatre transf\u00e9r\u00e9es d'un endroit \u00e0 un autre, par exemple, des serveurs d\u00e9fectueux aux serveurs fonctionnels, ou sur ordre des administrateurs syst\u00e8me. Pour que les clients sachent o\u00f9 se trouvent les ressources dont ils ont besoin (o\u00f9 se connecter ?), on utilise <em>IP flottants<\/em> (<strong>IP flottant<\/strong>). Ce sont des IP que Pacemaker peut d\u00e9placer d'un n\u0153ud \u00e0 l'autre (tout est dans un r\u00e9seau plat). Chacun d'eux symbolise une ressource (service) et sera l\u00e0 o\u00f9 il faut se connecter pour acc\u00e9der \u00e0 ce service (dans notre cas, la BD).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (sch\u00e9ma avec compression)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Structure<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'id\u00e9e \u00e9tait d'avoir de nombreuses petites bases de donn\u00e9es avec une faible charge, pour lesquelles il n'est pas rentable de maintenir un serveur esclave d\u00e9di\u00e9 en mode hot standby pour des transactions en lecture seule (aucune n\u00e9cessit\u00e9 de gaspiller des ressources de cette mani\u00e8re).<\/p>\n<p><\/p>\n<p>Dans chaque centre de donn\u00e9es, il y a un serveur. Sur chaque serveur, il y a deux instances PostgreSQL (dans la terminologie PostgreSQL, elles sont appel\u00e9es clusters, mais pour \u00e9viter toute confusion, je vais les nommer instances (par analogie avec d'autres bases de donn\u00e9es), et je n'appellerai clusters que les clusters Pacemaker). Une instance fonctionne en mode ma\u00eetre, et c'est la seule qui fournit des services (seule elle re\u00e7oit l'IP flottante). La deuxi\u00e8me instance fonctionne comme esclave pour le deuxi\u00e8me centre de donn\u00e9es, et elle ne fournira des services que si son ma\u00eetre tombe en panne. \u00c9tant donn\u00e9 que la plus grande partie du temps, seul un des deux instances (le ma\u00eetre) fournira des services (traitera les requ\u00eates), toutes les ressources serveur sont optimis\u00e9es pour le ma\u00eetre (de la m\u00e9moire est allou\u00e9e pour le cache shared_buffers, etc.), mais de mani\u00e8re \u00e0 ce que la deuxi\u00e8me instance dispose \u00e9galement de suffisamment de ressources (m\u00eame si c'est pour un fonctionnement sous-optimis\u00e9 via le cache du syst\u00e8me de fichiers) en cas de d\u00e9faillance de l'un des centres de donn\u00e9es. L'esclave ne fournit pas de services (ne traite pas les requ\u00eates read only) lors du fonctionnement normal du cluster, afin qu'il n'y ait pas de conflit de ressources avec le ma\u00eetre sur la m\u00eame machine.<\/p>\n<p><\/p>\n<p>Dans le cas de deux n\u0153uds, la tol\u00e9rance aux pannes n'est possible que par r\u00e9plication asynchrone, car en r\u00e9plication synchrone, la d\u00e9faillance de l'esclave entra\u00eenera l'arr\u00eat du ma\u00eetre.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">D\u00e9faillance du t\u00e9moin<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e9faillance du t\u00e9moin (<em>quorum device<\/em>) je ne consid\u00e9rerai que le cluster Tuchanka1, pour tous les autres, ce sera la m\u00eame histoire. En cas de d\u00e9faillance du t\u00e9moin dans la structure du cluster, rien ne changera, tout continuera \u00e0 fonctionner comme avant. Mais le quorum sera \u00e9gal \u00e0 2 sur 3, et donc toute d\u00e9faillance ult\u00e9rieure sera fatale pour le cluster. Il faudra de toute fa\u00e7on r\u00e9parer rapidement.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">D\u00e9faillance de Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e9faillance de l'un des centres de donn\u00e9es pour Tuchanka1. Dans ce cas <em>witness<\/em> elle donne sa voix au deuxi\u00e8me n\u0153ud dans le deuxi\u00e8me centre de donn\u00e9es. L\u00e0, l'ancien esclave devient ma\u00eetre, de sorte que deux ma\u00eetres fonctionnent sur un serveur et que leurs deux IP flottantes pointent vers eux.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (classique)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Structure<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sch\u00e9ma classique de deux n\u0153uds. Sur l'un fonctionne le ma\u00eetre, sur l'autre l'esclave. Les deux peuvent traiter des requ\u00eates (l'esclave uniquement en lecture), donc les deux poss\u00e8dent une IP flottante : krogan2 \u2014 sur le ma\u00eetre, krogan2s1 \u2014 sur l'esclave. La tol\u00e9rance aux pannes sera pr\u00e9sente tant pour le ma\u00eetre que pour l'esclave.<\/p>\n<p><\/p>\n<p>Dans le cas de deux n\u0153uds, la tol\u00e9rance aux pannes n'est possible que par r\u00e9plication asynchrone, car en r\u00e9plication synchrone, la d\u00e9faillance de l'esclave entra\u00eenera l'arr\u00eat du ma\u00eetre.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">D\u00e9faillance de Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En cas de d\u00e9faillance de l'un des centres de donn\u00e9es <em>witness<\/em> vote pour le second. Sur le seul centre de donn\u00e9es fonctionnel, un master sera d\u00e9ploy\u00e9, qui recevra les deux IP flottants : celle du master et celle de l'esclave. Il va de soi que l'instance doit \u00eatre configur\u00e9e de mani\u00e8re \u00e0 disposer de ressources suffisantes (limites de connexion, etc.) pour accepter simultan\u00e9ment toutes les connexions et requ\u00eates provenant des deux IP flottantes, master et esclave. Cela signifie qu'en conditions normales, elle doit avoir une marge suffisante par rapport aux limites.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (beaucoup d'esclaves)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Structure<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est d\u00e9j\u00e0 un autre extr\u00eame. Il existe des bases de donn\u00e9es qui re\u00e7oivent un nombre consid\u00e9rable de requ\u00eates en lecture seule (c'est typiquement le cas des sites \u00e0 fort trafic). Tuchanka4 est une situation o\u00f9 le nombre d'esclaves peut \u00eatre de trois ou plus pour traiter ces requ\u00eates, mais sans \u00eatre trop nombreux. Avec un nombre tr\u00e8s \u00e9lev\u00e9 d'esclaves, il faudra inventer un syst\u00e8me de r\u00e9plication hi\u00e9rarchique. Dans le cas minimal (sur l'image), il y a deux serveurs dans chacun des deux centres de donn\u00e9es, chacun ayant une instance PostgreSQL.<\/p>\n<p><\/p>\n<p>Une autre particularit\u00e9 de ce sch\u00e9ma est qu'il est d\u00e9j\u00e0 possible d'organiser une r\u00e9plication synchrone. Elle est configur\u00e9e pour r\u00e9pliquer, autant que possible, vers un autre centre de donn\u00e9es, et non vers une r\u00e9plique dans le m\u00eame centre de donn\u00e9es que le master. Tant le master que chaque esclave ont une IP flottante. Id\u00e9alement, il faudrait \u00e9quilibrer les requ\u00eates entre les esclaves d'une mani\u00e8re quelconque. <em>sql proxy<\/em>, par exemple, du c\u00f4t\u00e9 client. Diff\u00e9rents types de clients peuvent n\u00e9cessiter diff\u00e9rents types <em>sql proxy<\/em>, et seuls les d\u00e9veloppeurs clients savent qui a besoin de quoi. Cette fonctionnalit\u00e9 peut \u00eatre mise en \u0153uvre soit par un d\u00e9mon externe, soit par une biblioth\u00e8que cliente (pool de connexions), etc. Tout cela d\u00e9passe le cadre d'un cluster de bases de donn\u00e9es tol\u00e9rant aux pannes (la tol\u00e9rance aux pannes <em>SQL proxy<\/em> peut \u00eatre r\u00e9alis\u00e9e ind\u00e9pendamment, en m\u00eame temps que la tol\u00e9rance aux pannes du client).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Panne de Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En cas de panne d'un centre de donn\u00e9es (c'est-\u00e0-dire de deux serveurs), le t\u00e9moin vote pour le second. En cons\u00e9quence, dans le second centre de donn\u00e9es, deux serveurs fonctionnent : sur l'un se trouve le master, qui re\u00e7oit l'IP flottante du master (pour les requ\u00eates en lecture-\u00e9criture) ; et sur le second serveur, un esclave fonctionne avec une r\u00e9plication synchrone, sur lequel figure l'une des IP flottantes des esclaves (pour les requ\u00eates en lecture seule).<\/p>\n<p><\/p>\n<p>La premi\u00e8re chose \u00e0 noter est que tous les IP flottants des esclaves ne seront pas op\u00e9rationnels, mais seulement un. Et pour travailler correctement avec celui-ci, il sera n\u00e9cessaire que <em>sql proxy<\/em> tous les requ\u00eates \u00e9taient redirig\u00e9es vers le seul float IP restant ; sinon <em>sql proxy<\/em> il est possible de lister tous les float IP des esclaves dans l'URL de connexion s\u00e9par\u00e9s par des virgules. Dans ce cas, la connexion se fera au premier IP de travail, comme c'est configur\u00e9 dans le syst\u00e8me de test automatis\u00e9. Il est possible qu'avec d'autres biblioth\u00e8ques, par exemple JDBC, cela ne fonctionne pas et que cela n\u00e9cessite <em>libpq<\/em> La connexion sera \u00e9tablie au premier IP fonctionnel, ce qui est mis en place dans le syst\u00e8me de tests automatis\u00e9s. Il est possible que cela ne fonctionne pas avec d'autres biblioth\u00e8ques, comme JDBC, et qu\u2019un <em>sql proxy<\/em>. Cela a \u00e9t\u00e9 r\u00e9alis\u00e9 car les float IP des esclaves ont l'interdiction de se lever simultan\u00e9ment sur un m\u00eame serveur, afin qu'ils soient uniform\u00e9ment r\u00e9partis sur les serveurs esclaves si plusieurs d'entre eux sont en fonctionnement.<\/p>\n<p><\/p>\n<p>Deuxi\u00e8mement : m\u00eame en cas de d\u00e9faillance du centre de donn\u00e9es, la r\u00e9plication synchrone sera maintenue. Et m\u00eame si un second \u00e9chec se produit, c'est-\u00e0-dire que l'un des deux serveurs du centre de donn\u00e9es restant tombe en panne, le cluster, bien qu'il ne fournisse plus de services, conservera n\u00e9anmoins des informations sur toutes les transactions valid\u00e9es pour lesquelles il a donn\u00e9 une confirmation de commit (il n'y aura pas de perte d'informations en cas de second \u00e9chec).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 centres de donn\u00e9es)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Structure<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est un cluster pour une situation o\u00f9 il y a trois centres de donn\u00e9es fonctionnels, chacun avec un serveur de base de donn\u00e9es op\u00e9rationnel. Dans ce cas <em>quorum device<\/em> n'est pas n\u00e9cessaire. Dans un centre de donn\u00e9es, fonctionne le ma\u00eetre, dans les deux autres - les esclaves. La r\u00e9plication est synchrone, de type ANY (esclave1, esclave2), c'est-\u00e0-dire que le client recevra une confirmation de commit lorsque l'un des esclaves r\u00e9pondra en premier qu'il a accept\u00e9 le commit. Un float IP est d\u00e9sign\u00e9 pour le ma\u00eetre et deux pour les esclaves. Contrairement \u00e0 Tuchanka4, tous les trois float IP sont tol\u00e9rants aux pannes. Pour \u00e9quilibrer les requ\u00eates SQL en lecture seule, on peut utiliser <em>sql proxy<\/em> (avec une redondance externe), ou attribuer un float IP esclave \u00e0 la moiti\u00e9 des clients et l'autre \u00e0 l'autre moiti\u00e9.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">D\u00e9faillance de Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En cas de d\u00e9faillance de l'un des centres de donn\u00e9es, deux restent. Dans l'un se trouve le ma\u00eetre et le float IP du ma\u00eetre, dans l'autre - un esclave et les deux float IP esclaves (l'instance doit avoir au moins deux fois la capacit\u00e9 des ressources pour accepter toutes les connexions des deux float IP esclaves). Entre le ma\u00eetre et l'esclave, il y a une r\u00e9plication synchrone. De plus, le cluster conservera des informations sur les transactions valid\u00e9es et confirm\u00e9es (il n'y aura pas de perte d'informations) en cas de destruction de deux centres de donn\u00e9es (s'ils sont d\u00e9truits non simultan\u00e9ment).<\/p>\n<p><\/p>\n<p><em>Je n'ai pas inclus de description d\u00e9taill\u00e9e de la structure des fichiers et du d\u00e9ploiement. Si quelqu'un souhaite exp\u00e9rimenter, vous pouvez tout lire dans le README. Je ne fournis que la description du test automatique.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Syst\u00e8me de test automatique<\/h1>\n<p><\/p>\n<p>Pour tester la r\u00e9silience des clusters en simulant diverses pannes, un syst\u00e8me de test automatique a \u00e9t\u00e9 cr\u00e9\u00e9. Il est lanc\u00e9 par un script. <code>test\/failure<\/code>. Le script peut accepter en param\u00e8tres les num\u00e9ros des clusters que vous souhaitez tester. Par exemple, cette commande :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>testera uniquement le deuxi\u00e8me et le troisi\u00e8me cluster. Si aucun param\u00e8tre n'est sp\u00e9cifi\u00e9, tous les clusters seront test\u00e9s. Tous les clusters sont test\u00e9s en parall\u00e8le, et le r\u00e9sultat est affich\u00e9 dans le panneau tmux. Tmux utilise un serveur tmux d\u00e9di\u00e9, il est donc possible de lancer le script \u00e0 partir du tmux par d\u00e9faut, ce qui donnera un tmux imbriqu\u00e9. Je recommande d'utiliser le terminal dans une grande fen\u00eatre avec une petite police. Avant de commencer les tests, toutes les machines virtuelles sont restaur\u00e9es \u00e0 un snapshot au moment de la fin du script. <code>configuration<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le terminal est divis\u00e9 en colonnes correspondant au nombre de clusters test\u00e9s, qui est par d\u00e9faut (sur la capture d'\u00e9cran) quatre. Je d\u00e9taillerai le contenu des colonnes \u00e0 titre d'exemple pour Tuchanka2. Les panneaux sur la capture d'\u00e9cran sont num\u00e9rot\u00e9s :<\/p>\n<p><\/p>\n<ol>\n<li>Ici sont affich\u00e9es les statistiques des tests. Colonnes :\n<ul>\n<li><strong>failure<\/strong> \u2014 le nom du test (fonction dans le script) qui simule une panne.<\/li>\n<li><strong>reaction<\/strong> \u2014 la moyenne en secondes du temps que le cluster a mis pour retrouver sa fonctionnalit\u00e9. Cela est mesur\u00e9 depuis le d\u00e9but de l'ex\u00e9cution du script simulating la panne, jusqu'\u00e0 ce que le cluster r\u00e9tablisse sa fonctionnalit\u00e9 et soit capable de continuer \u00e0 fournir des services. Si le temps est tr\u00e8s court, par exemple six secondes (ce qui peut arriver dans des clusters avec plusieurs esclaves (Tuchanka3 et Tuchanka4)), cela signifie que la panne est survenue sur un esclave asynchrone et n'a pas du tout affect\u00e9 la fonctionnalit\u00e9, il n'y a pas eu de changement d'\u00e9tat du cluster.<\/li>\n<li><strong>deviation<\/strong> \u2014 indique la dispersion (pr\u00e9cision) de la valeur <strong>reaction<\/strong> avec la m\u00e9thode de la \u00ab d\u00e9viation standard \u00bb.<\/li>\n<li><strong>count<\/strong> \u2014 combien de fois ce test a \u00e9t\u00e9 effectu\u00e9.<\/li>\n<\/ul>\n<\/li>\n<li>Un journal succinct permet d'\u00e9valuer ce que le cluster fait actuellement. Il affiche le num\u00e9ro d'it\u00e9ration (test), un horodatage et le nom de l'op\u00e9ration. Une dur\u00e9e d'ex\u00e9cution trop longue (&gt; 5 minutes) indique un probl\u00e8me.<\/li>\n<li><strong>heart<\/strong> (c\u0153ur) \u2014 temps actuel. Pour une \u00e9valuation visuelle de la performance <em>ma\u00eetre<\/em> dans sa table, le temps actuel est constamment enregistr\u00e9 en utilisant le float IP du ma\u00eetre. En cas de succ\u00e8s, le r\u00e9sultat est affich\u00e9 dans ce panneau.<\/li>\n<li><strong>battement<\/strong> (pouls) \u2014 \u00abtemps actuel\u00bb, qui a \u00e9t\u00e9 pr\u00e9c\u00e9demment enregistr\u00e9 par le script <strong>heart<\/strong> dans le ma\u00eetre, est maintenant lu depuis <em>l'esclave<\/em> via son float IP. Permet d'\u00e9valuer visuellement la performance de l'esclave et la r\u00e9plication. Dans Tuchanka1, il n'y a pas d'esclaves avec float IP (pas d'esclaves offrant des services), mais il y a deux instances (DB), donc ici il sera affich\u00e9 que <strong>battement<\/strong>, et <strong>heart<\/strong> la deuxi\u00e8me instance.<\/li>\n<li>Surveillance de l'\u00e9tat du cluster \u00e0 l'aide de l'outil <code>pcs mon<\/code>. Montre la structure, la r\u00e9partition des ressources entre les n\u0153uds et d'autres informations utiles.<\/li>\n<li>Ici, le monitoring syst\u00e8me de chaque machine virtuelle du cluster est affich\u00e9. Il peut y avoir plusieurs panneaux \u2014 autant de machines virtuelles que le cluster. Deux graphiques <em>Charge CPU<\/em> (dans les VM avec deux processeurs), nom de la machine virtuelle, <em>Charge syst\u00e8me<\/em> (appel\u00e9 Load Average, car il est moyenn\u00e9 sur 5, 10 et 15 minutes), donn\u00e9es sur les processus et r\u00e9partition de la m\u00e9moire.<\/li>\n<li>Tra\u00e7age du script effectuant les tests. En cas de panne \u2014 arr\u00eat soudain ou boucle d'attente infinie \u2014 ici vous pourrez voir la raison de ce comportement.<\/li>\n<\/ol>\n<p><\/p>\n<p>Le test est effectu\u00e9 en deux \u00e9tapes. D'abord, le script parcourt toutes les vari\u00e9t\u00e9s de tests, choisissant al\u00e9atoirement la machine virtuelle \u00e0 laquelle appliquer ce test. Ensuite, un cycle de test infini est ex\u00e9cut\u00e9, o\u00f9 les machines virtuelles et la panne sont choisies al\u00e9atoirement \u00e0 chaque fois. L'arr\u00eat soudain du script de test (panneau inf\u00e9rieur) ou une boucle d'attente infinie pour quelque chose (&gt; 5 minutes de temps d'ex\u00e9cution d'une op\u00e9ration, visible dans le tra\u00e7age) indique qu'un des tests sur ce cluster a \u00e9chou\u00e9.<\/p>\n<p><\/p>\n<p>Chaque test est compos\u00e9 des op\u00e9rations suivantes :<\/p>\n<p><\/p>\n<ol>\n<li>Lancer la fonction \u00e9mulant une panne.<\/li>\n<li><strong>Pr\u00eat ?<\/strong> \u2014 en attente de la restauration de la performance du cluster (lorsque tous les services sont fournis).<\/li>\n<li>Affiche le temps d'attente pour la restauration du cluster (<em>reaction<\/em>).<\/li>\n<li><strong>R\u00e9parer<\/strong> \u2014 le cluster est \u00abr\u00e9par\u00e9\u00bb. Apr\u00e8s quoi, il doit revenir \u00e0 un \u00e9tat enti\u00e8rement fonctionnel et pr\u00eat pour une prochaine panne.<\/li>\n<\/ol>\n<p><\/p>\n<p>Voici la liste des tests avec descriptions de ce qu'ils font :<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: cr\u00e9e une erreur \"Out of memory\" \u00e0 l'aide d'une bombe fork.<\/li>\n<li><strong>OutOfSpace<\/strong>: le disque dur est plein. Mais le test est plut\u00f4t symbolique, \u00e9tant donn\u00e9 la charge insignifiante cr\u00e9\u00e9e lors des tests, la saturation du disque dur ne provoque g\u00e9n\u00e9ralement pas de d\u00e9faillance de PostgreSQL.<\/li>\n<li><strong>Postgres-KILL<\/strong>: tue PostgreSQL avec la commande <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: suspend PostgreSQL avec la commande <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \u00abcoupe l'alimentation\u00bb de la machine virtuelle avec la commande <code>VBoxManage controlvm \"machine virtuelle\" poweroff<\/code>.<\/li>\n<li><strong>R\u00e9initialiser<\/strong>: red\u00e9marre la machine virtuelle avec la commande <code>VBoxManage controlvm \"machine virtuelle\" reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: suspend le d\u00e9mon SBD avec la commande <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: envoie une commande \u00e0 la machine virtuelle via SSH <code>systemctl poweroff<\/code>, le syst\u00e8me termine correctement son op\u00e9ration.<\/li>\n<li><strong>UnLink<\/strong>: isolation r\u00e9seau, commande <code>VBoxManage controlvm \"machine virtuelle\" setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Terminez le test avec la commande standard tmux \"kill-window\" <strong>Ctrl-b &amp;<\/strong>, ou la commande \"detach-client\". <strong>Ctrl-b d<\/strong>: dans ce cas, les tests se terminent, tmux se ferme, les machines virtuelles s'arr\u00eatent.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Probl\u00e8mes identifi\u00e9s lors des tests<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>Actuellement, <em>le d\u00e9mon watchdog sbd<\/em> g\u00e8re l'arr\u00eat des d\u00e9mons observ\u00e9s, mais ne g\u00e8re pas leur blocage. Et, par cons\u00e9quent, il y a des d\u00e9faillances non g\u00e9r\u00e9es qui entra\u00eenent uniquement des blocages <em>Corosync<\/em> et <em>Pacemaker<\/em>, mais qui ne provoquent pas de suspension <em>sbd<\/em>. Pour v\u00e9rifier <em>Corosync<\/em> il existe d\u00e9j\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (sur GitHub en <em>sbd<\/em>)<\/a><\/noindex>, accept\u00e9 dans la branche <em>master<\/em>. Ils ont promis (dans PR#83) qu'il y aurait quelque chose de similaire pour Pacemaker, j'esp\u00e8re que d'ici <em>RedHat 8<\/em> cela sera fait. Mais de telles \u00abd\u00e9faillances\u00bb sont th\u00e9oriques, faciles \u00e0 simuler artificiellement avec par exemple, <code>killall -STOP corosync<\/code>, mais ne se rencontrent jamais dans la r\u00e9alit\u00e9.<\/p>\n<p>\n<\/li>\n<li>\n<p>Il y a <em>Pacemaker<\/em> dans la version pour <em>CentOS 7<\/em> le param\u00e8tre <em>sync_timeout<\/em> au <em>quorum device<\/em>est mal d\u00e9fini, ce qui entra\u00eene <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">lorsqu'un n\u0153ud \u00e9choue, avec une certaine probabilit\u00e9 le deuxi\u00e8me n\u0153ud se red\u00e9marre<\/a><\/noindex>, sur lequel le ma\u00eetre aurait d\u00fb d\u00e9m\u00e9nager. Cela a \u00e9t\u00e9 corrig\u00e9 par augmentation <em>sync_timeout<\/em> au <em>quorum device<\/em> lors du d\u00e9ploiement (dans le script <code>setup\/setup1<\/code>). Ce correctif n'a pas \u00e9t\u00e9 accept\u00e9 par les d\u00e9veloppeurs <em>Pacemaker<\/em>, \u00e0 la place, ils ont promis de retravailler l'infrastructure de telle mani\u00e8re (dans un avenir incertain), que ce d\u00e9lai soit calcul\u00e9 automatiquement.<\/p>\n<p>\n<\/li>\n<li>\n<p>Si lors de la configuration de la base de donn\u00e9es, il est indiqu\u00e9 que dans <code>LC_MESSAGES<\/code> (messages textuels) Unicode peut \u00eatre utilis\u00e9, par exemple, <code>ru_RU.UTF-8<\/code>, alors lors du d\u00e9marrage <em>postgres<\/em> dans un environnement o\u00f9 la locale n'est pas UTF-8, par exemple, dans un environnement vide (ici <em>pacemaker<\/em>+<em>pgsqlms<\/em>(paf) d\u00e9marre <em>postgres<\/em>), alors <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">dans les logs au lieu des caract\u00e8res UTF-8, il y aura des points d'interrogation<\/a><\/noindex>. Les d\u00e9veloppeurs de PostgreSQL n'ont pas r\u00e9ussi \u00e0 se mettre d'accord sur la mani\u00e8re de traiter cette situation. Cela se contourne, il faut d\u00e9finir <code>LC_MESSAGES=en_US.UTF-8<\/code> lors de la configuration (cr\u00e9ation) d'une instance de base de donn\u00e9es.<\/p>\n<p>\n<\/li>\n<li>\n<p>Si wal_receiver_timeout est d\u00e9fini (par d\u00e9faut \u00e0 60s), lors du test PostgreSQL-STOP sur le ma\u00eetre dans les clusters tuchanka3 et tuchanka4, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">la r\u00e9plication ne se reconnecte pas au nouveau ma\u00eetre.<\/a><\/noindex>La r\u00e9plication y est synchrone, donc non seulement l'esclave, mais aussi le nouveau ma\u00eetre est arr\u00eat\u00e9. Cela peut \u00eatre contourn\u00e9 en d\u00e9finissant wal_receiver_timeout=0 lors de la configuration de PostgreSQL.<\/p>\n<p>\n<\/li>\n<li>\n<p>J'ai observ\u00e9 de temps en temps un blocage de la r\u00e9plication dans le test ForkBomb (saturation de la m\u00e9moire). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Apr\u00e8s ForkBomb, les esclaves peuvent parfois ne pas se reconnecter au nouveau ma\u00eetre.<\/a><\/noindex>Je n'ai rencontr\u00e9 cela que dans les clusters tuchanka3 et tuchanka4, o\u00f9, en raison de la r\u00e9plication synchrone, le ma\u00eetre se bloquait. Le probl\u00e8me se r\u00e9solvait de lui-m\u00eame apr\u00e8s un certain temps (environ deux heures). Des recherches suppl\u00e9mentaires sont n\u00e9cessaires pour le corriger. Les sympt\u00f4mes ressemblent \u00e0 un ancien bug caus\u00e9 par une autre raison, mais avec des cons\u00e9quences similaires.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>L'image du krogan est prise de <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> avec l'autorisation de l'auteur :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/516538\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u043e\u0432\u043e\u043b\u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0435\u0441\u0442\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0444\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u043b Pacemaker, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 RedHat \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432. \u041e\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043c, \u0447\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92571,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92570","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Mod\u00e9lisation de clusters tol\u00e9rants aux pannes bas\u00e9s sur PostgreSQL et Pacemaker | ProHoster","description":"Introduction Il y a quelque temps, on m'a confi\u00e9 la t\u00e2che de d\u00e9velopper un cluster r\u00e9sistant aux pannes pour PostgreSQL.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-28T17:42:21+00:00","article:modified_time":"2020-08-28T17:42:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92570","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:06:03","updated":"2022-09-29 15:28:29","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}