{"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\/pt\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","title":{"rendered":"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/6404cba13214f499d1f347cca0aacbe7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O principal objetivo do Patroni \u00e9 garantir alta disponibilidade para o PostgreSQL. Mas o Patroni \u00e9 apenas um template, e n\u00e3o uma ferramenta pronta (o que est\u00e1, de fato, explicado na documenta\u00e7\u00e3o). \u00c0 primeira vista, configurando o Patroni em um laborat\u00f3rio de testes, \u00e9 poss\u00edvel ver qu\u00e3o maravilhosa \u00e9 essa ferramenta e como ela lida facilmente com nossas tentativas de derrubar o cluster. No entanto, na pr\u00e1tica, em um ambiente de produ\u00e7\u00e3o, nem sempre tudo ocorre t\u00e3o bonito e elegante quanto no laborat\u00f3rio de testes.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/ff445e6d76a2ad46a232b705e104446f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vou contar um pouco sobre mim. Comecei como administrador de sistemas. Trabalhei em desenvolvimento web. Desde 2014, trabalho na Data Egret. A empresa \u00e9 especializada em consultoria na \u00e1rea de Postgres. N\u00f3s focamos exclusivamente no Postgres e trabalhamos com ele todos os dias, portanto, temos uma variedade de expertises relacionadas \u00e0 sua opera\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>No final de 2018, come\u00e7amos a utilizar o Patroni aos poucos. Assim, acumulamos uma certa experi\u00eancia. Fizemos diagn\u00f3sticos, ajustamos e chegamos \u00e0s nossas melhores pr\u00e1ticas. Neste relat\u00f3rio, contarei sobre elas.<\/p>\n<p><\/p>\n<p>Al\u00e9m do Postgres, eu gosto de Linux. Gosto de mexer no sistema e explor\u00e1-lo, adoro compilar kernels. Gosto de virtualiza\u00e7\u00e3o, containers, Docker e Kubernetes. Isso tudo me interessa, devido aos velhos h\u00e1bitos de administrador. Gosto de lidar com monitoramentos. E tamb\u00e9m aprecio as quest\u00f5es relacionadas \u00e0 administra\u00e7\u00e3o do PostgreSQL, ou seja, replica\u00e7\u00e3o e backup. No meu tempo livre, escrevo em Go. N\u00e3o sou engenheiro de software, apenas escrevo em Go para mim mesmo e isso me traz satisfa\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/02cfd9293af5a8410c91e39afe2c75e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Eu acho que muitos de voc\u00eas sabem que o Postgres n\u00e3o tem HA (Alta Disponibilidade) por padr\u00e3o. Para obter HA, \u00e9 necess\u00e1rio instalar, configur\u00e1-lo e se dedicar a isso. <\/li>\n<li>Existem v\u00e1rias ferramentas e o Patroni \u00e9 uma delas, que resolve o HA de forma bastante eficiente e eficaz. Mas, ao configurar tudo em um laborat\u00f3rio de testes e iniciar, podemos observar que tudo funciona, conseguimos reproduzir alguns problemas e verificar como o Patroni os administra. E veremos que tudo funciona perfeitamente. <\/li>\n<li>Mas, na pr\u00e1tica, encontramos diferentes problemas. E sobre esses problemas, falarei.<\/li>\n<li>Vou explicar como diagnosticamos isso, o que ajustamos \u2013 se isso nos ajudou ou n\u00e3o. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/7126b45b40dd08521e80a3c150382bec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>N\u00e3o vou explicar como instalar o Patroni, porque voc\u00ea pode encontrar isso facilmente na internet, pode verificar arquivos de configura\u00e7\u00e3o para entender como tudo isso funciona, como \u00e9 configurado. Voc\u00ea pode entender os esquemas e arquiteturas, encontrando informa\u00e7\u00f5es sobre isso na internet. <\/li>\n<li>N\u00e3o vou falar sobre a experi\u00eancia de outras pessoas. Vou falar apenas sobre os problemas que n\u00f3s enfrentamos. <\/li>\n<li>E n\u00e3o vou discutir problemas fora do Patroni e do PostgreSQL. Se, por exemplo, forem problemas relacionados ao balanceamento, quando nosso cluster falhou, n\u00e3o vou comentar sobre isso. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/3f8d179e7c78ce83e8842ef5c72fe30d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E um pequeno disclaimer antes de come\u00e7armos nossa apresenta\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>Todos esses problemas com os quais lidamos ocorreram nos primeiros 6-7-8 meses de opera\u00e7\u00e3o. Com o tempo, chegamos \u00e0s nossas melhores pr\u00e1ticas internas. E os problemas desapareceram. Portanto, a apresenta\u00e7\u00e3o foi proposta h\u00e1 cerca de seis meses, quando tudo isso ainda estava fresco em minha mem\u00f3ria. <\/p>\n<p><\/p>\n<p>Durante a prepara\u00e7\u00e3o da apresenta\u00e7\u00e3o, j\u00e1 revisitei antigos postmortems, analisei logs. E algumas partes dos detalhes podem ter sido esquecidas, ou algumas informa\u00e7\u00f5es podem n\u00e3o ter sido completamente investigadas durante a an\u00e1lise dos problemas, ent\u00e3o em alguns momentos pode parecer que os problemas n\u00e3o foram completamente abordados, ou que h\u00e1 alguma falta de informa\u00e7\u00e3o. Por isso, pe\u00e7o desculpas por isso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/30d414284a41fcbc3bf417c9da28ca52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que \u00e9 o Patroni?<\/p>\n<p><\/p>\n<ul>\n<li>\u00c9 um padr\u00e3o para constru\u00e7\u00e3o de HA. Assim est\u00e1 escrito na documenta\u00e7\u00e3o. E, na minha opini\u00e3o, \u00e9 uma esclarecimento muito correto. O Patroni n\u00e3o \u00e9 uma solu\u00e7\u00e3o milagrosa que resolver\u00e1 todos os seus problemas, ou seja, \u00e9 necess\u00e1rio fazer um esfor\u00e7o para que ele comece a funcionar e traga benef\u00edcios. <\/li>\n<li>\u00c9 um servi\u00e7o de agente que \u00e9 instalado em cada servi\u00e7o com banco de dados, e que \u00e9 uma esp\u00e9cie de sistema init para o seu Postgres. Ele inicia, para e reinicia o Postgres, muda a configura\u00e7\u00e3o e altera a topologia do seu cluster. <\/li>\n<li>Portanto, para armazenar o estado do cluster, sua representa\u00e7\u00e3o atual, como ele \u00e9 visualizado, \u00e9 necess\u00e1rio ter algum armazenamento. E, sob esse aspecto, o Patroni optou por armazenar o estado em um sistema externo. \u00c9 um sistema de armazenamento distribu\u00eddo de configura\u00e7\u00e3o. Podem ser Etcd, Consul, ZooKeeper, ou o Etcd do Kubernetes, isto \u00e9, alguma dessas op\u00e7\u00f5es. <\/li>\n<li>Uma das caracter\u00edsticas do Patroni \u00e9 que voc\u00ea obt\u00e9m o auto failover pronto para uso, apenas configurando-o. Se compararmos com o Repmgr, o failover vem como um pacote. Com o Repmgr, recebemos o switchover, mas se quisermos auto failover, precisamos configur\u00e1-lo adicionalmente. O Patroni j\u00e1 possui o auto failover integrado.<\/li>\n<li>E h\u00e1 muitas outras coisas. Por exemplo, a manuten\u00e7\u00e3o de configura\u00e7\u00f5es, a adi\u00e7\u00e3o de novas r\u00e9plicas, backup, etc. Mas isso est\u00e1 al\u00e9m do escopo da apresenta\u00e7\u00e3o, n\u00e3o falarei sobre isso. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/fed0f1ce931df99ca76ae1116f8098cc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um pequeno resumo: a principal tarefa do Patroni \u00e9 realizar o auto failover de forma eficaz e confi\u00e1vel, para que o cluster permane\u00e7a operacional e o aplicativo n\u00e3o perceba mudan\u00e7as na topologia do cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/fac52620957efa47ced330e7cc8084e0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas quando come\u00e7amos a usar o Patroni, nosso sistema se torna um pouco mais complexo. Se antes t\u00ednhamos o Postgres, ao usar o Patroni, obtemos o pr\u00f3prio Patroni, um DCS onde o estado \u00e9 mantido. E tudo isso precisa funcionar de alguma forma. Portanto, o que pode dar errado?<\/p>\n<p><\/p>\n<p>Pode dar errado:<\/p>\n<p><\/p>\n<ul>\n<li>O Postgres pode falhar. Pode ser o mestre ou a r\u00e9plica, algo deles pode falhar. <\/li>\n<li>O pr\u00f3prio Patroni pode falhar. <\/li>\n<li>O DCS, onde o estado \u00e9 mantido, pode falhar.<\/li>\n<li>E a rede pode falhar. <\/li>\n<\/ul>\n<p><\/p>\n<p>Todos esses pontos que abordarei na apresenta\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/1aeaf46d37bf1935b514b0581e0dbd0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Analisarei os casos \u00e0 medida que se tornam mais complexos, n\u00e3o do ponto de vista de que o caso envolve muitos componentes, mas da perspectiva de sentimentos subjetivos, em que esse caso foi complexo para mim e dif\u00edcil de analisar\u2026 e, inversamente, algum caso foi f\u00e1cil e f\u00e1cil de analisar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/65b0c98bf2284610e955ced5eb998f39.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E o primeiro caso \u00e9 o mais simples. \u00c9 o caso em que pegamos um cluster de bancos de dados e nesse mesmo cluster montamos nosso armazenamento DCS. Este \u00e9 o erro mais comum. \u00c9 um erro na constru\u00e7\u00e3o da arquitetura, ou seja, combinar diferentes componentes em um s\u00f3 lugar. <\/p>\n<p><\/p>\n<p>Ent\u00e3o, ocorreu um failover, vamos investigar o que aconteceu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/244b69d623fe2205c2d9ed2aa4620067.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E aqui nos interessa quando ocorreu o failover. Ou seja, nos interessa o momento exato em que houve uma mudan\u00e7a no estado do cluster. <\/p>\n<p><\/p>\n<p>Mas o failover nem sempre \u00e9 instant\u00e2neo, ou seja, n\u00e3o ocupa um \u00fanico instante de tempo, ele pode se prolongar. Pode durar um per\u00edodo.<\/p>\n<p><\/p>\n<p>Portanto, ele tem um hor\u00e1rio de in\u00edcio e um hor\u00e1rio de t\u00e9rmino, ou seja, \u00e9 um evento prolongado. E dividimos todos os eventos em tr\u00eas intervalos: temos o tempo antes da falha, durante a falha e ap\u00f3s a falha. Ou seja, consideramos todos os eventos nesta linha do tempo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a0ed61afe55d1a157147e0d80b17e5d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E a primeira coisa que fazemos quando ocorre a falha \u00e9 procurar a causa, o que aconteceu, o que levou \u00e0 falha. <\/p>\n<p><\/p>\n<p>Se olharmos para os logs, veremos os logs cl\u00e1ssicos do Patroni. Nele, ele nos informa que o servidor se tornou mestre, e o papel de mestre foi transferido para este n\u00f3. Aqui est\u00e1 destacado. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/9998c69f7d0d4358b277f4e0e7b4350f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Em seguida, precisamos entender por que ocorreu a falha, ou seja, quais eventos ocorreram que causaram a migra\u00e7\u00e3o do papel de mestre de um n\u00f3 para outro. E neste caso, aqui tudo \u00e9 simples. Temos um erro de intera\u00e7\u00e3o com o sistema de armazenamento. O mestre percebeu que n\u00e3o poderia trabalhar com DCS, ou seja, surgiu algum problema de intera\u00e7\u00e3o. E ele diz que n\u00e3o pode mais ser mestre e renuncia a suas fun\u00e7\u00f5es. Esta linha 'demoted self' fala exatamente sobre isso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/4a8eca27689546b4b0fc3c666a3c37c4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se olharmos para os eventos que precederam a falha, podemos ver as mesmas causas que se tornaram um problema para a continuidade do funcionamento do mestre. <\/p>\n<p><\/p>\n<p>Se olharmos para os logs do Patroni, veremos que temos uma s\u00e9rie de erros, timeouts, ou seja, o agente Patroni n\u00e3o consegue se comunicar com o DCS. Neste caso, \u00e9 o agente Consul, com o qual a comunica\u00e7\u00e3o ocorre pela porta 8500. <\/p>\n<p><\/p>\n<p>E o problema aqui \u00e9 que o Patroni e o banco de dados est\u00e3o rodando no mesmo host. E nesse mesmo n\u00f3, os servidores Consul foram iniciados. Ao criar carga no servidor, criamos problemas tamb\u00e9m para <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pt\/server\/\"   title=\"servidores\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1515\">servidores<\/a> o Consul. Eles n\u00e3o conseguiram se comunicar corretamente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/0d8dba6641809560e6b32825d481e30b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Depois de um tempo, quando a carga diminuiu, nosso Patroni conseguiu se comunicar novamente com os agentes. O funcionamento normal foi retomado. E o mesmo servidor Pgdb-2 se tornou mestre novamente. Ou seja, houve uma pequena mudan\u00e7a, pela qual o n\u00f3 renunciou a seu papel de mestre e depois o reassumiu, ou seja, tudo voltou ao que era. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/131b93e0bd83099e1b99b53742419e13.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E isso pode ser visto como um falso alarme, ou pode ser que o Patroni tenha agido corretamente. Ou seja, ele percebeu que n\u00e3o podia manter a condi\u00e7\u00e3o do cluster e renunciou a suas fun\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p>E aqui o problema surgiu porque os servidores Consul est\u00e3o no mesmo hardware que os bancos de dados. Portanto, qualquer carga: seja na carga dos discos ou dos processadores, ela tamb\u00e9m afeta a intera\u00e7\u00e3o com o cluster Consul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/142c7cf839c8da078451f7ba9d5499e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E decidimos que isso n\u00e3o deveria coexistir, por isso criamos um cluster separado para o Consul. E o Patroni j\u00e1 estava funcionado com um Consul separado, ou seja, havia um cluster Postgres separado e um cluster Consul separado. Este \u00e9 um guia b\u00e1sico de como organizar e manter todas essas coisas separadas para que n\u00e3o coexistam. <\/p>\n<p><\/p>\n<p>Como alternativa, podemos ajustar os par\u00e2metros ttl, loop_wait, retry_timeout, ou seja, tentar sobreviver a esses picos de carga tempor\u00e1rios aumentando esses par\u00e2metros. Mas esta n\u00e3o \u00e9 a op\u00e7\u00e3o mais adequada, porque essa carga pode durar um longo per\u00edodo. E simplesmente podemos ultrapassar esses limites. E isso pode n\u00e3o ajudar muito. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/c51f35dcd88b1c792acec231c0c6c66c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O primeiro problema, como voc\u00ea entendeu, \u00e9 simples. Juntamos o DCS com o banco de dados e tivemos um problema. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/cc2a98d9790441577fb4080406cbc53f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O segundo problema \u00e9 semelhante ao primeiro. \u00c9 parecido porque novamente temos problemas de intera\u00e7\u00e3o com o sistema DCS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/e5c01b105adca48cc620085db8dd2d2b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se olharmos os logs, veremos que novamente temos um erro de comunica\u00e7\u00e3o. E o Patroni diz que n\u00e3o consegue interagir com o DCS, portanto, o mestre atual entra em modo de r\u00e9plica.<\/p>\n<p><\/p>\n<p>O antigo mestre se torna r\u00e9plica, aqui o Patroni atua como deveria. Ele inicia o pg_rewind para reverter o log de transa\u00e7\u00f5es e depois se conectar ao novo mestre, buscando alcan\u00e7ar o novo mestre. Aqui o Patroni atua como deveria. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/29255f4790abb15b64dbf9ee0b41c7fc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui precisamos encontrar o ponto que precedeu o file watcher, ou seja, os erros que levaram ao file watcher ocorrer. Nesse sentido, trabalhar com os logs no Patroni \u00e9 bastante conveniente. Ele escreve as mesmas mensagens em intervalos determinados. E se come\u00e7armos a rolar rapidamente pelos logs, veremos que as mensagens mudaram, o que indica que come\u00e7aram alguns problemas. Voltamos rapidamente para esse ponto e verificamos o que est\u00e1 acontecendo. <\/p>\n<p><\/p>\n<p>Em uma situa\u00e7\u00e3o normal, os logs se parecem mais ou menos assim. O propriet\u00e1rio do bloqueio \u00e9 verificado. E se o propriet\u00e1rio, por exemplo, mudou, podem ocorrer certos eventos aos quais o Patroni deve reagir. Mas neste caso, est\u00e1 tudo bem. Estamos procurando o ponto em que os erros come\u00e7aram. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f48ebd22a405f5b2900621451c68f543.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ao rolar at\u00e9 o ponto em que os erros come\u00e7aram a surgir, vemos que ocorreu um failover autom\u00e1tico. E uma vez que os erros estavam relacionados \u00e0 intera\u00e7\u00e3o com o DCS e, no nosso caso, utilizamos o Consul, tamb\u00e9m analisamos os logs do Consul para entender o que estava acontecendo l\u00e1. <\/p>\n<p><\/p>\n<p>Aproximando o tempo do failover e o tempo nos logs do Consul, percebemos que nossos vizinhos no cluster do Consul come\u00e7aram a duvidar da exist\u00eancia de outros participantes do cluster do Consul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/63b02ac5b4f5a34a2822f1eee2b1f2f8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se olharmos tamb\u00e9m os logs de outros agentes do Consul, podemos ver que est\u00e1 ocorrendo algum colapso de rede. Todos os participantes do cluster do Consul duvidam da exist\u00eancia uns dos outros. E isso serviu como um impulso para o failover. <\/p>\n<p><\/p>\n<p>Se observarmos o que aconteceu antes desses erros, podemos ver que h\u00e1 v\u00e1rios erros, como deadline, RPC failed, ou seja, claramente h\u00e1 algum problema na intera\u00e7\u00e3o entre os participantes do cluster do Consul. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/b15c912f2afb49d9d85e7bb9361ce449.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A resposta mais simples \u00e9 consertar a rede. Mas para mim, em uma posi\u00e7\u00e3o de destaque, \u00e9 f\u00e1cil afirmar isso. No entanto, as circunst\u00e2ncias s\u00e3o tais que nem sempre o cliente pode se dar ao luxo de consertar a rede. Ele pode estar em um DC e pode n\u00e3o ter a capacidade de consertar a rede ou influenciar o equipamento. Portanto, precisamos de outras op\u00e7\u00f5es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/1dbdb66233acc3bc321a30a1c5fe14f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Existem op\u00e7\u00f5es:<\/p>\n<p><\/p>\n<ul>\n<li>A op\u00e7\u00e3o mais simples, que acredito estar at\u00e9 mesmo na documenta\u00e7\u00e3o, \u00e9 desativar as verifica\u00e7\u00f5es do Consul, ou seja, simplesmente passar um array vazio. E dizemos ao agente do Consul para n\u00e3o usar nenhuma verifica\u00e7\u00e3o. Com essas verifica\u00e7\u00f5es, podemos ignorar essas tempestades de rede e n\u00e3o iniciar o failover. <\/li>\n<li>Outra op\u00e7\u00e3o \u00e9 revisar o raft_multiplier. Este \u00e9 um par\u00e2metro do pr\u00f3prio servidor Consul. Por padr\u00e3o, ele est\u00e1 definido como 5. Este valor \u00e9 recomendado pela documenta\u00e7\u00e3o para ambientes de staging. Na pr\u00e1tica, isso influencia a frequ\u00eancia de troca de mensagens entre os participantes da rede do Consul. Basicamente, esse par\u00e2metro afeta a velocidade da comunica\u00e7\u00e3o entre os participantes do cluster do Consul. E para produ\u00e7\u00e3o, j\u00e1 \u00e9 recomendado reduzi-lo para que os n\u00f3s troquem mensagens com mais frequ\u00eancia. <\/li>\n<li>Outra op\u00e7\u00e3o que come\u00e7amos a usar \u00e9 aumentar a prioridade dos processos do Consul em rela\u00e7\u00e3o a outros processos para o escalonador de processos do sistema operacional. Existe um par\u00e2metro chamado \"nice\", que define a prioridade dos processos que \u00e9 considerada pelo escalonador do SO. N\u00f3s ajustamos o valor do nice dos agentes Consul, ou seja, aumentamos a prioridade, para que o sistema operacional desse mais tempo de execu\u00e7\u00e3o e de execu\u00e7\u00e3o de c\u00f3digo para os processos do Consul. No nosso caso, isso resolveu nosso problema. <\/li>\n<li>Outra op\u00e7\u00e3o \u00e9 n\u00e3o usar o Consul. Tenho um amigo que \u00e9 um grande defensor do Etcd. E n\u00f3s frequentemente debatemos sobre o que \u00e9 melhor, Etcd ou Consul. Por\u00e9m, em termos do que \u00e9 melhor, geralmente chegamos \u00e0 conclus\u00e3o de que o Consul possui um agente que deve ser executado em cada n\u00f3 com banco de dados. Ou seja, a intera\u00e7\u00e3o do Patroni com o cluster do Consul se d\u00e1 atrav\u00e9s desse agente. E esse agente se torna um ponto de estrangulamento. Se algo acontecer com o agente, o Patroni n\u00e3o consegue mais trabalhar com o cluster do Consul. E isso \u00e9 um problema. No caso do Etcd, n\u00e3o h\u00e1 agente. O Patroni pode trabalhar diretamente com a lista de servidores Etcd e j\u00e1 se comunicar com eles. Nesse sentido, se voc\u00ea usar o Etcd na sua empresa, provavelmente o Etcd ser\u00e1 a melhor escolha do que o Consul. Mas estamos sempre limitados pelo que o cliente escolheu e est\u00e1 usando. E na maior parte, o Consul est\u00e1 presente com todos os clientes. <\/li>\n<li>E o \u00faltimo ponto \u00e9 revisar os valores dos par\u00e2metros. Podemos aumentar esses par\u00e2metros na esperan\u00e7a de que nossos problemas de rede tempor\u00e1rios sejam curtos e n\u00e3o excedam o intervalo desses par\u00e2metros. Dessa forma, podemos diminuir a agressividade do Patroni na execu\u00e7\u00e3o da auto-falha, se surgirem problemas de rede.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f0043050da20f6368dabf66ec9a4eade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acredito que muitos que usam o Patroni est\u00e3o familiarizados com este comando. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/9f78f59dab166e47ac78436802156d04.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este comando mostra o estado atual do cluster. E \u00e0 primeira vista, essa imagem pode parecer normal. Temos um mestre, temos uma r\u00e9plica, e n\u00e3o h\u00e1 atraso na replica\u00e7\u00e3o. Mas essa situa\u00e7\u00e3o \u00e9 normal apenas at\u00e9 sabemos que neste cluster deveriam haver tr\u00eas n\u00f3s, e n\u00e3o dois. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a39c891f8620ba210b6bce0727e0fa8b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Consequentemente, ocorreu um auto-failover. E depois desse auto-failover, nossa r\u00e9plica desapareceu. Precisamos descobrir por que ela desapareceu e restaur\u00e1-la. E vamos revisar os logs novamente para ver por que aconteceu o auto-failover.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/e6e67d46cb20c8d7e58c7505157f68e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Neste caso, a segunda r\u00e9plica tornou-se o mestre. Aqui tudo est\u00e1 certo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/b86ccea68b0c6013a23bbd2804e48320.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Precisamos observar a r\u00e9plica que falhou e que n\u00e3o est\u00e1 no cluster. Abrimos os logs do Patroni e verificamos que houve um problema durante o processo de conex\u00e3o ao cluster na fase pg_rewind. Para se conectar ao cluster, \u00e9 necess\u00e1rio retroceder o log de transa\u00e7\u00f5es, solicitar o log de transa\u00e7\u00f5es necess\u00e1rio do mestre e alcan\u00e7ar o mestre por meio dele. <\/p>\n<p><\/p>\n<p>Neste caso, n\u00e3o temos o log de transa\u00e7\u00f5es e a r\u00e9plica n\u00e3o pode inicializar. Consequentemente, estamos parando o Postgres com erro. E por isso, ela n\u00e3o est\u00e1 no cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/dadbd44b766674b719d85781ef7f0caa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9 necess\u00e1rio entender por que ela n\u00e3o est\u00e1 no cluster e por que n\u00e3o houve logs. Vamos ao novo mestre e verificamos o que ele tem nos logs. Acontece que, quando foi feito o pg_rewind, ocorreu um checkpoint. E parte dos antigos logs de transa\u00e7\u00f5es simplesmente foi renomeada. Quando o antigo mestre tentou se conectar ao novo mestre e solicitar esses logs, eles j\u00e1 estavam renomeados e simplesmente n\u00e3o existiam.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f2d5c37324f9436b2bdad1290612d86f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comparei os timestamps quando esses eventos ocorreram. E a diferen\u00e7a \u00e9 de apenas 150 milissegundos, ou seja, o checkpoint foi conclu\u00eddo em 369 milissegundos, e os segmentos WAL foram renomeados. E apenas 517 milissegundos depois, rapidamente em 150 milissegundos, o rewind foi iniciado na antiga r\u00e9plica. Ou seja, apenas 150 milissegundos foram suficientes para que a r\u00e9plica n\u00e3o conseguisse se conectar e funcionar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/99dd80deb8466bfc3aff568456e07102.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quais s\u00e3o as op\u00e7\u00f5es?<\/p>\n<p><\/p>\n<p>No in\u00edcio, utilizamos slots de replica\u00e7\u00e3o. Ach\u00e1vamos que isso era uma boa ideia. Embora, na primeira fase da opera\u00e7\u00e3o, tenhamos desligado os slots. Pens\u00e1vamos que, se os slots acumulassem muitos segmentos WAL, poder\u00edamos derrubar o mestre. Ele cairia. Sofremos um tempo sem os slots. E percebemos que precisamos deles, ent\u00e3o reativamos os slots. <\/p>\n<p><\/p>\n<p>Mas aqui h\u00e1 um problema: quando o mestre se torna uma r\u00e9plica, ele apaga os slots e, junto com os slots, exclui os segmentos WAL. Para evitar que esse problema ocorra, decidimos aumentar o par\u00e2metro wal_keep_segments. Por padr\u00e3o s\u00e3o 8 segmentos. Aumentamos para 1.000 e verificamos quanto espa\u00e7o livre temos. E n\u00f3s liberamos 16 gigabytes para o wal_keep_segments. Ou seja, ao alternar, sempre temos um reserva de 16 gigabytes de logs de transa\u00e7\u00f5es em todos os n\u00f3s.<\/p>\n<p><\/p>\n<p>E al\u00e9m disso \u2013 isso tamb\u00e9m \u00e9 relevante para tarefas de manuten\u00e7\u00e3o prolongadas. Suponha que precisamos atualizar uma das r\u00e9plicas. E queremos deslig\u00e1-la. Precisamos atualizar o software, talvez o sistema operacional, algo mais. E quando desligamos a r\u00e9plica, o slot tamb\u00e9m \u00e9 exclu\u00eddo. E se usarmos um wal_keep_segments pequeno, durante a aus\u00eancia prolongada da r\u00e9plica, os logs de transa\u00e7\u00f5es ser\u00e3o perdidos. Reiniciaremos a r\u00e9plica, ela solicitar\u00e1 os logs de transa\u00e7\u00f5es de onde parou, mas pode n\u00e3o haver esses logs no mestre. E a r\u00e9plica tamb\u00e9m n\u00e3o conseguir\u00e1 se conectar. Portanto, mantemos uma grande reserva de logs.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/dad55c828128ce92f649a99cc53ce54b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/63e70f0b098567f3a6d4fd66a0c293bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Temos um banco de dados em produ\u00e7\u00e3o. J\u00e1 existem projetos em funcionamento l\u00e1. <\/p>\n<p><\/p>\n<p>Houve uma falha de sistema de arquivos. Entramos e verificamos - tudo em ordem, as r\u00e9plicas est\u00e3o no lugar, n\u00e3o h\u00e1 atraso na replica\u00e7\u00e3o. Tamb\u00e9m n\u00e3o h\u00e1 erros nos logs, tudo em ordem. <\/p>\n<p><\/p>\n<p>A equipe de produtos comenta que deveria haver alguns dados, mas os vemos em uma fonte, enquanto na base n\u00e3o os encontramos. Precisamos entender o que aconteceu com eles. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/568ca9aa31680d5e0c9d4ed9693b14e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9 evidente que o pg_rewind os apagou. Descobrimos isso imediatamente, mas fomos verificar o que aconteceu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a8fee389201d96e81761cd276c5265c3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nos logs, sempre podemos encontrar quando ocorreu a falha no sistema de arquivos, quem se tornou o mestre e podemos determinar quem era o antigo mestre e quando ele quis se tornar uma r\u00e9plica, ou seja, precisamos desses logs para identificar a quantidade de logs de transa\u00e7\u00f5es que foram perdidos.<\/p>\n<p><\/p>\n<p>Nosso antigo mestre reiniciou. E no autoload, o Patroni estava configurado. O Patroni foi iniciado. Em seguida, ele iniciou o Postgres. Mais precisamente, antes de iniciar o Postgres e antes de torn\u00e1-lo uma r\u00e9plica, o Patroni iniciou o processo pg_rewind. Consequentemente, ele apagou parte dos logs de transa\u00e7\u00f5es, baixou novos e se conectou. Aqui o Patroni funcionou perfeitamente, ou seja, como deveria. O cluster foi restaurado. T\u00ednhamos 3 n\u00f3s, ap\u00f3s a falha, ainda t\u00ednhamos 3 n\u00f3s \u2013 tudo \u00f3timo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/b747a24f53e20ed098c2dc0afc79bead.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perdemos uma parte dos dados. E precisamos entender quanto perdemos. Estamos procurando exatamente o momento em que ocorreu o rewind. Podemos encontrar isso por meio de registros no log. O rewind foi iniciado, algo foi feito e finalizado.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/5b7bacffb52e3ccd529a3a734c441295.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Precisamos encontrar a posi\u00e7\u00e3o no log de transa\u00e7\u00f5es onde o antigo mestre parou. Neste caso, \u00e9 esse ponto aqui. E precisamos de um segundo ponto, ou seja, a dist\u00e2ncia em que o antigo mestre difere do novo. <\/p>\n<p><\/p>\n<p>Estamos pegando a diferen\u00e7a comum do pg_wal_lsn_diff e comparando esses dois pontos. E, neste caso, obtemos 17 megabytes. Se isso \u00e9 muito ou pouco, cada um decide por si s\u00f3. Porque para alguns 17 megabytes \u00e9 pouco, para outros \u00e9 muito e inaceit\u00e1vel. Aqui, cada um define individualmente de acordo com as necessidades do neg\u00f3cio. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/55335fce85961e159459c38300a0ad12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mas o que descobrimos para n\u00f3s mesmos? <\/p>\n<p><\/p>\n<p>Em primeiro lugar, precisamos decidir se sempre precisamos que o Patroni seja iniciado automaticamente ap\u00f3s a reinicializa\u00e7\u00e3o do sistema. Muitas vezes, precisamos acessar o antigo mestre para ver qu\u00e3o longe ele foi. Talvez inspecionar os segmentos do log de transa\u00e7\u00f5es, ver o que tem l\u00e1. E entender se podemos perder esses dados ou se precisamos iniciar o antigo mestre em modo standalone para recuperar essas informa\u00e7\u00f5es. <\/p>\n<p><\/p>\n<p>E apenas depois disso devemos tomar decis\u00f5es sobre se podemos descartar esses dados ou se podemos restaur\u00e1-los, conectando este n\u00f3 como uma r\u00e9plica em nosso cluster.<\/p>\n<p><\/p>\n<p>Al\u00e9m disso, h\u00e1 o par\u00e2metro \"maximum_lag_on_failover\". Por padr\u00e3o, se n\u00e3o me engano, esse par\u00e2metro tem um valor de 1 megabyte. <\/p>\n<p><\/p>\n<p>Como ele funciona? Se nossa r\u00e9plica est\u00e1 com uma defasagem de 1 megabyte de dados no lag de replica\u00e7\u00e3o, essa r\u00e9plica n\u00e3o participa das elei\u00e7\u00f5es. E se, por acaso, ocorre um failover, o Patroni verifica quais r\u00e9plicas est\u00e3o atrasadas. Se elas est\u00e3o atrasadas por uma grande quantidade de logs de transa\u00e7\u00f5es, n\u00e3o podem se tornar mestres. Isso \u00e9 uma fun\u00e7\u00e3o de prote\u00e7\u00e3o muito boa, que evita a perda de muitos dados. <\/p>\n<p><\/p>\n<p>Mas h\u00e1 um problema no fato de que o lag de replica\u00e7\u00e3o no cluster Patroni e DCS \u00e9 atualizado em um intervalo espec\u00edfico. Se n\u00e3o estou enganado, 30 segundos \u00e9 o valor padr\u00e3o do ttl.<\/p>\n<p><\/p>\n<p>Assim, pode ocorrer uma situa\u00e7\u00e3o em que o atraso de replica\u00e7\u00e3o para as r\u00e9plicas em DCS seja um, mas na realidade pode haver um atraso completamente diferente ou pode n\u00e3o haver atraso algum, ou seja, isso n\u00e3o \u00e9 em tempo real. E n\u00e3o reflete sempre a realidade. Portanto, n\u00e3o vale a pena construir uma l\u00f3gica complicada sobre isso. <\/p>\n<p><\/p>\n<p>E o risco de perda sempre permanece. No pior caso, uma f\u00f3rmula, e no caso m\u00e9dio, outra f\u00f3rmula. Isso \u00e9, ao planejar a implementa\u00e7\u00e3o do Patroni e avaliar quanto dados podemos perder, devemos nos basear nessas f\u00f3rmulas e ter uma ideia de quanta informa\u00e7\u00e3o podemos perder. <\/p>\n<p><\/p>\n<p>E h\u00e1 uma boa not\u00edcia. Quando o antigo mestre avan\u00e7ou, ele pode ter avan\u00e7ado devido a alguns processos em segundo plano. Ou seja, havia um autovacuum que registrou os dados e os salvou no log de transa\u00e7\u00f5es. E esses dados podemos facilmente ignorar e perder. N\u00e3o h\u00e1 problema nisso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a86e8971ab4ef41b89af9cf0bdf519ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E assim \u00e9 como aparecem os logs se o maximum_lag_on_failover estiver definido e ocorrer um failover, e \u00e9 necess\u00e1rio escolher um novo mestre. A r\u00e9plica se avalia como incapaz de participar das elei\u00e7\u00f5es. E ela recusa a participa\u00e7\u00e3o na corrida pela lideran\u00e7a. E ela espera at\u00e9 que um novo mestre seja escolhido para se conectar a ele posteriormente. Essa \u00e9 uma medida adicional contra a perda de dados.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f760788e5951facdd08b2069037830fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/c32f26e7526e1873f3bfd7d3693fcc72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui nossa equipe de produto informou que seu produto est\u00e1 enfrentando problemas ao trabalhar com Postgres. Entretanto, n\u00e3o \u00e9 poss\u00edvel acessar o pr\u00f3prio mestre, pois ele n\u00e3o est\u00e1 dispon\u00edvel via SSH. Al\u00e9m disso, o auto-failover tamb\u00e9m n\u00e3o est\u00e1 acontecendo. <\/p>\n<p><\/p>\n<p>Este host foi for\u00e7ado a reiniciar. Devido \u00e0 reinicializa\u00e7\u00e3o, ocorreu um auto-failover, embora pudesse ter sido realizado um failover manual, como entendo agora. E ap\u00f3s a reinicializa\u00e7\u00e3o, j\u00e1 vamos verificar o que aconteceu com o mestre atual. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/95efb82e0647a396a21683cd53a69547.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nesse intervalo, j\u00e1 sab\u00edamos que t\u00ednhamos problemas com os discos, ou seja, j\u00e1 est\u00e1vamos cientes, por meio de monitoramento, de onde procurar e o que buscar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/367aaab607d833d96a573ddbbbced502.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Entramos no log do postgres e come\u00e7amos a ver o que acontecia. Observamos commits que duram de um a tr\u00eas segundos, o que n\u00e3o \u00e9 normal. Vimos que o autovacuum estava demorando muito e de maneira estranha para ser acionado. E notamos arquivos tempor\u00e1rios no disco. Ou seja, todos esses s\u00e3o indicadores de problemas com os discos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/7e0cfce7a81901ef9ef736c3fefc8dce.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Demos os logs do sistema dmesg (no log de mensagens do kernel). E vimos que temos problemas com um dos discos. O subsistema de disco era um software RAID. N\u00f3s olhamos o \/proc\/mdstat e percebemos que um dos discos estava faltando. Ou seja, temos um RAID de 8 discos e estamos sem um. Se olharmos atentamente para o slide, podemos ver que o sde est\u00e1 ausente. Em termos simples, um disco falhou. Isso desencadeou problemas de disco, e os aplicativos tamb\u00e9m enfrentaram dificuldades ao trabalhar com o cluster Postgres.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/4b09b3aa761cb504fa79173ef280faac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E nesse caso, o Patroni n\u00e3o nos ajudaria, porque o Patroni n\u00e3o tem a fun\u00e7\u00e3o de monitorar o estado do servidor, nem o estado do disco. Precisamos monitorar essas situa\u00e7\u00f5es externamente. Adicionamos o monitoramento de discos ao monitoramento externo rapidamente. <\/p>\n<p><\/p>\n<p>E houve essa ideia - ser\u00e1 que o fencing ou um watchdog de software poderia nos ajudar? Pensamos que provavelmente n\u00e3o nos ajudaria nesse caso, porque durante os problemas, o Patroni continuava a interagir com o cluster DCS e n\u00e3o detectava nenhuma falha. Ou seja, do ponto de vista do DCS e do Patroni, tudo estava bem no cluster, embora houvesse problemas de disco e de disponibilidade do banco de dados. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/15fdac78535355d4eb889efcc27efc46.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na minha opini\u00e3o, esse \u00e9 um dos problemas mais estranhos que pesquisei, passei muito tempo lendo logs, revirando tudo e o chamei de simulador de cluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/b5259774931c290eda6673deb14b6c48.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O problema era que o antigo mestre n\u00e3o conseguia se tornar uma r\u00e9plica normal, ou seja, o Patroni o iniciava, e o Patroni mostrava que esse n\u00f3 estava presente como r\u00e9plica, mas na verdade n\u00e3o era uma r\u00e9plica normal. Agora voc\u00ea ver\u00e1 por qu\u00ea. Isso ficou registrado na an\u00e1lise daquele problema. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/c35a5d102a46764bbf96e5a75ee88171.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E como tudo come\u00e7ou? Come\u00e7ou, assim como no problema anterior, com travamentos nos discos. Tivemos commits a cada segundo, ou dois. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/435c1b350a89f288e0e10ca9d5a2ec6e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Houve interrup\u00e7\u00f5es nas conex\u00f5es, ou seja, os clientes estavam sendo desconectados. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/920cb1f3f3b40578e15e6ff711e85c50.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Houve bloqueios de diferentes gravidades. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/285d6292d89b928a85e95602ee57d38a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, consequentemente, o subsistema de disco n\u00e3o era muito responsivo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/ebe71d49360e7f604ecd6a3c8276cb73.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E o mais enigm\u00e1tico para mim foi o pedido de desligamento imediato que chegou. O Postgres tem tr\u00eas modos de desligamento:<\/p>\n<p><\/p>\n<ul>\n<li>O modo gracioso, quando esperamos que todos os clientes se desconectem sozinhos. <\/li>\n<li>H\u00e1 o modo r\u00e1pido, quando for\u00e7amos os clientes a se desconectarem, porque estamos indo para o desligamento. <\/li>\n<li>E immediate. Neste caso, o immediate nem mesmo avisa os clientes que precisa ser desligado, ele simplesmente se desliga sem aviso. E para todos os clientes, o sistema operacional j\u00e1 envia uma mensagem RST (mensagem TCP informando que a conex\u00e3o foi interrompida e que n\u00e3o h\u00e1 mais nada para o cliente fazer). <\/li>\n<\/ul>\n<p><\/p>\n<p>Quem enviou esse sinal? Processos em segundo plano do Postgres n\u00e3o enviam esse tipo de sinal um ao outro, ou seja, isso \u00e9 um kill-9. Eles n\u00e3o enviam isso um para o outro, eles apenas reagem a isso, ou seja, \u00e9 um rein\u00edcio de emerg\u00eancia do Postgres. Quem o enviou, eu n\u00e3o sei. <\/p>\n<p><\/p>\n<p>Eu olhei pelo comando 'last' e vi uma pessoa que tamb\u00e9m fez login neste servidor junto conosco, mas me acovardei de fazer a pergunta. Talvez tenha sido um kill -9. Eu teria visto isso nos logs, pois o Postgres registra que recebeu um kill -9, mas n\u00e3o vi isso nos logs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/fe8e844649cea3384ebfde86e36eba44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aprofundando-me mais, vi que o Patroni n\u00e3o escreveu no log por um bom tempo \u2013 54 segundos. E se compararmos dois timestamps, durante cerca de 54 segundos n\u00e3o houve mensagens. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/ffb1c4db3d7de591d77d56ed2fcc4f2a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E nesse tempo ocorreu um failover autom\u00e1tico. O Patroni funcionou novamente perfeitamente. Nosso antigo mestre estava indispon\u00edvel, algo estava acontecendo com ele. E come\u00e7aram as elei\u00e7\u00f5es para um novo mestre. Aqui tudo funcionou bem. O nosso pgsql01 se tornou o novo l\u00edder. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/6b2457653e9f77af44cd64b4aff021a0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Temos uma r\u00e9plica que se tornou mestre. E h\u00e1 uma segunda r\u00e9plica. E com a segunda r\u00e9plica houve problemas. Ela estava tentando se reconfigurar. Pelo que entendi, ela tentava mudar o recovery.conf, reiniciar o Postgres e se conectar ao novo mestre. A cada 10 segundos, ela envia mensagens de que est\u00e1 tentando, mas n\u00e3o consegue. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/381818f189e19c3e1154074b4652f837.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E durante essas tentativas, um sinal de immediate-shutdown chegou ao antigo mestre. O mestre reiniciou. E tamb\u00e9m a recupera\u00e7\u00e3o foi interrompida, porque o antigo mestre estava reiniciando. Ou seja, a r\u00e9plica n\u00e3o pode se conectar a ele, pois ele est\u00e1 em modo desligado. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/d8a8cde925fa8fe601d44ab908ae69dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Em algum momento ela funcionou, mas a replica\u00e7\u00e3o n\u00e3o foi iniciada. <\/p>\n<p><\/p>\n<p>Eu tenho apenas uma hip\u00f3tese de que no recovery.conf havia o endere\u00e7o do antigo mestre. E quando o novo mestre apareceu, a segunda r\u00e9plica ainda estava tentando se conectar ao antigo mestre. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/425ea3af1f1e186f4760e1fb1f5419fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando o Patroni foi iniciado na segunda r\u00e9plica, o n\u00f3 foi iniciado, mas n\u00e3o conseguiu se conectar pela replica\u00e7\u00e3o. E houve um atraso na replica\u00e7\u00e3o, que parecia mais ou menos assim. Ou seja, todos os tr\u00eas n\u00f3s estavam no lugar, mas o segundo n\u00f3 estava atrasado. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f564eacd9944666c9a3f5bea634ede6b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Entretanto, ao olhar os logs que foram gerados, pude ver que a replica\u00e7\u00e3o n\u00e3o conseguia iniciar porque os logs de transa\u00e7\u00f5es estavam diferentes. E os logs de transa\u00e7\u00f5es que o master oferece, que est\u00e3o especificados no recovery.conf, simplesmente n\u00e3o se adequavam ao nosso n\u00f3 atual. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/6b09947d157c9ef0a190da2df2cb5892.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E aqui eu cometi um erro. Eu deveria ter ido verificar o que estava no recovery.conf para checar a minha hip\u00f3tese de que est\u00e1vamos nos conectando ao mestre errado. Mas eu estava apenas come\u00e7ando a entender isso e isso n\u00e3o me ocorreu, ou eu vi que a replica\u00e7\u00e3o estava atrasada e que ter\u00edamos que reinicializ\u00e1-la, ou seja, eu acabei fazendo isso de qualquer jeito. Esse foi meu erro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/159f2256fd81428fd0d82a255528887d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Depois de 30 minutos, o administrador chegou, ou seja, eu reiniciei o Patroni na r\u00e9plica. Eu j\u00e1 tinha dado como perdida, achava que ter\u00edamos que reinicializ\u00e1-la. E pensei \u2013 vou reiniciar o Patroni, talvez resulte em algo bom. A recupera\u00e7\u00e3o iniciou. E o banco de dados at\u00e9 abriu, estava pronto para aceitar conex\u00f5es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/aeac98750386c8389d39e006a229cc85.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A replica\u00e7\u00e3o foi iniciada. Mas ap\u00f3s um minuto, ela apresentou erro, dizendo que os logs de transa\u00e7\u00f5es n\u00e3o eram compat\u00edveis. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/17eaba000a79c80c29d1bc3902de05e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pensei que reiniciaria mais uma vez. Reiniciei o Patroni novamente, sendo que n\u00e3o reiniciei o Postgres, apenas reiniciei o Patroni na esperan\u00e7a de que ele magicamente fizesse o banco de dados iniciar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a85b38e033c45ad73da317f41e0ef24a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A replica\u00e7\u00e3o come\u00e7ou novamente, mas os marcadores nos logs de transa\u00e7\u00f5es estavam diferentes, n\u00e3o eram os mesmos da tentativa anterior de inicializa\u00e7\u00e3o. A replica\u00e7\u00e3o parou novamente. E a mensagem j\u00e1 era um pouco diferente. E ela n\u00e3o era muito informativa para mim. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/fd90d708230bd54af685786c7e361ee1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ent\u00e3o me ocorreu \u2013 e se eu reiniciar o Postgres, ao mesmo tempo em que fa\u00e7o um checkpoint no mestre, para mover o ponto no log de transa\u00e7\u00f5es um pouco mais adiante, para que a recupera\u00e7\u00e3o inicie de um momento diferente? Al\u00e9m disso, t\u00ednhamos reservas de WAL. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/19e67f95d1a74141a013947c9aa39e38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Reiniciei o Patroni, fiz alguns checkpoints no mestre, alguns pontos de rein\u00edcio na r\u00e9plica, quando ela abriu. E isso ajudou. Eu pensei muito sobre por que isso ajudou e como funcionou. E a r\u00e9plica iniciou. E a replica\u00e7\u00e3o n\u00e3o caiu mais. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/418ca59a681be84f51ed374a73a759c9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Essa \u00e9 uma das quest\u00f5es mais enigm\u00e1ticas para mim, sobre a qual ainda me pergunto o que realmente estava acontecendo. <\/p>\n<p><\/p>\n<p>Quais s\u00e3o as conclus\u00f5es aqui? O Patroni pode funcionar como planejado e sem erros. Mas isso n\u00e3o garante 100% que tudo est\u00e1 bem. A r\u00e9plica pode iniciar, mas pode estar em um estado semi-funcional, e o aplicativo n\u00e3o deve operar com tal r\u00e9plica, pois conter\u00e1 dados antigos. <\/p>\n<p><\/p>\n<p>E ap\u00f3s cada failover, \u00e9 sempre necess\u00e1rio verificar se tudo est\u00e1 em ordem com o cluster, ou seja, se h\u00e1 o n\u00famero necess\u00e1rio de r\u00e9plicas e se n\u00e3o h\u00e1 lat\u00eancia na replica\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/aca7047ff33d3efe14071b798b554091.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Enquanto abordo esses problemas, vou formular recomenda\u00e7\u00f5es. Tentei agrup\u00e1-las em dois slides. Na verdade, todas as hist\u00f3rias poderiam ser reunidas em dois slides e apenas contadas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/d4ad31b26d83c8846fe4097a11d70849.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando voc\u00ea usa o Patroni, deve haver monitoramento. Voc\u00ea sempre precisa saber quando ocorreu um failover autom\u00e1tico, porque se voc\u00ea n\u00e3o souber que houve um failover, n\u00e3o estar\u00e1 controlando o cluster. E isso \u00e9 ruim.<\/p>\n<p><\/p>\n<p>Ap\u00f3s cada failover, devemos sempre verificar manualmente o cluster. Precisamos garantir que temos sempre o n\u00famero atual de r\u00e9plicas, que n\u00e3o h\u00e1 lat\u00eancia na replica\u00e7\u00e3o e que n\u00e3o h\u00e1 erros nos logs relacionados \u00e0 replica\u00e7\u00e3o em fluxo, ao Patroni ou ao sistema DCS.<\/p>\n<p><\/p>\n<p>A automa\u00e7\u00e3o pode funcionar com sucesso, o Patroni \u00e9 uma ferramenta muito boa. Ela pode funcionar, mas isso n\u00e3o leva o cluster ao estado desejado. E se n\u00e3o soubermos disso, teremos problemas.<\/p>\n<p><\/p>\n<p>E o Patroni n\u00e3o \u00e9 uma solu\u00e7\u00e3o m\u00e1gica. Ainda precisamos entender como o Postgres funciona, como a replica\u00e7\u00e3o funciona e como o Patroni interage com o Postgres e como a comunica\u00e7\u00e3o entre os n\u00f3s \u00e9 garantida. Isso \u00e9 necess\u00e1rio para poder resolver manualmente os problemas que surgem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/ea4162df3561d2ea7001f2ef6788eaaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como eu abordo a quest\u00e3o do diagn\u00f3stico? Chegou ao ponto em que trabalhamos com diferentes clientes e ningu\u00e9m tem uma pilha ELK, ent\u00e3o temos que entender os logs abrindo 6 consoles e 2 abas. Em uma aba, est\u00e3o os logs do Patroni para cada n\u00f3, e na outra aba, est\u00e3o os logs do Consul ou do Postgres, se necess\u00e1rio. Diagnosticar isso \u00e9 muito dif\u00edcil. <\/p>\n<p><\/p>\n<p>Quais abordagens eu desenvolvi? Primeiro, eu sempre olho para quando o failover ocorreu. E para mim, isso \u00e9 uma divis\u00e3o importante. Eu analiso o que aconteceu antes, durante e depois do failover. O failover tem duas marca\u00e7\u00f5es: o hor\u00e1rio de in\u00edcio e o de t\u00e9rmino. <\/p>\n<p><\/p>\n<p>Em seguida, eu olho nos logs os eventos antes do failover, o que precedeu o failover, ou seja, procuro as raz\u00f5es pelas quais o failover ocorreu. <\/p>\n<p><\/p>\n<p>E isso fornece uma compreens\u00e3o do que aconteceu e o que pode ser feito no futuro para que tais circunst\u00e2ncias n\u00e3o ocorram (e, como consequ\u00eancia, o failover n\u00e3o aconte\u00e7a).<\/p>\n<p><\/p>\n<p>E para onde geralmente olhamos? Eu olho para:<\/p>\n<p><\/p>\n<ul>\n<li>Primeiro, nos logs do Patroni. <\/li>\n<li>Em seguida, olho os logs do Postgres ou os logs do DCS, dependendo do que encontrei nos logs do Patroni. <\/li>\n<li>E os logs do sistema tamb\u00e9m \u00e0s vezes fornecem entendimento sobre o que causou o failover. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a53618e366020e1a550d852fc308c188.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como eu vejo o Patroni? Eu vejo o Patroni muito bem. Na minha opini\u00e3o, \u00e9 o melhor que existe hoje. Eu conhe\u00e7o muitos outros produtos, como Stolon, Repmgr, Pg_auto_failover, PAF. Quatro ferramentas. Eu tentei todas. O Patroni foi o que mais gostei. <\/p>\n<p><\/p>\n<p>Se me perguntarem: \"Recomendaria o Patroni?\" Eu direi que sim, porque eu gosto do Patroni. E, parece-me que aprendi a configur\u00e1-lo. <\/p>\n<p><\/p>\n<p>Se voc\u00ea estiver interessado em ver quais outros problemas existem com o Patroni, al\u00e9m dos problemas que mencionei, voc\u00ea sempre pode visitar a p\u00e1gina <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\/issues\/\">issues<\/a><\/noindex> no GitHub. H\u00e1 muitas hist\u00f3rias diferentes l\u00e1 e muitas quest\u00f5es interessantes s\u00e3o discutidas. E, no final, alguns bugs foram detectados e resolvidos, ou seja, \u00e9 uma leitura interessante. <\/p>\n<p><\/p>\n<p>L\u00e1 existem hist\u00f3rias interessantes sobre como as pessoas fazem escolhas erradas. Muito informativo. Voc\u00ea l\u00ea e entende que n\u00e3o deve agir daquela maneira. Marquei essa li\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p>E gostaria de agradecer muito \u00e0 empresa Zalando por desenvolver este projeto, especialmente a Alexander Kukushkin e Alexey Klyukin. Alexey Klyukin \u00e9 um dos co-autores, ele j\u00e1 n\u00e3o trabalha mais na Zalando, mas s\u00e3o duas pessoas que come\u00e7aram a trabalhar com este produto. <\/p>\n<p><\/p>\n<p>E eu considero que o Patroni \u00e9 uma ferramenta incr\u00edvel. Estou satisfeito por existirem, \u00e9 interessante trabalhar com ela. E um grande obrigado a todos os contribuidores que escrevem patches para o Patroni. Espero que o Patroni se torne mais maduro, melhor e mais eficiente com o tempo. J\u00e1 \u00e9 funcional, mas espero que se torne ainda melhor. Portanto, se voc\u00ea planeja usar o Patroni, n\u00e3o tenha medo. \u00c9 uma boa solu\u00e7\u00e3o, pode ser implementada e utilizada. <\/p>\n<p><\/p>\n<p>Isso \u00e9 tudo. Se voc\u00ea tiver perguntas, sinta-se \u00e0 vontade para perguntar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Patroni Failure Stories ou Como derrubar seu cluster PostgreSQL. Alexey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/85c2fef2455999b48413c9fc3b235ed6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perguntas<\/p>\n<p><\/p>\n<p><em>Obrigado pela apresenta\u00e7\u00e3o! Se, ap\u00f3s o failover, ainda precisarmos olhar muito de perto, ent\u00e3o por que precisamos de um failover autom\u00e1tico?<\/em> <\/p>\n<p><\/p>\n<p>Porque \u00e9 uma nova ferramenta. Trabalhamos com ela h\u00e1 apenas um ano. \u00c9 melhor ser cauteloso. Queremos entrar e ver se tudo funcionou como deveria. \u00c9 um n\u00edvel de desconfian\u00e7a maduro \u2013 \u00e9 melhor verificar e observar. <\/p>\n<p><\/p>\n<p><em>Por exemplo, entramos pela manh\u00e3 e verificamos, certo?<\/em><\/p>\n<p><\/p>\n<p>N\u00e3o pela manh\u00e3, normalmente sabemos sobre o failover autom\u00e1tico quase que imediatamente. Recebemos notifica\u00e7\u00f5es, vemos que ocorreu um failover autom\u00e1tico. Entramos e verificamos praticamente de imediato. Mas todas essas verifica\u00e7\u00f5es devem ser realocadas para o n\u00edvel de monitoramento. Se voc\u00ea acessar o Patroni via API REST, h\u00e1 um hist\u00f3rico. No hist\u00f3rico, pode-se observar as marcas temporais em que ocorreu o failover. Com base nisso, \u00e9 poss\u00edvel fazer o monitoramento. Podemos verificar o hist\u00f3rico e ver quantos eventos ocorreram. Se tivermos mais eventos, significa que ocorreu um failover autom\u00e1tico. Podemos entrar e verificar. Ou nossa automa\u00e7\u00e3o no monitoramento verificou que todas as r\u00e9plicas est\u00e3o no lugar, sem atrasos e tudo est\u00e1 bem. <\/p>\n<p><\/p>\n<p><em>Obrigado!<\/em><\/p>\n<p><\/p>\n<p><em>Muito obrigado pela excelente explica\u00e7\u00e3o! Se deslocamos o cluster DCS para longe do cluster Postgres, \u00e9 necess\u00e1rio manuten\u00e7\u00e3o peri\u00f3dica deste cluster tamb\u00e9m? Quais s\u00e3o as melhores pr\u00e1ticas em rela\u00e7\u00e3o a partes do cluster DCS que precisam ser desligadas, o que fazer com elas, etc.? Como essa estrutura continua funcionando? E como devemos proceder?<\/em><\/p>\n<p><\/p>\n<p>Para uma empresa, foi necess\u00e1rio criar uma matriz de problemas, que descreve o que acontece se algum dos componentes ou v\u00e1rios componentes falharem. Com base nessa matriz, analisamos sequencialmente todos os componentes e constru\u00edmos cen\u00e1rios para a falha desses componentes. Consequentemente, para cada cen\u00e1rio de falha, pode-se ter um plano de a\u00e7\u00e3o para recupera\u00e7\u00e3o. E no caso do DCS, isso \u00e9 parte da infraestrutura padr\u00e3o. O administrador a gerencia, e j\u00e1 contamos com os administradores para isso e suas habilidades de consertar em caso de falhas. Se n\u00e3o houver DCS, n\u00f3s o implantamos, mas sem monitor\u00e1-lo de perto, pois n\u00e3o somos respons\u00e1veis pela infraestrutura, apenas fornecemos recomenda\u00e7\u00f5es sobre como e o que monitorar. <\/p>\n<p><\/p>\n<p><em>Ou seja, estou correto em entender que \u00e9 necess\u00e1rio desligar o Patroni, desativar o failover, desligar tudo antes de fazer algo com os hosts?<\/em><\/p>\n<p><\/p>\n<p>Isso depende de quantos n\u00f3s temos no cluster DCS. Se houver muitos n\u00f3s e se derrubarmos apenas um n\u00f3 (r\u00e9plica), o qu\u00f3rum \u00e9 mantido no cluster. E o Patroni permanece funcional. E nada \u00e9 acionado. Se tivermos opera\u00e7\u00f5es complexas que afetam mais n\u00f3s, cuja aus\u00eancia pode romper o qu\u00f3rum, ent\u00e3o \u2013 sim, talvez fa\u00e7a sentido pausar o Patroni. Ele tem um comando apropriado \u2013 patronictl pause, patronictl resume. N\u00f3s simplesmente pausamos, e o failover autom\u00e1tico n\u00e3o \u00e9 acionado nesse momento. Fazemos a manuten\u00e7\u00e3o no cluster DCS, depois retiramos a pausa e continuamos a operar.<\/p>\n<p><\/p>\n<p><em>Muito obrigado!<\/em><\/p>\n<p><\/p>\n<p><em>Muito obrigado pela apresenta\u00e7\u00e3o! Como a equipe de produto se sente em rela\u00e7\u00e3o \u00e0 poss\u00edvel perda de dados?<\/em> <\/p>\n<p><\/p>\n<p>A equipe de produto n\u00e3o se preocupa, mas os l\u00edderes de equipe est\u00e3o apreensivos. <\/p>\n<p><\/p>\n<p><em>Quais garantias existem nesse caso?<\/em><\/p>\n<p><\/p>\n<p>Com garantias \u00e9 muito complicado. H\u00e1 uma apresenta\u00e7\u00e3o de Alexander Kukushkin sobre \"Como calcular RPO e RTO\", ou seja, o tempo de recupera\u00e7\u00e3o e quanto podemos perder de dados. Eu acho que precisamos encontrar esses slides e estud\u00e1-los. Pelo que me lembro, h\u00e1 passos espec\u00edficos sobre como calcular essas coisas. Quantas transa\u00e7\u00f5es podemos perder, quantos dados podemos perder. Como uma op\u00e7\u00e3o, podemos usar replica\u00e7\u00e3o s\u00edncrona no n\u00edvel do Patroni, mas isso \u00e9 uma faca de dois gumes: ou temos confiabilidade dos dados, ou perdemos em velocidade. Existe replica\u00e7\u00e3o s\u00edncrona, mas ela tamb\u00e9m n\u00e3o garante 100% de prote\u00e7\u00e3o contra perda de dados.<\/p>\n<p><\/p>\n<p><em>Alexei, obrigado pela excelente apresenta\u00e7\u00e3o! Voc\u00ea tem experi\u00eancia no uso do Patroni para prote\u00e7\u00e3o de n\u00edvel zero? Ou seja, em conjunto com um standby s\u00edncrono? Essa \u00e9 a primeira pergunta. E a segunda pergunta. Voc\u00ea utilizou diferentes solu\u00e7\u00f5es. N\u00f3s utilizamos Repmgr, mas sem failover autom\u00e1tico e agora estamos planejando conectar o failover autom\u00e1tico. Estamos considerando o Patroni como uma solu\u00e7\u00e3o alternativa. O que voc\u00ea pode dizer sobre as vantagens em compara\u00e7\u00e3o com o Repmgr?<\/em><\/p>\n<p><\/p>\n<p>A primeira pergunta foi sobre r\u00e9plicas s\u00edncronas. Ningu\u00e9m usa replica\u00e7\u00e3o s\u00edncrona, porque todos t\u00eam medo (J\u00e1 estamos usando com alguns clientes, e n\u00e3o notamos problemas de desempenho \u2014 <em>Nota do apresentador<\/em>). Mas n\u00f3s estabelecemos uma regra de que deve haver pelo menos tr\u00eas n\u00f3s em um cluster de replica\u00e7\u00e3o s\u00edncrona, porque se tivermos dois n\u00f3s e se o mestre ou a r\u00e9plica falharem, o Patroni coloca esse n\u00f3 em modo aut\u00f4nomo para que o aplicativo continue funcionando. Nesse caso, existem riscos de perda de dados.<\/p>\n<p><\/p>\n<p>Quanto \u00e0 segunda pergunta, usamos o Repmgr e ainda o utilizamos com alguns clientes por motivos hist\u00f3ricos. O que posso dizer? No Patroni, o failover autom\u00e1tico vem de forma nativa, enquanto no Repmgr o failover autom\u00e1tico \u00e9 uma fun\u00e7\u00e3o adicional que precisa ser ativada. \u00c9 necess\u00e1rio iniciar o daemon do Repmgr em cada n\u00f3 e ent\u00e3o podemos configurar o failover autom\u00e1tico. <\/p>\n<p><\/p>\n<p>O Repmgr verifica se os n\u00f3s do Postgres est\u00e3o vivos. Os processos do Repmgr verificam a exist\u00eancia uns dos outros, esse n\u00e3o \u00e9 um m\u00e9todo muito eficiente, pois podem ocorrer casos complexos de isolamento de rede em que um grande cluster do Repmgr pode se dividir em v\u00e1rios menores e continuar a funcionar. N\u00e3o tenho acompanhado o Repmgr h\u00e1 algum tempo, pode ser que isso tenha sido corrigido... ou talvez n\u00e3o. Mas a transfer\u00eancia de informa\u00e7\u00f5es sobre o estado do cluster para o DCS, como faz o Stolon, o Patroni, \u00e9 a op\u00e7\u00e3o mais vi\u00e1vel. <\/p>\n<p><\/p>\n<p><em>Alexey, tenho uma pergunta que talvez seja meio ing\u00eanua. Em um dos primeiros exemplos, voc\u00ea transferiu do computador local para um n\u00f3 remoto. Entendemos que a rede tem suas particularidades e que vive por si s\u00f3. E o que acontece se, por algum motivo, o cluster DCS se tornar inacess\u00edvel? N\u00e3o vou entrar nos motivos, pois eles podem ser muitos: desde erros da equipe de rede at\u00e9 problemas reais.<\/em> <\/p>\n<p><\/p>\n<p>N\u00e3o mencionei isso em voz alta, mas o cluster DCS tamb\u00e9m deve ser tolerante a falhas, ou seja, deve ter um n\u00famero \u00edmpar de n\u00f3s para que um qu\u00f3rum possa ser alcan\u00e7ado. O que acontece se o cluster DCS se tornar inacess\u00edvel ou se n\u00e3o conseguir formar um qu\u00f3rum, ou seja, um split de rede ou falha de n\u00f3s? Nesse caso, o cluster do Patroni passa para o modo somente leitura. O cluster do Patroni n\u00e3o consegue determinar o estado do cluster e o que fazer. Ele n\u00e3o consegue se conectar ao DCS e salvar o novo estado do cluster, por isso todo o cluster passa para o modo somente leitura. E aguarda a interven\u00e7\u00e3o manual do operador ou a recupera\u00e7\u00e3o do DCS.<\/p>\n<p><\/p>\n<p><em>De certa forma, o DCS se torna um servi\u00e7o t\u00e3o importante para n\u00f3s quanto o pr\u00f3prio banco de dados?<\/em><\/p>\n<p><\/p>\n<p>Sim, sim. Em muitas empresas modernas, a Descoberta de Servi\u00e7os \u00e9 uma parte essencial da infraestrutura. Ela \u00e9 implementada at\u00e9 antes mesmo de existir uma base de dados na infraestrutura. Para simplificar, a infraestrutura foi iniciada, montada no DC, e j\u00e1 temos a Descoberta de Servi\u00e7os. Se for o Consul, o DNS pode ser constru\u00eddo sobre ele. Se for o Etcd, pode ser uma parte do cluster Kubernetes, onde todo o resto ser\u00e1 implementado. Parece-me que a Descoberta de Servi\u00e7os j\u00e1 \u00e9 parte intr\u00ednseca das infraestruturas modernas. E as empresas pensam nela muito antes de pensarem nas bases de dados. <\/p>\n<p><\/p>\n<p><em>Obrigado!<\/em><\/p>\n<p>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Hist\u00f3rias de Falhas do Patroni ou Como derrubar seu cluster PostgreSQL. Alexey Lesovski | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/90103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=90103"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/90103\/revisions"}],"predecessor-version":[{"id":158759,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/90103\/revisions\/158759"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/90104"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=90103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=90103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=90103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}