{"id":90103,"date":"2020-07-29T13:42:32","date_gmt":"2020-07-29T11:42:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij"},"modified":"2020-07-29T13:42:32","modified_gmt":"2020-07-29T11:42:32","slug":"patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","title":{"rendered":"Histoires d'\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/6404cba13214f499d1f347cca0aacbe7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'objectif principal de Patroni est d'assurer la haute disponibilit\u00e9 pour PostgreSQL. Mais Patroni n'est qu'un mod\u00e8le, et non un outil pr\u00eat \u00e0 l'emploi (comme cela est clairement indiqu\u00e9 dans la documentation). \u00c0 premi\u00e8re vue, en configurant Patroni dans un environnement de test, on peut voir \u00e0 quel point c'est un excellent outil et comment il g\u00e8re facilement nos tentatives de d\u00e9faillance de cluster. Cependant, dans un environnement de production, tout ne se d\u00e9roule pas toujours aussi joliment et \u00e9l\u00e9gamment que dans une salle de test.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/ff445e6d76a2ad46a232b705e104446f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Permettez-moi de me pr\u00e9senter. J'ai commenc\u00e9 en tant qu'administrateur syst\u00e8me. J'ai travaill\u00e9 dans le d\u00e9veloppement web. Depuis 2014, je suis chez Data Egret. L'entreprise est sp\u00e9cialis\u00e9e dans le conseil en Postgres. Nous nous consacrons exclusivement \u00e0 Postgres et travaillons avec lui chaque jour, ce qui nous procure une expertise vari\u00e9e li\u00e9e \u00e0 son exploitation. <\/p>\n<p><\/p>\n<p>Fin 2018, nous avons commenc\u00e9 \u00e0 utiliser progressivement Patroni. Nous avons acquis une certaine exp\u00e9rience. Nous l'avons diagnostiqu\u00e9, peaufin\u00e9, et avons \u00e9tabli nos meilleures pratiques. Dans cette pr\u00e9sentation, je vais en parler.<\/p>\n<p><\/p>\n<p>Outre PostgreSQL, j'aime Linux. J'aime m'y plonger, explorer, compiler des kernels. J'appr\u00e9cie la virtualisation, les conteneurs, Docker, Kubernetes. Cela m'int\u00e9resse beaucoup, car cela refl\u00e8te mes anciennes habitudes d'administrateur. J'aime m'occuper des syst\u00e8mes de monitoring. J'adore les aspects administratifs de Postgres, tels que la r\u00e9plication et les sauvegardes. Pendant mon temps libre, j'\u00e9cris en Go. Je ne suis pas ing\u00e9nieur logiciel, mais j'\u00e9cris pour moi-m\u00eame en Go, et j'en tire beaucoup de plaisir. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/02cfd9293af5a8410c91e39afe2c75e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Je pense que beaucoup d'entre vous savent qu'il n'y a pas de haute disponibilit\u00e9 (HA) dans PostgreSQL par d\u00e9faut. Pour obtenir la HA, il faut installer quelque chose, le configurer, faire des efforts et y parvenir. <\/li>\n<li>Il existe plusieurs outils, et Patroni est l'un d'eux, qui r\u00e9sout la HA de mani\u00e8re assez efficace et tr\u00e8s bonne. Mais en le mettant en place dans un environnement de test et en le lan\u00e7ant, nous pouvons voir que tout fonctionne, que nous pouvons reproduire certains probl\u00e8mes et observer comment Patroni les g\u00e8re. Et nous verrons que tout cela fonctionne parfaitement. <\/li>\n<li>Mais en pratique, nous avons rencontr\u00e9 diff\u00e9rents probl\u00e8mes. Je vais parler de ces probl\u00e8mes.<\/li>\n<li>Je vais expliquer comment nous avons diagnostiqu\u00e9 cela, ce que nous avons ajust\u00e9 \u2013 cela nous a-t-il aid\u00e9s ou non. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/7126b45b40dd08521e80a3c150382bec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Je ne vais pas expliquer comment installer Patroni, car il est possible de le trouver sur Internet, de consulter les fichiers de configuration pour comprendre comment tout cela fonctionne et comment le configurer. On peut se familiariser avec les sch\u00e9mas, les architectures en trouvant des informations \u00e0 ce sujet en ligne. <\/li>\n<li>Je ne vais pas parler d'exp\u00e9riences \u00e9trang\u00e8res. Je vais aborder uniquement les probl\u00e8mes auxquels nous avons \u00e9t\u00e9 confront\u00e9s sp\u00e9cifiquement. <\/li>\n<li>Je ne vais pas non plus aborder les probl\u00e8mes en dehors de Patroni et PostgreSQL. Par exemple, en ce qui concerne les probl\u00e8mes li\u00e9s \u00e0 l'\u00e9quilibrage lorsque notre cluster s'est effondr\u00e9, je ne vais pas en parler. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/3f8d179e7c78ce83e8842ef5c72fe30d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et un petit avertissement avant de commencer notre pr\u00e9sentation. <\/p>\n<p><\/p>\n<p>Tous ces probl\u00e8mes auxquels nous avons \u00e9t\u00e9 confront\u00e9s se sont pr\u00e9sent\u00e9s au cours des six \u00e0 huit premiers mois d'exploitation. Avec le temps, nous avons \u00e9labor\u00e9 nos meilleures pratiques internes. Et les probl\u00e8mes ont disparu. C'est pourquoi la pr\u00e9sentation a \u00e9t\u00e9 annonc\u00e9e il y a environ six mois, lorsque tout cela \u00e9tait encore frais dans ma m\u00e9moire. <\/p>\n<p><\/p>\n<p>Au fur et \u00e0 mesure que je pr\u00e9parais la pr\u00e9sentation, j'ai relu d'anciens post-mortems et examin\u00e9 les journaux. Et certains d\u00e9tails ont pu \u00eatre oubli\u00e9s, ou certains aspects n'ont peut-\u00eatre pas \u00e9t\u00e9 suffisamment \u00e9tudi\u00e9s lors de l'analyse des probl\u00e8mes, donc dans certains cas, il peut sembler que les probl\u00e8mes n'ont pas \u00e9t\u00e9 enti\u00e8rement abord\u00e9s ou qu'il manque des informations. Je vous demande donc de m'excuser pour cela. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/30d414284a41fcbc3bf417c9da28ca52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qu'est-ce que Patroni ?<\/p>\n<p><\/p>\n<ul>\n<li>C'est un mod\u00e8le pour la mise en place de la haute disponibilit\u00e9. C'est ainsi que cela est \u00e9crit dans la documentation. Et de mon point de vue, c'est une pr\u00e9cision tr\u00e8s juste. Patroni n'est pas une solution miracle qui r\u00e9soudra tous vos probl\u00e8mes, c'est-\u00e0-dire qu'il faut faire un effort pour qu'il commence \u00e0 fonctionner et qu'il apporte des b\u00e9n\u00e9fices. <\/li>\n<li>C'est un service d'agent qui est install\u00e9 sur chaque service avec une base de donn\u00e9es et qui est une sorte de syst\u00e8me d'initialisation pour votre Postgres. Il d\u00e9marre, arr\u00eate, red\u00e9marre Postgres, modifie la configuration et change la topologie de votre cluster. <\/li>\n<li>Ainsi, pour stocker l'\u00e9tat du cluster, sa repr\u00e9sentation actuelle, il faut un certain type de stockage. Et \u00e0 cet \u00e9gard, Patroni a choisi de conserver son \u00e9tat dans un syst\u00e8me externe. C'est un syst\u00e8me de stockage de configuration distribu\u00e9. Cela peut \u00eatre Etcd, Consul, ZooKeeper, ou encore Etcd de Kubernetes, donc l'une de ces options. <\/li>\n<li>L'une des caract\u00e9ristiques de Patroni est que vous obtenez un basculement automatique d\u00e8s le d\u00e9part, simplement en le configurant. En comparaison avec Repmgr, le basculement automatique y est inclus. Avec Repmgr, nous avons un switchover, mais si nous voulons un basculement automatique, nous devons le configurer s\u00e9par\u00e9ment. Patroni propose d\u00e9j\u00e0 un basculement automatique pr\u00eat \u00e0 l'emploi.<\/li>\n<li>Et il y a beaucoup d'autres choses \u00e0 consid\u00e9rer. Par exemple, la gestion des configurations, l'ajout de nouvelles r\u00e9pliques, les sauvegardes, etc. Mais cela sort du cadre de cette pr\u00e9sentation, donc je n'en parlerai pas. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/fed0f1ce931df99ca76ae1116f8098cc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour r\u00e9sumer, la principale t\u00e2che de Patroni est d'assurer un basculement automatique de mani\u00e8re fiable afin que notre cluster reste op\u00e9rationnel et que l'application ne per\u00e7oive aucune modification dans la topologie du cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/fac52620957efa47ced330e7cc8084e0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cependant, lorsque nous commen\u00e7ons \u00e0 utiliser Patroni, notre syst\u00e8me devient un peu plus complexe. Si nous avions auparavant Postgres, l'utilisation de Patroni implique d'avoir Patroni lui-m\u00eame ainsi qu'un DCS o\u00f9 l'\u00e9tat est stock\u00e9. Tout cela doit fonctionner ensemble. Alors, quels \u00e9l\u00e9ments peuvent tomber en panne ?<\/p>\n<p><\/p>\n<p>Les \u00e9l\u00e9ments qui peuvent tomber en panne :<\/p>\n<p><\/p>\n<ul>\n<li>Postgres peut tomber en panne. Cela peut \u00eatre le ma\u00eetre ou la r\u00e9plique, l'un d'eux peut dysfonctionner. <\/li>\n<li>Patroni lui-m\u00eame peut \u00e9galement tomber en panne. <\/li>\n<li>Le DCS, o\u00f9 l'\u00e9tat est stock\u00e9, peut tomber en panne.<\/li>\n<li>Et le r\u00e9seau peut \u00e9galement avoir des probl\u00e8mes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Je vais aborder tous ces points dans ma pr\u00e9sentation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/1aeaf46d37bf1935b514b0581e0dbd0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>J'examinerai les cas au fur et \u00e0 mesure qu'ils deviennent plus complexes, non pas du point de vue du nombre de composants impliqu\u00e9s, mais en fonction de la perception subjective de la difficult\u00e9 de chaque cas, certains \u00e9tant plus difficiles \u00e0 analyser que d'autres. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/65b0c98bf2284610e955ced5eb998f39.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le premier cas est le plus simple. C'est celui o\u00f9 nous avons pris un cluster de bases de donn\u00e9es et mis en place notre stockage DCS sur le m\u00eame cluster. C'est l'erreur la plus courante. C'est une erreur d'architecture, c'est-\u00e0-dire de combiner diff\u00e9rents composants au m\u00eame endroit. <\/p>\n<p><\/p>\n<p>Ainsi, un \u00e9v\u00e9nement de basculement s'est produit, et nous devons examiner ce qui s'est pass\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/244b69d623fe2205c2d9ed2aa4620067.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous devons nous int\u00e9resser au moment o\u00f9 le basculement s'est produit, c'est-\u00e0-dire au point pr\u00e9cis dans le temps o\u00f9 l'\u00e9tat du cluster a chang\u00e9. <\/p>\n<p><\/p>\n<p>Mais un basculement n'est pas toujours instantan\u00e9, c'est-\u00e0-dire qu'il ne prend pas une unit\u00e9 de temps d\u00e9finie ; il peut s'\u00e9tendre sur une dur\u00e9e prolong\u00e9e.<\/p>\n<p><\/p>\n<p>Par cons\u00e9quent, il dispose d'un temps de d\u00e9but et d'un temps de fin, c'est-\u00e0-dire qu'il s'agit d'un \u00e9v\u00e9nement prolong\u00e9. Nous divisons tous les \u00e9v\u00e9nements en trois intervalles : nous avons le temps avant le failover, pendant le failover et apr\u00e8s le failover. C'est-\u00e0-dire que nous consid\u00e9rons tous les \u00e9v\u00e9nements sur cette \u00e9chelle temporelle. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a0ed61afe55d1a157147e0d80b17e5d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et la premi\u00e8re chose que nous faisons lorsque le failover se produit, c'est que nous cherchons la cause, ce qui s'est pass\u00e9, ce qui a conduit au failover. <\/p>\n<p><\/p>\n<p>Si nous regardons les logs, ce seront les logs classiques de Patroni. Ils nous indiquent que le serveur est devenu ma\u00eetre et que le r\u00f4le de ma\u00eetre est pass\u00e9 \u00e0 ce n\u0153ud. Cela est mis en \u00e9vidence ici. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/9998c69f7d0d4358b277f4e0e7b4350f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ensuite, nous devons comprendre pourquoi le failover s'est produit, c'est-\u00e0-dire quels \u00e9v\u00e9nements ont conduit le r\u00f4le de ma\u00eetre \u00e0 se d\u00e9placer d'un n\u0153ud \u00e0 un autre. Dans ce cas, c'est assez simple. Nous avons une erreur d'interaction avec le syst\u00e8me de stockage. Le ma\u00eetre a compris qu'il ne pouvait pas travailler avec le DCS, c'est-\u00e0-dire qu'il y avait un probl\u00e8me d'interaction. Et il dit qu'il ne peut plus \u00eatre le ma\u00eetre et qu'il renonce \u00e0 ses pouvoirs. Cette ligne \u00ab demoted self \u00bb en parle pr\u00e9cis\u00e9ment. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/4a8eca27689546b4b0fc3c666a3c37c4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si nous examinons les \u00e9v\u00e9nements qui ont pr\u00e9c\u00e9d\u00e9 le failover, nous pouvons voir les m\u00eames causes qui ont pos\u00e9 probl\u00e8me pour la continuit\u00e9 du fonctionnement du ma\u00eetre. <\/p>\n<p><\/p>\n<p>En regardant les logs de Patroni, nous verrons qu'il y a de nombreuses erreurs, des timeouts, c'est-\u00e0-dire que l'agent Patroni ne peut pas communiquer avec le DCS. Dans ce cas, il s'agit de l'agent Consul, avec lequel nous communiquons via le port 8500. <\/p>\n<p><\/p>\n<p>Et le probl\u00e8me ici est que Patroni et la base de donn\u00e9es sont ex\u00e9cut\u00e9s sur le m\u00eame h\u00f4te. Et sur ce m\u00eame n\u0153ud, des serveurs Consul ont \u00e9t\u00e9 lanc\u00e9s. En cr\u00e9ant une charge sur le serveur, nous avons \u00e9galement cr\u00e9\u00e9 des probl\u00e8mes pour <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/fr\/server\/\"   title=\"serveurs\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1515\">serveurs<\/a> Consul. Ils n'ont pas pu communiquer correctement. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/0d8dba6641809560e6b32825d481e30b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Apr\u00e8s un certain temps, lorsque la charge a diminu\u00e9, notre Patroni a pu \u00e0 nouveau communiquer avec les agents. Le fonctionnement normal a repris. Et le m\u00eame serveur Pgdb-2 est redevenu ma\u00eetre. C'est-\u00e0-dire qu'il y a eu un l\u00e9ger flip, \u00e0 cause duquel le n\u0153ud a renonc\u00e9 \u00e0 ses pouvoirs de ma\u00eetre, puis les a repris, c'est-\u00e0-dire que tout est revenu comme avant. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/131b93e0bd83099e1b99b53742419e13.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et cela peut \u00eatre consid\u00e9r\u00e9 comme un faux d\u00e9clenchement, ou l'on peut consid\u00e9rer que Patroni a bien agi. C'est-\u00e0-dire qu'il a compris qu'il ne pouvait pas maintenir l'\u00e9tat du cluster et a renonc\u00e9 \u00e0 ses pouvoirs.<\/p>\n<p><\/p>\n<p>Et ici, le probl\u00e8me est survenu parce que les serveurs Consul sont sur le m\u00eame mat\u00e9riel que les bases de donn\u00e9es. Par cons\u00e9quent, toute charge : que ce soit une charge sur les disques ou sur les processeurs, elle impacte \u00e9galement l'interaction avec le cluster Consul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/142c7cf839c8da078451f7ba9d5499e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons d\u00e9cid\u00e9 que cela ne devait pas coexister, nous avons donc allou\u00e9 un cluster distinct pour Consul. Patroni fonctionnait d\u00e9j\u00e0 avec un Consul distinct, c'est-\u00e0-dire qu'il y avait un cluster Postgres s\u00e9par\u00e9 et un cluster Consul. Voici un guide de base sur la fa\u00e7on de s\u00e9parer et de g\u00e9rer tous ces \u00e9l\u00e9ments pour qu'ils ne vivent pas ensemble. <\/p>\n<p><\/p>\n<p>En option, on peut ajuster les param\u00e8tres ttl, loop_wait, retry_timeout, c'est-\u00e0-dire essayer de survivre \u00e0 ces pics de charge temporaires en augmentant ces param\u00e8tres. Mais ce n'est pas la meilleure option, car cette charge pourrait \u00eatre prolong\u00e9e dans le temps. Et nous allons simplement d\u00e9passer ces limites. Cela peut ne pas vraiment aider. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/c51f35dcd88b1c792acec231c0c6c66c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le premier probl\u00e8me, comme vous l'avez compris, est simple. Nous avons pris et mis DCS avec la base, et nous avons rencontr\u00e9 un probl\u00e8me. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/cc2a98d9790441577fb4080406cbc53f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le deuxi\u00e8me probl\u00e8me est similaire au premier. Il ressemble au premier en ce sens que nous avons encore des probl\u00e8mes de communication avec le syst\u00e8me DCS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/e5c01b105adca48cc620085db8dd2d2b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si nous examinons les journaux, nous verrons que nous avons de nouveau une erreur de communication. Patroni dit qu'il ne peut pas interagir avec DCS, donc le ma\u00eetre actuel passe en mode r\u00e9plique.<\/p>\n<p><\/p>\n<p>L'ancien ma\u00eetre devient une r\u00e9plique, ici Patroni fonctionne comme il se doit. Il lance pg_rewind pour revenir sur le journal des transactions et ensuite se connecter au nouveau ma\u00eetre, et se synchroniser avec celui-ci. Patroni fonctionne ici comme il le devrait. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/29255f4790abb15b64dbf9ee0b41c7fc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ici, nous devons trouver l'endroit qui a pr\u00e9c\u00e9d\u00e9 le fileur, c'est-\u00e0-dire les erreurs qui ont caus\u00e9 le fileur. Dans ce sens, travailler avec les journaux de Patroni est assez pratique. Il \u00e9crit, \u00e0 intervalles r\u00e9guliers, les m\u00eames messages. Et si nous commen\u00e7ons \u00e0 faire d\u00e9filer ces journaux rapidement, nous verrons que les journaux ont chang\u00e9, ce qui signifie que des probl\u00e8mes ont commenc\u00e9. Nous retournons rapidement \u00e0 cet endroit et voyons ce qui se passe. <\/p>\n<p><\/p>\n<p>Dans une situation normale, les journaux ressemblent \u00e0 cela. Le propri\u00e9taire du verrou est v\u00e9rifi\u00e9. Et si le propri\u00e9taire, par exemple, a chang\u00e9, alors certains \u00e9v\u00e9nements peuvent se produire, auxquels Patroni doit r\u00e9agir. Mais dans ce cas, tout va bien. Nous cherchons le moment o\u00f9 les erreurs ont commenc\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f48ebd22a405f5b2900621451c68f543.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En faisant d\u00e9filer jusqu'\u00e0 cet endroit o\u00f9 les erreurs ont commenc\u00e9 \u00e0 appara\u00eetre, nous voyons qu'un autofailover a eu lieu. Et puisque nos erreurs \u00e9taient li\u00e9es \u00e0 l'interaction avec le DCS et dans notre cas, nous avons utilis\u00e9 Consul, nous consultons \u00e9galement les journaux de Consul pour voir ce qui s'est pass\u00e9 l\u00e0-bas. <\/p>\n<p><\/p>\n<p>En comparant approximativement l'heure de l'autofailover et l'heure dans les journaux de Consul, nous constatons que nos voisins du cluster Consul ont commenc\u00e9 \u00e0 douter de l'existence des autres participants du cluster Consul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/63b02ac5b4f5a34a2822f1eee2b1f2f8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et si nous regardons \u00e9galement les journaux d'autres agents Consul, nous voyons aussi qu'il se produit un certain type de collapse r\u00e9seau. Tous les participants du cluster Consul doutent les uns des autres. Cela a \u00e9t\u00e9 un d\u00e9clencheur pour l'autofailover. <\/p>\n<p><\/p>\n<p>Si nous examinons ce qui s'est pass\u00e9 avant ces erreurs, nous pouvons voir toutes sortes d'erreurs, par exemple, des d\u00e9lais, des \u00e9checs RPC, c'est-\u00e0-dire qu'il y a manifestement un probl\u00e8me d'interaction entre les participants du cluster Consul. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/b15c912f2afb49d9d85e7bb9361ce449.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La r\u00e9ponse la plus simple est de r\u00e9parer le r\u00e9seau. Mais pour moi, debout sur la tribune, c'est facile \u00e0 dire. Mais les circonstances font que le client ne peut pas toujours se permettre de r\u00e9parer le r\u00e9seau. Il peut vivre dans un DC et ne pas avoir la possibilit\u00e9 de r\u00e9parer le r\u00e9seau ou d'influencer l'\u00e9quipement. Ainsi, d'autres options sont n\u00e9cessaires. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/1dbdb66233acc3bc321a30a1c5fe14f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il existe des options :<\/p>\n<p><\/p>\n<ul>\n<li>La solution la plus simple, qui est apparemment m\u00eame \u00e9crite dans la documentation, consiste \u00e0 d\u00e9sactiver les contr\u00f4les Consul, c'est-\u00e0-dire \u00e0 simplement transmettre un tableau vide. Nous disons \u00e0 l'agent Consul de ne pas utiliser de contr\u00f4les. Gr\u00e2ce \u00e0 ces contr\u00f4les, nous pouvons ignorer les temp\u00eates r\u00e9seau et ne pas initier d'autofailover. <\/li>\n<li>Une autre option est de v\u00e9rifier le raft_multiplier. Il s'agit d'un param\u00e8tre du serveur Consul lui-m\u00eame. Par d\u00e9faut, il est r\u00e9gl\u00e9 sur 5. Ce param\u00e8tre est recommand\u00e9 par la documentation pour les environnements de staging. En essence, cela influence la fr\u00e9quence des \u00e9changes de messages entre les participants du r\u00e9seau Consul. Fondamentalement, ce param\u00e8tre affecte la rapidit\u00e9 de la communication entre les participants du cluster Consul. Et pour la production, il est d\u00e9j\u00e0 recommand\u00e9 de le r\u00e9duire afin que les n\u0153uds \u00e9changent des messages plus fr\u00e9quemment. <\/li>\n<li>Une autre option que nous avons commenc\u00e9e \u00e0 utiliser est d'augmenter la priorit\u00e9 des processus Consul par rapport aux autres processus pour le planificateur de processus du syst\u00e8me d'exploitation. Il existe un param\u00e8tre appel\u00e9 \u00ab nice \u00bb qui d\u00e9finit pr\u00e9cis\u00e9ment la priorit\u00e9 des processus que le planificateur de l'OS prend en compte lors de la planification. Nous avons donc r\u00e9duit la valeur nice pour les agents Consul, c'est-\u00e0-dire augment\u00e9 leur priorit\u00e9 afin que le syst\u00e8me d'exploitation accorde plus de temps aux processus Consul pour fonctionner et ex\u00e9cuter leur code. Dans notre cas, cela a r\u00e9solu notre probl\u00e8me. <\/li>\n<li>Une autre option est de ne pas utiliser Consul. J'ai un ami qui est un grand partisan d'Etcd. Nous avons r\u00e9guli\u00e8rement des d\u00e9bats sur ce qui est mieux, Etcd ou Consul. Mais en g\u00e9n\u00e9ral, nous parvenons \u00e0 la conclusion que Consul a un agent qui doit \u00eatre ex\u00e9cut\u00e9 sur chaque n\u0153ud avec la base de donn\u00e9es. C'est-\u00e0-dire que l'interaction de Patroni avec le cluster Consul se fait via cet agent. Et cet agent devient un goulot d'\u00e9tranglement. Si quelque chose arrive \u00e0 l'agent, Patroni ne peut plus interagir avec le cluster Consul. C'est un probl\u00e8me. Dans le cas d'Etcd, il n'y a pas d'agent. Patroni peut interagir directement avec la liste des serveurs Etcd et communiquer avec eux. \u00c0 cet \u00e9gard, si vous utilisez Etcd dans votre entreprise, Etcd sera probablement un meilleur choix que Consul. Mais chez nos clients, nous sommes souvent limit\u00e9s par ce que le client a choisi et utilise. Dans la plupart des cas, tous nos clients utilisent Consul. <\/li>\n<li>Et le dernier point est de revoir les valeurs des param\u00e8tres. Nous pouvons augmenter ces param\u00e8tres dans l'espoir que nos probl\u00e8mes r\u00e9seau temporaires seront courts et ne d\u00e9passeront pas l'intervalle de ces param\u00e8tres. Ainsi, nous pouvons r\u00e9duire l'agressivit\u00e9 de Patroni en ce qui concerne l'ex\u00e9cution de l'auto-failover, si des probl\u00e8mes de r\u00e9seau surviennent.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f0043050da20f6368dabf66ec9a4eade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je pense que beaucoup de ceux qui utilisent Patroni connaissent cette commande. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/9f78f59dab166e47ac78436802156d04.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cette commande montre l'\u00e9tat actuel du cluster. \u00c0 premi\u00e8re vue, cette situation peut sembler normale. Nous avons un master, nous avons une r\u00e9plique, il n'y a pas de latence de r\u00e9plication. Mais cette image est normale seulement jusqu'\u00e0 ce que nous sachions qu'il devrait y avoir trois n\u0153uds dans ce cluster et non deux. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a39c891f8620ba210b6bce0727e0fa8b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Par cons\u00e9quent, un failover automatique s'est produit. Et apr\u00e8s ce failover automatique, notre r\u00e9plique a disparu. Nous devons comprendre pourquoi elle a disparu et la ramener, la restaurer. Nous retournons donc dans les logs et v\u00e9rifions pourquoi nous avons eu ce failover automatique.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/e6e67d46cb20c8d7e58c7505157f68e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans ce cas, la deuxi\u00e8me r\u00e9plique est devenue le ma\u00eetre. Tout est en ordre ici. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/b86ccea68b0c6013a23bbd2804e48320.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et nous devons nous concentrer sur la r\u00e9plique qui a \u00e9chou\u00e9 et qui n'est pas dans le cluster. Nous ouvrons les logs de Patroni et v\u00e9rifions que lors de la connexion au cluster, un probl\u00e8me est survenu \u00e0 l'\u00e9tape pg_rewind. Pour se connecter au cluster, il faut revenir en arri\u00e8re dans le journal des transactions, demander le journal des transactions n\u00e9cessaire au ma\u00eetre et le rattraper. <\/p>\n<p><\/p>\n<p>Dans ce cas, nous n'avons pas de journal des transactions et la r\u00e9plique ne peut pas d\u00e9marrer. Par cons\u00e9quent, nous arr\u00eatons Postgres avec une erreur. Et c'est pourquoi elle n'est pas dans le cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/dadbd44b766674b719d85781ef7f0caa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il faut comprendre pourquoi elle n'est pas dans le cluster et pourquoi il n'y avait pas de logs. Nous allons sur le nouveau ma\u00eetre et v\u00e9rifions ce qu'il y a dans ses logs. Il s'av\u00e8re que lors de l'ex\u00e9cution de pg_rewind, un checkpoint s'est produit. Une partie des anciens journaux des transactions a simplement \u00e9t\u00e9 renomm\u00e9e. Lorsque l'ancien ma\u00eetre a essay\u00e9 de se connecter au nouveau ma\u00eetre et a demand\u00e9 ces logs, ils avaient d\u00e9j\u00e0 \u00e9t\u00e9 renomm\u00e9s, il n'y en avait tout simplement plus.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f2d5c37324f9436b2bdad1290612d86f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>J'ai compar\u00e9 les horodatages lorsque ces \u00e9v\u00e9nements se sont produits. Et la diff\u00e9rence est litt\u00e9ralement de 150 millisecondes, c'est-\u00e0-dire que le checkpoint s'est termin\u00e9 en 369 millisecondes, les segments WAL ont \u00e9t\u00e9 renomm\u00e9s. Et litt\u00e9ralement 517 millisecondes plus tard, 150 millisecondes apr\u00e8s, le rewind a d\u00e9marr\u00e9 sur l'ancienne r\u00e9plique. C'est-\u00e0-dire qu'il a suffi de 150 millisecondes pour que la r\u00e9plique ne puisse pas se connecter et fonctionner. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/99dd80deb8466bfc3aff568456e07102.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quelles sont les options ?<\/p>\n<p><\/p>\n<p>Nous avons d'abord utilis\u00e9 des slots de r\u00e9plication. Nous pensions que c'\u00e9tait une bonne chose. Bien que lors de la premi\u00e8re phase d'exploitation, nous ayons d\u00e9sactiv\u00e9 les slots. Nous pensions que si les slots accumulaient trop de segments WAL, nous pourrions faire tomber le ma\u00eetre. Il tomberait. Nous avons pass\u00e9 un certain temps sans slots. Et nous avons compris que nous avions besoin des slots, nous les avons remis. <\/p>\n<p><\/p>\n<p>Mais il y a un probl\u00e8me : lorsque le ma\u00eetre passe en r\u00e9plique, il supprime les slots et avec les slots, il supprime les segments WAL. Pour \u00e9viter ce probl\u00e8me, nous avons d\u00e9cid\u00e9 d'augmenter le param\u00e8tre wal_keep_segments. Par d\u00e9faut, il est de 8 segments. Nous l'avons port\u00e9 \u00e0 1000 et avons v\u00e9rifi\u00e9 combien d'espace libre nous avons. Ainsi, nous avons r\u00e9serv\u00e9 16 Go pour wal_keep_segments. C'est-\u00e0-dire qu'en passant d'un n\u0153ud \u00e0 un autre, nous avons toujours \u00e0 disposition 16 Go de journaux de transactions sur tous les n\u0153uds.<\/p>\n<p><\/p>\n<p>De plus, cela est particuli\u00e8rement pertinent pour les t\u00e2ches de maintenance prolong\u00e9es. Par exemple, nous devons mettre \u00e0 jour l'une des r\u00e9pliques. Nous voulons la mettre hors ligne. Nous devons mettre \u00e0 jour le logiciel, peut-\u00eatre le syst\u00e8me d'exploitation, ou autre chose. Lorsque nous mettons la r\u00e9plique hors ligne, le slot pour cette r\u00e9plique est \u00e9galement supprim\u00e9. Si nous utilisons un wal_keep_segments faible, alors pendant l'absence prolong\u00e9e de cette r\u00e9plique, les journaux de transactions vont dispara\u00eetre. Lorsque nous rel\u00e8verons la r\u00e9plique, elle demandera les journaux de transactions l\u00e0 o\u00f9 elle s'\u00e9tait arr\u00eat\u00e9e, mais il se peut qu'ils ne soient pas disponibles sur le ma\u00eetre. Cela emp\u00eachera la r\u00e9plique de se connecter. C'est pourquoi nous maintenons un grand r\u00e9servoir de journaux.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/dad55c828128ce92f649a99cc53ce54b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/63e70f0b098567f3a6d4fd66a0c293bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons une base de production. Des projets y fonctionnent d\u00e9j\u00e0. <\/p>\n<p><\/p>\n<p>Il y a eu un failover. Nous avons v\u00e9rifi\u00e9 et constat\u00e9 que tout allait bien, les r\u00e9pliques \u00e9taient en place, il n'y avait pas de retard de r\u00e9plication. Il n'y avait pas non plus d'erreurs dans les journaux, tout \u00e9tait en ordre. <\/p>\n<p><\/p>\n<p>L'\u00e9quipe produit dit qu'il devrait y avoir des donn\u00e9es, mais nous les voyons dans une source, tandis qu'elles ne sont pas visibles dans la base. Nous devons comprendre ce qui leur est arriv\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/568ca9aa31680d5e0c9d4ed9693b14e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il est clair que pg_rewind les a \u00e9cras\u00e9es. Nous l'avons imm\u00e9diatement compris, mais nous sommes all\u00e9s v\u00e9rifier ce qui s'\u00e9tait pass\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a8fee389201d96e81761cd276c5265c3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans les journaux, nous pouvons toujours trouver quand le failover s'est produit, qui est devenu ma\u00eetre et nous pouvons identifier qui \u00e9tait l'ancien ma\u00eetre et quand il a voulu devenir r\u00e9plique, c'est-\u00e0-dire que ces journaux sont n\u00e9cessaires pour d\u00e9terminer le volume de journaux de transactions qui a \u00e9t\u00e9 perdu.<\/p>\n<p><\/p>\n<p>Notre ancien ma\u00eetre a red\u00e9marr\u00e9. Patroni \u00e9tait configur\u00e9 pour se lancer au d\u00e9marrage. Patroni s'est donc lanc\u00e9, et il a ensuite d\u00e9marr\u00e9 Postgres. Plus pr\u00e9cis\u00e9ment, avant de lancer Postgres et avant de le transformer en r\u00e9plique, Patroni a ex\u00e9cut\u00e9 le processus pg_rewind. Ainsi, il a effac\u00e9 une partie des journaux de transactions, a t\u00e9l\u00e9charg\u00e9 les nouveaux et s'est connect\u00e9. Ici, Patroni a parfaitement fonctionn\u00e9, c'est-\u00e0-dire comme pr\u00e9vu. Notre cluster a \u00e9t\u00e9 restaur\u00e9. Nous avions 3 n\u0153uds, et apr\u00e8s le failover, nous avions toujours 3 n\u0153uds \u2013 tout est g\u00e9nial. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/b747a24f53e20ed098c2dc0afc79bead.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons perdu une partie des donn\u00e9es. Et nous devons comprendre combien nous avons perdu. Nous cherchons pr\u00e9cis\u00e9ment le moment o\u00f9 le rewind a eu lieu. Nous pouvons le trouver gr\u00e2ce \u00e0 ces enregistrements dans le journal. Le rewind a \u00e9t\u00e9 lanc\u00e9, a effectu\u00e9 certaines actions et s'est termin\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/5b7bacffb52e3ccd529a3a734c441295.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous devons trouver la position dans le journal des transactions o\u00f9 s'est arr\u00eat\u00e9 l'ancien ma\u00eetre. Dans ce cas, c'est cette marque-ci. Et nous avons besoin d'une seconde marque, c'est-\u00e0-dire de la distance qui s\u00e9pare l'ancien ma\u00eetre du nouveau. <\/p>\n<p><\/p>\n<p>Nous prenons la fonction pg_wal_lsn_diff habituelle et comparons ces deux marques. Dans ce cas, nous obtenons 17 m\u00e9gaoctets. Chacun juge si c'est beaucoup ou peu. Parce que pour certains, 17 m\u00e9gaoctets, c'est peu, pour d'autres, c'est beaucoup et inacceptable. Chacun doit d\u00e9terminer cela individuellement en fonction des besoins de son entreprise. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/55335fce85961e159459c38300a0ad12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais qu'avons-nous conclu pour nous-m\u00eames ? <\/p>\n<p><\/p>\n<p>Tout d'abord, nous devons d\u00e9cider si nous avons toujours besoin du d\u00e9marrage automatique de Patroni apr\u00e8s un red\u00e9marrage syst\u00e8me. Souvent, il est n\u00e9cessaire de se connecter \u00e0 l'ancien ma\u00eetre, de voir \u00e0 quel point il est en retard. Il peut \u00eatre n\u00e9cessaire d'inspecter les segments du journal des transactions pour comprendre si nous pouvons perdre ces donn\u00e9es ou si nous devons d\u00e9marrer l'ancien ma\u00eetre en mode autonome pour r\u00e9cup\u00e9rer ces donn\u00e9es. <\/p>\n<p><\/p>\n<p>Et seulement apr\u00e8s cela, nous devons prendre des d\u00e9cisions sur la possibilit\u00e9 de rejeter ces donn\u00e9es ou de les r\u00e9cup\u00e9rer, en connectant ce n\u0153ud en tant que r\u00e9plique dans notre cluster.<\/p>\n<p><\/p>\n<p>En outre, il y a un param\u00e8tre \u00ab maximum_lag_on_failover \u00bb. Par d\u00e9faut, si ma m\u00e9moire est bonne, cette valeur est de 1 m\u00e9gaoctet. <\/p>\n<p><\/p>\n<p>Comment \u00e7a fonctionne ? Si notre r\u00e9plique est en retard de 1 m\u00e9gaoctet en mati\u00e8re de lag de r\u00e9plication, cette r\u00e9plique ne participe pas aux \u00e9lections. Et si jamais il y a un basculement, Patroni v\u00e9rifie quelles r\u00e9pliques sont en retard. Si elles le sont sur une grande quantit\u00e9 de journaux de transactions, elles ne peuvent pas devenir ma\u00eetres. C'est une tr\u00e8s bonne fonction de protection qui permet d'\u00e9viter une perte de donn\u00e9es importante. <\/p>\n<p><\/p>\n<p>Mais il y a un probl\u00e8me, le lag de r\u00e9plication dans le cluster Patroni et DCS est mis \u00e0 jour \u00e0 intervalles r\u00e9guliers. Je pense que la valeur ttl par d\u00e9faut est de 30 secondes.<\/p>\n<p><\/p>\n<p>Il peut donc y avoir des situations o\u00f9 le d\u00e9lai de r\u00e9plication pour les r\u00e9pliques dans le DCS est un, alors qu'en r\u00e9alit\u00e9, il peut y avoir un autre d\u00e9lai compl\u00e8tement diff\u00e9rent ou il se peut qu'il n'y ait pas de d\u00e9lai du tout, c'est-\u00e0-dire que ce syst\u00e8me n'est pas en temps r\u00e9el. Et il ne refl\u00e8te pas toujours la r\u00e9alit\u00e9. Il ne vaut donc pas la peine d\u2019y \u00e9tablir une logique complexe. <\/p>\n<p><\/p>\n<p>Et le risque de perte de donn\u00e9es reste toujours. Dans le pire des cas, il y a une formule, et dans le cas moyen, une autre formule. C'est-\u00e0-dire que lorsque nous planifions l'impl\u00e9mentation de Patroni et \u00e9valuons combien de donn\u00e9es nous pouvons perdre, nous devons nous baser sur ces formules et avoir une id\u00e9e g\u00e9n\u00e9rale de la quantit\u00e9 de donn\u00e9es que nous pourrions perdre. <\/p>\n<p><\/p>\n<p>Et il y a une bonne nouvelle. Lorsque l'ancien ma\u00eetre part en avant, il peut avancer gr\u00e2ce \u00e0 certains processus en arri\u00e8re-plan. C'est-\u00e0-dire qu'il y a eu un autovacuum qui a \u00e9crit des donn\u00e9es et les a enregistr\u00e9es dans le journal des transactions. Et nous pouvons facilement ignorer ces donn\u00e9es et les perdre. Il n'y a pas de probl\u00e8me \u00e0 cela. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a86e8971ab4ef41b89af9cf0bdf519ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voici \u00e0 quoi ressemblent les journaux lorsque maximum_lag_on_failover est d\u00e9fini et qu'un failover s'est produit, n\u00e9cessitant le choix d'un nouveau ma\u00eetre. La r\u00e9plique s'\u00e9value comme incapable de participer aux \u00e9lections. Elle refuse de participer \u00e0 la course pour le leadership. Elle attend qu'un nouveau ma\u00eetre soit choisi, afin de pouvoir s'y connecter par la suite. C'est une mesure suppl\u00e9mentaire contre la perte de donn\u00e9es.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f760788e5951facdd08b2069037830fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/c32f26e7526e1873f3bfd7d3693fcc72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Notre \u00e9quipe produit a signal\u00e9 que son produit rencontre des probl\u00e8mes lors de l'utilisation de Postgres. Cependant, on ne peut pas acc\u00e9der au ma\u00eetre lui-m\u00eame, car il n'est pas accessible par SSH. Et l'autofailover ne se produit pas non plus. <\/p>\n<p><\/p>\n<p>Cet h\u00f4te a \u00e9t\u00e9 forc\u00e9 \u00e0 red\u00e9marrer. En raison du red\u00e9marrage, un autofailover s'est produit, bien qu'un autofailover manuel ait \u00e9galement pu \u00eatre effectu\u00e9, comme je le comprends maintenant. Et apr\u00e8s le red\u00e9marrage, nous commen\u00e7ons \u00e0 analyser ce qui se passe avec notre ma\u00eetre actuel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/95efb82e0647a396a21683cd53a69547.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous savions d'avance que nous avions des probl\u00e8mes avec les disques, c'est-\u00e0-dire que par le monitoring, nous savions d\u00e9j\u00e0 o\u00f9 chercher et quoi chercher. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/367aaab607d833d96a573ddbbbced502.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons plong\u00e9 dans le journal de postgres, commenc\u00e9 \u00e0 voir ce qui s'y passait. Nous avons vu des validations qui duraient une \u00e0 trois secondes, ce qui n'est pas normal du tout. Nous avons constat\u00e9 que notre autovacuum se d\u00e9clenchait tr\u00e8s lentement et bizarrement. Et nous avons vu des fichiers temporaires sur le disque. C'est-\u00e0-dire que tous ces indicateurs montrent des probl\u00e8mes avec les disques. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/7e0cfce7a81901ef9ef736c3fefc8dce.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons consult\u00e9 le dmesg syst\u00e8me (le journal des messages du noyau). Et nous avons constat\u00e9 qu'il y avait un probl\u00e8me avec l'un des disques. La configuration de la sous-syst\u00e8me de disque \u00e9tait un RAID logiciel. Nous avons regard\u00e9 \/proc\/mdstat et avons remarqu\u00e9 qu'il nous manque un disque. En d'autres termes, il s'agit d'un RAID de 8 disques, et nous avons un disque manquant. Si l'on examine attentivement la diapositive, on peut voir que le sde est absent. Nous avons, pour ainsi dire, perdu un disque. Cela a d\u00e9clench\u00e9 des probl\u00e8mes de disque, et les applications ont \u00e9galement eu des difficult\u00e9s \u00e0 fonctionner avec le cluster Postgres.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/4b09b3aa761cb504fa79173ef280faac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans ce cas, Patroni ne nous aurait pas aid\u00e9s, car Patroni n'a pas pour t\u00e2che de surveiller l'\u00e9tat du serveur ou des disques. Nous devons surveiller ces situations avec une surveillance externe. Nous avons rapidement ajout\u00e9 la surveillance des disques \u00e0 la surveillance externe. <\/p>\n<p><\/p>\n<p>Et il y avait cette id\u00e9e - est-ce que le fencing ou un logiciel watchdog pourraient nous aider ? Nous avons pens\u00e9 qu'il serait peu probable qu'ils nous aident dans ce cas, car pendant les probl\u00e8mes, Patroni continuait \u00e0 interagir avec le cluster DCS et ne voyait aucun probl\u00e8me. En d'autres termes, du point de vue de DCS et de Patroni, tout allait bien avec le cluster, bien qu'en r\u00e9alit\u00e9, il y avait des probl\u00e8mes de disque et de disponibilit\u00e9 de la base. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/15fdac78535355d4eb889efcc27efc46.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 mon avis, c'est l'un des probl\u00e8mes les plus \u00e9tranges que j'ai \u00e9tudi\u00e9s pendant longtemps, j'ai relu beaucoup de journaux, et je l'ai appel\u00e9 un cluster-simulateur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/b5259774931c290eda6673deb14b6c48.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le probl\u00e8me \u00e9tait que l'ancien ma\u00eetre ne pouvait pas devenir une r\u00e9plique normale, c'est-\u00e0-dire que Patroni le d\u00e9marrait, Patroni montrait que ce n\u0153ud \u00e9tait pr\u00e9sent en tant que r\u00e9plique, mais en m\u00eame temps, il n'\u00e9tait pas une r\u00e9plique normale. Vous allez voir pourquoi. Cela m'est rest\u00e9 de l'analyse de ce probl\u00e8me. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/c35a5d102a46764bbf96e5a75ee88171.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et comment tout a commenc\u00e9 ? Cela a commenc\u00e9, comme dans le pr\u00e9c\u00e9dent probl\u00e8me, par des lenteurs li\u00e9es \u00e0 des disques. Nous avions des commits toutes les secondes, voire deux. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/435c1b350a89f288e0e10ca9d5a2ec6e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il y avait des coupures de connexion, c'est-\u00e0-dire que les clients \u00e9taient d\u00e9connect\u00e9s. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/920cb1f3f3b40578e15e6ff711e85c50.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il y avait des blocages de diverses gravit\u00e9s. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/285d6292d89b928a85e95602ee57d38a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et, par cons\u00e9quent, le sous-syst\u00e8me de disques n'\u00e9tait pas tr\u00e8s r\u00e9actif. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/ebe71d49360e7f604ecd6a3c8276cb73.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et ce qui est le plus myst\u00e9rieux pour moi, c'est cette requ\u00eate de shutdown imm\u00e9diate qui est arriv\u00e9e. Postgres a trois modes d'arr\u00eat :<\/p>\n<p><\/p>\n<ul>\n<li>Il y a le mode gracieux, o\u00f9 nous attendons que tous les clients se d\u00e9connectent d'eux-m\u00eames. <\/li>\n<li>Il y a le mode rapide, o\u00f9 nous obligeons les clients \u00e0 se d\u00e9connecter, car nous allons proc\u00e9der \u00e0 l'arr\u00eat. <\/li>\n<li>L'arr\u00eat imm\u00e9diat. Dans ce cas, l'arr\u00eat imm\u00e9diat ne pr\u00e9vient m\u00eame pas les clients qu'il faut se d\u00e9connecter, il se coupe simplement sans avertissement. Tous les clients re\u00e7oivent un message RST du syst\u00e8me d'exploitation (message TCP indiquant que la connexion a \u00e9t\u00e9 interrompue et qu'il n'y a plus rien \u00e0 capter pour le client). <\/li>\n<\/ul>\n<p><\/p>\n<p>Qui a envoy\u00e9 ce signal ? Les processus en arri\u00e8re-plan de Postgres ne s'envoient pas de tels signaux, c'est-\u00e0-dire que c'est un kill -9. Ils ne s'envoient pas \u00e7a, ils r\u00e9agissent juste \u00e0 cela, donc c'est un red\u00e9marrage d'urgence de Postgres. Je ne sais pas qui l'a envoy\u00e9. <\/p>\n<p><\/p>\n<p>J'ai consult\u00e9 la commande \u00ab last \u00bb et j'ai vu une personne qui s'est \u00e9galement connect\u00e9e \u00e0 ce serveur avec nous, mais j'ai h\u00e9sit\u00e9 \u00e0 poser la question. Peut-\u00eatre que c'\u00e9tait un kill -9. J'aurais vu le kill -9 dans les logs, car Postgres indique avoir re\u00e7u un kill -9, mais je ne l'ai pas vu dans les logs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/fe8e844649cea3384ebfde86e36eba44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En continuant d'analyser, j'ai remarqu\u00e9 que Patroni n'avait pas \u00e9crit dans les logs pendant assez longtemps \u2013 54 secondes. Si l'on compare deux horodatages, il y avait environ 54 secondes sans messages. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/ffb1c4db3d7de591d77d56ed2fcc4f2a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et pendant ce temps, un basculement automatique s'est produit. Patroni a fonctionn\u00e9 \u00e0 merveille ici. Notre ancien ma\u00eetre \u00e9tait inaccessible, quelque chose lui arrivait. Et les \u00e9lections pour un nouveau ma\u00eetre ont commenc\u00e9. Tout cela s'est bien d\u00e9roul\u00e9. Notre pgsql01 est devenu le nouveau leader. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/6b2457653e9f77af44cd64b4aff021a0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons une r\u00e9plique qui est devenue ma\u00eetre. Et il y a une seconde r\u00e9plique. Et c'est avec cette seconde r\u00e9plique qu'il y avait des probl\u00e8mes. Elle essayait de se reconfigurer. D'apr\u00e8s ce que je comprends, elle tentait de changer le recovery.conf, de red\u00e9marrer Postgres et de se connecter au nouveau ma\u00eetre. Elle envoie des messages toutes les 10 secondes, disant qu'elle essaie, mais n'y parvient pas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/381818f189e19c3e1154074b4652f837.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et pendant ces tentatives, un signal d'arr\u00eat imm\u00e9diat arrive sur l'ancien ma\u00eetre. Le ma\u00eetre red\u00e9marre. Et \u00e9galement, la r\u00e9cup\u00e9ration s'arr\u00eate, car l'ancien ma\u00eetre se met \u00e0 red\u00e9marrer. C'est-\u00e0-dire que la r\u00e9plique ne peut pas se connecter \u00e0 lui parce qu'il est en mode arr\u00eat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/d8a8cde925fa8fe601d44ab908ae69dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 un moment donn\u00e9, elle a fonctionn\u00e9, mais la r\u00e9plication ne s'est pas lanc\u00e9e. <\/p>\n<p><\/p>\n<p>J'ai une seule hypoth\u00e8se, c'est que l'adresse de l'ancien ma\u00eetre \u00e9tait dans le recovery.conf. Et quand le nouveau ma\u00eetre est apparu, la seconde r\u00e9plique essayait toujours de se connecter \u00e0 l'ancien ma\u00eetre. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/425ea3af1f1e186f4760e1fb1f5419fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quand Patroni s'est lanc\u00e9 sur la seconde r\u00e9plique, le n\u0153ud a d\u00e9marr\u00e9, mais n'a pas pu se connecter en r\u00e9plication. Et un retard de r\u00e9plication s'est form\u00e9, qui ressemblait \u00e0 cela. C'est-\u00e0-dire que les trois n\u0153uds \u00e9taient pr\u00e9sents, mais le second n\u0153ud \u00e9tait en retard. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/f564eacd9944666c9a3f5bea634ede6b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cependant, si l'on regarde les journaux qui ont \u00e9t\u00e9 \u00e9crits, on peut voir que la r\u00e9plication ne peut pas d\u00e9marrer, car les journaux de transactions sont diff\u00e9rents. Et les journaux de transactions propos\u00e9s par le ma\u00eetre, qui sont sp\u00e9cifi\u00e9s dans recovery.conf, ne conviennent tout simplement pas \u00e0 notre n\u0153ud actuel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/6b09947d157c9ef0a190da2df2cb5892.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et ici, j'ai fait une erreur. Je devais aller v\u00e9rifier ce qu'il y avait dans recovery.conf, pour v\u00e9rifier mon hypoth\u00e8se selon laquelle nous ne nous connectons pas au bon ma\u00eetre. Mais \u00e0 l'\u00e9poque, je d\u00e9butais juste avec \u00e7a et \u00e7a ne m'est pas venu \u00e0 l'esprit, ou alors j'ai vu que la r\u00e9plication \u00e9tait en retard et qu'il faudrait la r\u00e9initialiser, c'est-\u00e0-dire que j'ai un peu travaill\u00e9 \u00e0 l'arrache. C'\u00e9tait ma faute. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/159f2256fd81428fd0d82a255528887d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trente minutes plus tard, l'administrateur est arriv\u00e9, c'est-\u00e0-dire que j'ai red\u00e9marr\u00e9 Patroni sur la r\u00e9plique. Je l'avais d\u00e9j\u00e0 ray\u00e9e de mes espoirs, je pensais qu'il faudrait la r\u00e9initialiser. J'ai donc pens\u00e9 - je vais red\u00e9marrer Patroni, peut-\u00eatre que \u00e7a fera quelque chose de bien. La r\u00e9cup\u00e9ration a d\u00e9marr\u00e9. Et la base de donn\u00e9es s'est m\u00eame ouverte, elle \u00e9tait pr\u00eate \u00e0 accepter des connexions. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/aeac98750386c8389d39e006a229cc85.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La r\u00e9plication a d\u00e9marr\u00e9. Mais au bout d'une minute, elle s'est arr\u00eat\u00e9e avec une erreur indiquant que les journaux de transactions ne correspondaient pas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/17eaba000a79c80c29d1bc3902de05e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>J'ai pens\u00e9 \u00e0 red\u00e9marrer encore une fois. J'ai red\u00e9marr\u00e9 \u00e0 nouveau Patroni, et je n'ai pas red\u00e9marr\u00e9 Postgres, mais j'ai red\u00e9marr\u00e9 sp\u00e9cifiquement Patroni en esp\u00e9rant qu'il d\u00e9marre la base de donn\u00e9es par un miracle. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a85b38e033c45ad73da317f41e0ef24a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La r\u00e9plication a red\u00e9marr\u00e9, mais les marques dans les journaux de transactions \u00e9taient diff\u00e9rentes, elles n'\u00e9taient pas celles de la tentative de d\u00e9marrage pr\u00e9c\u00e9dente. La r\u00e9plication s'est encore arr\u00eat\u00e9e. Et le message \u00e9tait d\u00e9j\u00e0 l\u00e9g\u00e8rement diff\u00e9rent. Et il n'\u00e9tait pas tr\u00e8s informatif pour moi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/fd90d708230bd54af685786c7e361ee1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et l\u00e0, il m'est venu \u00e0 l'esprit - et si je red\u00e9marre Postgres, pendant ce temps, je fais un checkpoint sur le ma\u00eetre actuel, pour faire avancer la position dans le journal des transactions un peu plus loin, pour que la r\u00e9cup\u00e9ration commence \u00e0 un autre moment ? De plus, nous avions aussi des r\u00e9serves de WAL. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/19e67f95d1a74141a013947c9aa39e38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>J'ai red\u00e9marr\u00e9 Patroni, fait quelques checkpoints sur le ma\u00eetre, quelques points de red\u00e9marrage sur la r\u00e9plique, quand elle s'est ouverte. Et cela a aid\u00e9. J'ai longtemps r\u00e9fl\u00e9chi \u00e0 pourquoi cela a fonctionn\u00e9 et comment cela a \u00e9t\u00e9 possible. Et la r\u00e9plique a d\u00e9marr\u00e9. Et la r\u00e9plication ne s'est plus interrompue. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/418ca59a681be84f51ed374a73a759c9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce probl\u00e8me est l'un des plus myst\u00e9rieux pour moi, et je me demande encore ce qui se passait r\u00e9ellement. <\/p>\n<p><\/p>\n<p>Quelles sont les conclusions ici ? Patroni peut fonctionner comme pr\u00e9vu et sans erreurs. Mais cela ne garantit pas \u00e0 100 % que tout va bien. Une r\u00e9plique peut se lancer, mais elle peut \u00eatre dans un \u00e9tat semi-fonctionnel, et l'application ne doit pas travailler avec une telle r\u00e9plique, car elle contient des donn\u00e9es anciennes. <\/p>\n<p><\/p>\n<p>Et apr\u00e8s un failover, il est toujours n\u00e9cessaire de v\u00e9rifier que tout va bien avec le cluster, c'est-\u00e0-dire qu'il y a le nombre n\u00e9cessaire de r\u00e9pliques et qu'il n'y a pas de retard de r\u00e9plication.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/aca7047ff33d3efe14071b798b554091.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et pendant que j'examine ces probl\u00e8mes, je vais formuler des recommandations. J'ai essay\u00e9 de les regrouper sur deux diapositives. Peut-\u00eatre que toutes les histoires pouvaient \u00eatre r\u00e9unies en deux diapositives et seulement racont\u00e9es.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/d4ad31b26d83c8846fe4097a11d70849.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lorsque vous utilisez Patroni, vous devez absolument avoir un monitoring. Vous devez toujours savoir quand un failover automatique a eu lieu, car si vous ne savez pas qu'un failover automatique s'est produit, vous ne contr\u00f4lez pas le cluster. Et c'est mauvais.<\/p>\n<p><\/p>\n<p>Apr\u00e8s chaque failover, nous devons toujours v\u00e9rifier manuellement le cluster. Nous devons nous assurer qu'il y a toujours le nombre actuel de r\u00e9pliques, qu'il n'y a pas de retard de r\u00e9plication, et qu'il n'y a pas d'erreurs dans les logs li\u00e9es \u00e0 la r\u00e9plication en continu, \u00e0 Patroni ou au syst\u00e8me DCS.<\/p>\n<p><\/p>\n<p>L'automatisation peut fonctionner avec succ\u00e8s, Patroni est un tr\u00e8s bon outil. Il peut fonctionner, mais cela ne conduira pas le cluster \u00e0 l'\u00e9tat souhait\u00e9. Et si nous ne le d\u00e9couvrons pas, nous aurons des probl\u00e8mes.<\/p>\n<p><\/p>\n<p>Et Patroni n'est pas une solution miracle. Nous devons toujours avoir une id\u00e9e de comment fonctionne Postgres, comment fonctionne la r\u00e9plication et comment Patroni interagit avec Postgres, et comment l'interaction entre les n\u0153uds est assur\u00e9e. Cela est n\u00e9cessaire pour pouvoir r\u00e9soudre manuellement les probl\u00e8mes qui surviennent.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/ea4162df3561d2ea7001f2ef6788eaaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comment aborde-je la question du diagnostic ? Il se trouve que nous travaillons avec diff\u00e9rents clients et personne n\u2019a de stack ELK, donc nous devons analyser les logs, en ouvrant 6 consoles et 2 onglets. Dans un onglet, il y a les logs de Patroni pour chaque n\u0153ud, dans l'autre, ce sont les logs de Consul, ou les logs de Postgres si n\u00e9cessaire. Diagnostiquer cela est tr\u00e8s difficile. <\/p>\n<p><\/p>\n<p>Quelles approches ai-je \u00e9labor\u00e9es ? Premi\u00e8rement, je regarde toujours quand le failover est survenu. Et pour moi, c'est une sorte de point de s\u00e9paration. Je regarde ce qui s'est pass\u00e9 avant le failover, pendant le failover et apr\u00e8s le failover. Le failover a deux marques : le temps de d\u00e9but et de fin. <\/p>\n<p><\/p>\n<p>Ensuite, je consulte les journaux pour voir les \u00e9v\u00e9nements avant le basculement, c'est-\u00e0-dire que je cherche les raisons pour lesquelles le basculement a eu lieu. <\/p>\n<p><\/p>\n<p>Et cela donne une image de ce qui s'est pass\u00e9 et de ce que nous pouvons faire \u00e0 l'avenir pour \u00e9viter que de telles circonstances ne se reproduisent (et par cons\u00e9quent, que le basculement ne se produise).<\/p>\n<p><\/p>\n<p>Et o\u00f9 regardons-nous g\u00e9n\u00e9ralement ? Je regarde :<\/p>\n<p><\/p>\n<ul>\n<li>D'abord dans les journaux de Patroni. <\/li>\n<li>Ensuite, je regarde les journaux de Postgres ou les journaux DCS, selon ce que j'ai trouv\u00e9 dans les journaux de Patroni. <\/li>\n<li>Et les journaux syst\u00e8me donnent parfois une id\u00e9e de ce qui a caus\u00e9 le basculement. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/a53618e366020e1a550d852fc308c188.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quel est mon avis sur Patroni ? J'ai une tr\u00e8s bonne opinion de Patroni. \u00c0 mon avis, c'est le meilleur outil qui existe aujourd'hui. Je connais beaucoup d'autres produits. C'est Stolon, Repmgr, Pg_auto_failover, PAF. Quatre outils. Je les ai tous essay\u00e9s. Patroni est celui qui m'a le plus plu. <\/p>\n<p><\/p>\n<p>Si on me demande : \u00ab Recommande-je Patroni ? \u00bb. Je dirai oui, parce que j'aime Patroni. Et je pense avoir appris \u00e0 bien l'utiliser. <\/p>\n<p><\/p>\n<p>Si vous \u00eates int\u00e9ress\u00e9 \u00e0 voir quels autres probl\u00e8mes peuvent survenir avec Patroni, \u00e0 part ceux que j'ai mentionn\u00e9s, vous pouvez toujours aller sur la page <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\/issues\/\">issues<\/a><\/noindex> sur GitHub. Il y a beaucoup d'histoires diverses et de nombreux probl\u00e8mes int\u00e9ressants y sont discut\u00e9s. En fin de compte, certains bugs ont \u00e9t\u00e9 signal\u00e9s et r\u00e9solus, c'est-\u00e0-dire que c'est une lecture int\u00e9ressante. <\/p>\n<p><\/p>\n<p>Il y a des histoires int\u00e9ressantes sur comment des gens se tirent dans le pied. Tr\u00e8s instructif. Vous lisez et vous comprenez qu'il ne faut pas faire cela. Je me suis fait un rappel. <\/p>\n<p><\/p>\n<p>Et je tiens \u00e0 remercier chaleureusement l'entreprise Zalando pour le d\u00e9veloppement de ce projet, notamment Alexandre Kukushkin et Alexey Klyukin. Alexey Klyukin est l'un des co-auteurs, il ne travaille plus chez Zalando, mais ce sont deux personnes qui ont commenc\u00e9 \u00e0 travailler avec ce produit. <\/p>\n<p><\/p>\n<p>Et je pense que Patroni est une chose vraiment g\u00e9niale. Je suis content qu'il existe, c'est int\u00e9ressant de travailler avec. Et un grand merci \u00e0 tous les contributeurs qui \u00e9crivent des patches pour Patroni. J'esp\u00e8re que Patroni deviendra plus mature, g\u00e9nial et fonctionnel avec le temps. Il est d\u00e9j\u00e0 fonctionnel, mais j'esp\u00e8re qu'il s'am\u00e9liorera encore. Donc si vous envisagez d'utiliser Patroni, n'ayez pas peur. C'est une bonne solution, elle peut \u00eatre mise en \u0153uvre et utilis\u00e9e. <\/p>\n<p><\/p>\n<p>C'est tout. Si vous avez des questions, n'h\u00e9sitez pas \u00e0 les poser.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Histoires d&#039;\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky\" src=\"\/wp-content\/uploads\/2020\/07\/85c2fef2455999b48413c9fc3b235ed6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questions<\/p>\n<p><\/p>\n<p><em>Merci pour la pr\u00e9sentation ! Si apr\u00e8s le basculement il faut toujours regarder l\u00e0-dedans de pr\u00e8s, pourquoi avons-nous besoin d'un basculement automatique ?<\/em> <\/p>\n<p><\/p>\n<p>Parce que c'est quelque chose de nouveau. Nous travaillons avec cela depuis seulement un an. Mieux vaut \u00eatre prudent. Nous voulons entrer et voir si tout a vraiment fonctionn\u00e9 comme pr\u00e9vu. C'est un niveau de m\u00e9fiance adulte : mieux vaut v\u00e9rifier et observer. <\/p>\n<p><\/p>\n<p><em>Par exemple, nous sommes entr\u00e9s le matin et avons v\u00e9rifi\u00e9, n'est-ce pas ?<\/em><\/p>\n<p><\/p>\n<p>Pas le matin, nous apprenons g\u00e9n\u00e9ralement l'auto-failover presque imm\u00e9diatement. Nous recevons des notifications, nous voyons qu'un auto-failover a eu lieu. Nous venons presque imm\u00e9diatement et v\u00e9rifions. Mais toutes ces v\u00e9rifications devraient \u00eatre d\u00e9l\u00e9gu\u00e9es \u00e0 un niveau de surveillance. Si nous appelons Patroni via l'API REST, il y a un historique. Gr\u00e2ce \u00e0 cet historique, nous pouvons voir les horodatages des occurrences de failover. Sur cette base, nous pouvons faire de la surveillance. Nous pouvons voir l'historique, combien d'\u00e9v\u00e9nements ont eu lieu. Si nous avons plus d'\u00e9v\u00e9nements, cela signifie qu'un auto-failover s'est produit. Nous pouvons aller v\u00e9rifier. Ou notre automatisation dans la surveillance a v\u00e9rifi\u00e9 que toutes nos r\u00e9pliques sont en place, qu'il n'y a pas de latence et que tout va bien. <\/p>\n<p><\/p>\n<p><em>Merci!<\/em><\/p>\n<p><\/p>\n<p><em>Merci beaucoup pour cet excellent r\u00e9cit ! Si nous d\u00e9pla\u00e7ons le cluster DCS loin du cluster Postgres, ce cluster doit-il \u00e9galement \u00eatre entretenu p\u00e9riodiquement ? Quelles sont les meilleures pratiques concernant le fait que certaines parties du cluster DCS doivent \u00eatre arr\u00eat\u00e9es, qu'il faut faire quelque chose avec elles, etc. ? Comment toute cette structure fonctionne-t-elle alors ? Et comment faire ces choses ?<\/em><\/p>\n<p><\/p>\n<p>Pour une entreprise, il \u00e9tait n\u00e9cessaire de cr\u00e9er une matrice de probl\u00e8mes pour savoir ce qui se passe si l'un des composants ou plusieurs composants tombent en panne. \u00c0 partir de cette matrice, nous passons en revue tous les composants et construisons des sc\u00e9narios en cas de panne de ces composants. En cons\u00e9quence, pour chaque sc\u00e9nario de panne, il est possible d'avoir un plan d'action pour la r\u00e9cup\u00e9ration. Et dans le cas du DCS, cela fait partie de l'infrastructure standard. Et l'admin en assure la gestion, et nous comptons d\u00e9j\u00e0 sur les admins qui le g\u00e8rent et sur leur capacit\u00e9 \u00e0 le r\u00e9parer en cas d'urgence. S'il n'y a pas de DCS, nous le d\u00e9ployons, mais nous ne le surveillons pas particuli\u00e8rement, car nous ne sommes pas responsables de l'infrastructure, mais nous donnons des recommandations sur quoi et comment surveiller. <\/p>\n<p><\/p>\n<p><em>C'est-\u00e0-dire, ai-je bien compris qu'il faut d\u00e9sactiver Patroni, d\u00e9sactiver le failover, d\u00e9sactiver tout avant de faire quoi que ce soit avec les h\u00f4tes ?<\/em><\/p>\n<p><\/p>\n<p>Cela d\u00e9pend du nombre de n\u0153uds dans le cluster DCS. S'il y a beaucoup de n\u0153uds et que l'on met hors service seulement un des n\u0153uds (r\u00e9plique), alors le quorum reste intact dans le cluster. Patroni reste op\u00e9rationnel et rien n'est d\u00e9clench\u00e9. Si nous avons des op\u00e9rations complexes touchant plusieurs n\u0153uds, dont l'absence peut compromettre le quorum, alors oui, il peut \u00eatre judicieux de mettre Patroni en pause. Il dispose d'une commande appropri\u00e9e : patronictl pause, patronictl resume. Nous mettons simplement en pause, et l'auto-failover ne se d\u00e9clenche pas pendant ce temps. Nous effectuons une maintenance sur le cluster DCS, puis nous levons la pause et continuons \u00e0 fonctionner.<\/p>\n<p><\/p>\n<p><em>Merci beaucoup !<\/em><\/p>\n<p><\/p>\n<p><em>Un grand merci pour la pr\u00e9sentation ! Quelle est l'attitude de l'\u00e9quipe produit face \u00e0 la possibilit\u00e9 de perte de donn\u00e9es ?<\/em> <\/p>\n<p><\/p>\n<p>Les \u00e9quipes produits s'en fichent, mais les chefs d'\u00e9quipe s'inqui\u00e8tent. <\/p>\n<p><\/p>\n<p><em>Quelles garanties y a-t-il ?<\/em><\/p>\n<p><\/p>\n<p>Les garanties sont tr\u00e8s difficiles. Il y a une pr\u00e9sentation par Alexandre Koukhouchkine intitul\u00e9e \u00ab Comment calculer RPO et RTO \u00bb, c'est-\u00e0-dire le temps de r\u00e9tablissement et combien de donn\u00e9es nous pouvons perdre. Je pense qu'il faut retrouver ces diapositives et les \u00e9tudier. Si je me souviens bien, il y a des \u00e9tapes concr\u00e8tes sur comment calculer ces \u00e9l\u00e9ments. Combien de transactions nous pouvons perdre, combien de donn\u00e9es nous pouvons perdre. En option, nous pouvons utiliser la r\u00e9plication synchrone au niveau de Patroni, mais c'est une \u00e9p\u00e9e \u00e0 double tranchant : soit nous avons la fiabilit\u00e9 des donn\u00e9es, soit nous perdons en vitesse. Il existe une r\u00e9plication synchrone, mais elle ne garantit pas non plus une protection \u00e0 100 % contre la perte de donn\u00e9es.<\/p>\n<p><\/p>\n<p><em>Alexe\u00ef, merci pour cette excellente pr\u00e9sentation ! Avez-vous de l'exp\u00e9rience avec l'utilisation de Patroni pour une protection de niveau z\u00e9ro ? C'est-\u00e0-dire en association avec un standby synchrone ? C'est ma premi\u00e8re question. Et ma deuxi\u00e8me question. Vous avez utilis\u00e9 diff\u00e9rentes solutions. Nous avons utilis\u00e9 Repmgr, mais sans auto-failover et nous pr\u00e9voyons maintenant de le connecter \u00e0 l'auto-failover. Nous envisageons Patroni comme une solution alternative. Que pouvez-vous dire des avantages par rapport \u00e0 Repmgr ?<\/em><\/p>\n<p><\/p>\n<p>La premi\u00e8re question concernait les r\u00e9pliques synchrones. Personne n'utilise la r\u00e9plication synchrone chez nous, car tout le monde a peur (D\u00e9j\u00e0, plusieurs clients l'utilisent, et n'ont pas remarqu\u00e9 de probl\u00e8mes de performance en g\u00e9n\u00e9ral \u2014 <em>Note du pr\u00e9sentateur<\/em>). Mais nous avons \u00e9tabli une r\u00e8gle selon laquelle un cluster de r\u00e9plication synchronis\u00e9e doit comporter au moins trois n\u0153uds, car si nous avons deux n\u0153uds et que le ma\u00eetre ou la r\u00e9plique tombe en panne, Patroni met ce n\u0153ud en mode autonome pour que l'application continue de fonctionner. Dans ce cas, il y a des risques de perte de donn\u00e9es.<\/p>\n<p><\/p>\n<p>Concernant la deuxi\u00e8me question, nous avons utilis\u00e9 Repmgr et nous l'utilisons encore chez certains clients pour des raisons historiques. Que peut-on dire ? Dans Patroni, le basculement automatique est int\u00e9gr\u00e9, alors que dans Repmgr, il s'agit d'une fonctionnalit\u00e9 suppl\u00e9mentaire \u00e0 activer. Il faut lancer le d\u00e9mon Repmgr sur chaque n\u0153ud et alors nous pouvons configurer le basculement automatique. <\/p>\n<p><\/p>\n<p>Repmgr v\u00e9rifie si les n\u0153uds Postgres sont vivants. Les processus Repmgr v\u00e9rifient l'existence les uns des autres, ce qui n'est pas une approche tr\u00e8s efficace car il peut y avoir des situations complexes d'isolement r\u00e9seau o\u00f9 un grand cluster Repmgr peut se diviser en plusieurs petits et continuer de fonctionner. Je ne suis plus \u00e0 jour sur Repmgr, peut-\u00eatre que cela a \u00e9t\u00e9 corrig\u00e9... ou peut-\u00eatre pas. Cependant, extraire les informations sur l'\u00e9tat du cluster dans DCS, comme le fait Stolon, Patroni, est la solution la plus viable. <\/p>\n<p><\/p>\n<p><em>Alexe\u00ef, j'ai une question, peut-\u00eatre na\u00efve. Dans l'un des premiers exemples, vous avez d\u00e9plac\u00e9 DCS d'une machine locale \u00e0 un n\u0153ud distant. Nous comprenons que le r\u00e9seau est une chose avec ses particularit\u00e9s, il vit par lui-m\u00eame. Que se passe-t-il si pour une raison quelconque, le cluster DCS devient inaccessible ? Je ne vais pas \u00e9num\u00e9rer les raisons, il peut y en avoir beaucoup : des erreurs de configuration r\u00e9seau \u00e0 de r\u00e9els probl\u00e8mes.<\/em> <\/p>\n<p><\/p>\n<p>Je ne l'ai pas dit \u00e0 voix haute, mais le cluster DCS doit \u00e9galement \u00eatre tol\u00e9rant aux pannes, c'est-\u00e0-dire un nombre impair de n\u0153uds, afin qu'un quorum puisse se former. Que se passe-t-il si le cluster DCS devient inaccessible, ou ne peut pas rassembler un quorum, c\u2019est-\u00e0-dire en cas de d\u00e9faillance r\u00e9seau ou de panne des n\u0153uds ? Dans ce cas, le cluster Patroni passe en mode lecture seule. Le cluster Patroni ne peut pas d\u00e9terminer l'\u00e9tat du cluster et ce qu'il doit faire. Il ne peut pas communiquer avec DCS et enregistrer un nouvel \u00e9tat du cluster, donc tout le cluster passe en mode lecture seule. Il attend soit une intervention manuelle de l'op\u00e9rateur, soit le r\u00e9tablissement de DCS.<\/p>\n<p><\/p>\n<p><em>Grossi\u00e8rement, DCS devient pour nous un service aussi important que la base elle-m\u00eame ?<\/em><\/p>\n<p><\/p>\n<p>Oui, oui. Dans de nombreuses entreprises modernes, la d\u00e9couverte de services est une partie int\u00e9grante de l'infrastructure. Elle est mise en \u0153uvre m\u00eame avant qu'une base de donn\u00e9es n'existe dans l'infrastructure. Pour le dire autrement, lorsque l'infrastructure est lanc\u00e9e, qu'elle est d\u00e9ploy\u00e9e dans un centre de donn\u00e9es, nous avons imm\u00e9diatement la d\u00e9couverte de services. Si c'est Consul, le DNS peut m\u00eame y \u00eatre construit. Si c'est Etcd, cela peut faire partie d'un cluster Kubernetes, o\u00f9 tout le reste sera d\u00e9ploy\u00e9. Je pense que la d\u00e9couverte de services est d\u00e9j\u00e0 une composante indispensable des infrastructures modernes. Et on y pense bien avant les bases de donn\u00e9es. <\/p>\n<p><\/p>\n<p><em>Merci!<\/em><\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/512768\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c Patroni \u2014 \u044d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 High Availability \u0434\u043b\u044f PostgreSQL. \u041d\u043e Patroni \u2014 \u044d\u0442\u043e \u043b\u0438\u0448\u044c template, \u0430 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 (\u0447\u0442\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0438 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438). \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0432 Patroni \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u043b\u0430\u0431\u0435, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u044d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u043a\u0430\u043a \u043e\u043d \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0448\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0440\u0430\u0437\u0432\u0430\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":90104,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-90103","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=\"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\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij\" \/>\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\udd47Patroni Failure Stories or How to crash your PostgreSQL cluster. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041b\u0435\u0441\u043e\u0432\u0441\u043a\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij\" \/>\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-07-29T11:42:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-29T11:42:32+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\udd47Histoires d'\u00e9chec de Patroni ou comment faire planter votre cluster PostgreSQL. Alexey Lesovsky | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","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\udd47Patroni Failure Stories or How to crash your PostgreSQL cluster. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041b\u0435\u0441\u043e\u0432\u0441\u043a\u0438\u0439 | ProHoster","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","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-07-29T11:42:32+00:00","article:modified_time":"2020-07-29T11:42:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"90103","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:58:48","updated":"2026-02-09 16:50:35","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\/90103","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=90103"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/90103\/revisions"}],"predecessor-version":[{"id":158759,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/90103\/revisions\/158759"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/90104"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=90103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=90103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=90103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}