{"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\/pl\/blog\/administrirovanie\/patroni-failure-stories-or-how-to-crash-your-postgresql-cluster-aleksej-lesovskij","title":{"rendered":"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/6404cba13214f499d1f347cca0aacbe7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>G\u0142\u00f3wnym celem Patroni jest zapewnienie wysokiej dost\u0119pno\u015bci dla PostgreSQL. Jednak Patroni to tylko szablon, a nie gotowe narz\u0119dzie (co zreszt\u0105 zosta\u0142o zawarte w dokumentacji). Na pierwszy rzut oka, konfiguruj\u0105c Patroni w laboratorium testowym, mo\u017cna zobaczy\u0107, jak wspania\u0142ym narz\u0119dziem jest i jak \u0142atwo radzi sobie z naszymi pr\u00f3bami zrujnowania klastra. Jednak w praktyce w \u015brodowisku produkcyjnym nie zawsze wszystko przebiega tak pi\u0119knie i elegancko, jak w laboratorium testowym.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/ff445e6d76a2ad46a232b705e104446f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Opowiem troch\u0119 o sobie. Zaczyna\u0142em jako administrator system\u00f3w. Pracowa\u0142em w web development. Od 2014 roku pracuj\u0119 w Data Egret. Firma zajmuje si\u0119 doradztwem w dziedzinie Postgres. Obs\u0142ugujemy tylko Postgres i codziennie pracujemy z Postgres, dlatego mamy r\u00f3\u017cne do\u015bwiadczenia zwi\u0105zane z eksploatacj\u0105. <\/p>\n<p><\/p>\n<p>Pod koniec 2018 roku zacz\u0119li\u015bmy stopniowo u\u017cywa\u0107 Patroni. Zgromadzili\u015bmy pewne do\u015bwiadczenie. Jako\u015b go diagnozowali\u015bmy, dostosowywali\u015bmy, doszli\u015bmy do swoich najlepszych praktyk. O tym b\u0119d\u0119 m\u00f3wi\u0142 w tym referacie.<\/p>\n<p><\/p>\n<p>Opr\u00f3cz Postgresa lubi\u0119 Linuxa. Lubi\u0119 go eksplorowa\u0107 i bada\u0107, lubi\u0119 kompilowa\u0107 j\u0105dra. Interesuj\u0105 mnie tak\u017ce wirtualizacja, kontenery, Docker, Kubernetes. To wszystko mnie fascynuje, poniewa\u017c nawi\u0105zuj\u0119 do dawnych nawyk\u00f3w administracyjnych. Lubi\u0119 zajmowa\u0107 si\u0119 monitorowaniem. I lubi\u0119 rzeczy zwi\u0105zane z administracj\u0105 Postgresa, czyli replikacj\u0119, kopie zapasowe. A w wolnym czasie pisz\u0119 w Go. Nie jestem in\u017cynierem oprogramowania, pisz\u0119 dla siebie w Go. Sprawia mi to przyjemno\u015b\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/02cfd9293af5a8410c91e39afe2c75e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>My\u015bl\u0119, \u017ce wielu z was wie, \u017ce w Postgres nie ma HA (Wysokiej Dost\u0119pno\u015bci) od razu. Aby uzyska\u0107 HA, trzeba co\u015b zainstalowa\u0107, skonfigurowa\u0107, w\u0142o\u017cy\u0107 wysi\u0142ek, aby to uzyska\u0107. <\/li>\n<li>Istnieje kilka narz\u0119dzi, a Patroni to jedno z nich, kt\u00f3re rozwi\u0105zuj\u0105 HA w do\u015b\u0107 imponuj\u0105cy i efektywny spos\u00f3b. Jednak po zainstalowaniu go w laboratorium testowym i uruchomieniu, mo\u017cemy sprawdzi\u0107, \u017ce to wszystko dzia\u0142a, mo\u017cemy odtwarza\u0107 pewne problemy, zobaczy\u0107, jak Patroni je obs\u0142uguje. I przekonamy si\u0119, \u017ce to wszystko dzia\u0142a ca\u0142kiem dobrze. <\/li>\n<li>Jednak w praktyce spotykali\u015bmy si\u0119 z r\u00f3\u017cnymi problemami. O nich b\u0119d\u0119 m\u00f3wi\u0142.<\/li>\n<li>Opowiem, jak to diagnozowali\u015bmy, co zmieniali\u015bmy \u2013 czy to nam pomog\u0142o, czy nie. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/7126b45b40dd08521e80a3c150382bec.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Nie b\u0119d\u0119 opowiada\u0107, jak zainstalowa\u0107 Patroni, poniewa\u017c mo\u017cna to znale\u017a\u0107 w Internecie, mo\u017cna te\u017c spojrze\u0107 na pliki konfiguracyjne, aby zrozumie\u0107, jak to wszystko dzia\u0142a i jak jest konfigurowane. Mo\u017cna zg\u0142\u0119bi\u0107 schematy, architektury, znajduj\u0105c o tym informacje w Internecie. <\/li>\n<li>Nie zamierzam m\u00f3wi\u0107 o cudzych do\u015bwiadczeniach. B\u0119d\u0119 m\u00f3wi\u0107 tylko o tych problemach, z kt\u00f3rymi sami si\u0119 spotkali\u015bmy. <\/li>\n<li>I nie zamierzam omawia\u0107 problem\u00f3w, kt\u00f3re s\u0105 poza Patroni i PostgreSQL. Na przyk\u0142ad, problemy zwi\u0105zane z load balancingiem, kiedy nasz klaster si\u0119 rozpad\u0142, nie b\u0119d\u0119 o tym m\u00f3wi\u0107. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/3f8d179e7c78ce83e8842ef5c72fe30d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I ma\u0142y disclaimer przed rozpocz\u0119ciem naszej prezentacji. <\/p>\n<p><\/p>\n<p>Wszystkie te problemy, z kt\u00f3rymi si\u0119 zmierzyli\u015bmy, mia\u0142y miejsce w ci\u0105gu pierwszych 6-7-8 miesi\u0119cy eksploatacji. Z czasem doszli\u015bmy do naszych wewn\u0119trznych najlepszych praktyk. I problemy znikn\u0119\u0142y. Dlatego prezentacja by\u0142a zg\u0142aszana oko\u0142o p\u00f3\u0142 roku temu, kiedy to wszystko by\u0142o \u015bwie\u017ce w mojej g\u0142owie i dobrze to pami\u0119ta\u0142em. <\/p>\n<p><\/p>\n<p>Podczas przygotowa\u0144 do prezentacji przegl\u0105da\u0142em stare postmortemy, sprawdza\u0142em logi. I cz\u0119\u015b\u0107 szczeg\u00f3\u0142\u00f3w mog\u0142a mi umkn\u0105\u0107, albo pewnych detali mog\u0142o nie by\u0107 wystarczaj\u0105co zbadanych podczas analizy problem\u00f3w, dlatego w niekt\u00f3rych momentach mo\u017ce si\u0119 wydawa\u0107, \u017ce problemy zosta\u0142y om\u00f3wione nie w pe\u0142ni, albo \u017ce brakuje pewnych informacji. Prosz\u0119 o wybaczenie za ten moment. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/30d414284a41fcbc3bf417c9da28ca52.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Czym jest Patroni?<\/p>\n<p><\/p>\n<ul>\n<li>To szablon do budowy HA. Tak pisze dokumentacja. Z mojego punktu widzenia, to bardzo trafne okre\u015blenie. Patroni to nie srebrna kula, kt\u00f3ra rozwi\u0105\u017ce wszystkie twoje problemy, tzn. trzeba w\u0142o\u017cy\u0107 wysi\u0142ek, aby zacz\u0119\u0142o dzia\u0142a\u0107 i przynosi\u0107 korzy\u015bci. <\/li>\n<li>To serwis agenta, kt\u00f3ry jest instalowany na ka\u017cdej us\u0142udze z baz\u0105 danych i kt\u00f3ry jest rodzajem systemu init dla twojego Postgresa. Uruchamia Postgresa, zatrzymuje go, restartuje, zmienia konfiguracj\u0119 i topologi\u0119 twojego klastra. <\/li>\n<li>W zwi\u0105zku z tym, aby przechowywa\u0107 stan klastra, jego bie\u017c\u0105ce przedstawienie, jak wygl\u0105da, potrzebne jest jakie\u015b repozytorium. I w tym kontek\u015bcie Patroni poszed\u0142 drog\u0105 przetrzymywania stanu w zewn\u0119trznym systemie. To system rozproszonego repozytorium konfiguracji. Mog\u0105 to by\u0107 Etcd, Consul, ZooKeeper, lub Etcd w Kubernetesie, tj. jedna z tych opcji. <\/li>\n<li>Jedn\u0105 z cech Patroni jest to, \u017ce auto-failover otrzymujemy od razu, wystarczy go skonfigurowa\u0107. Je\u015bli we\u017amiemy Repmgr jako por\u00f3wnanie, to failover jest w zestawie. Z Repmgr mamy switchover, ale je\u015bli chcemy auto-failover, musimy go dodatkowo skonfigurowa\u0107. W Patroni auto-failover jest dost\u0119pne od razu.<\/li>\n<li>Jest wiele innych rzeczy. Na przyk\u0142ad zarz\u0105dzanie konfiguracjami, dodawanie nowych replik, kopie zapasowe itp. Ale to wykracza poza prezentacj\u0119, o tym nie b\u0119d\u0119 m\u00f3wi\u0107. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/fed0f1ce931df99ca76ae1116f8098cc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma\u0142y podsumowanie \u2013 g\u0142\u00f3wnym zadaniem Patroni jest dobrze i niezawodnie realizowa\u0107 auto-failover, aby nasz klaster pozostawa\u0142 sprawny, a aplikacja nie zauwa\u017ca\u0142a zmian w topologii klastra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/fac52620957efa47ced330e7cc8084e0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale kiedy zaczynamy u\u017cywa\u0107 Patroni, nasz system staje si\u0119 nieco bardziej skomplikowany. Je\u015bli wcze\u015bniej mieli\u015bmy Postgres, to przy u\u017cyciu Patroni otrzymujemy samego Patroni, otrzymujemy DCS, gdzie przechowywany jest stan. I wszystko to musi jako\u015b dzia\u0142a\u0107. Dlatego, co mo\u017ce si\u0119 zepsu\u0107?<\/p>\n<p><\/p>\n<p>Mo\u017ce si\u0119 zepsu\u0107:<\/p>\n<p><\/p>\n<ul>\n<li>Mo\u017ce si\u0119 zepsu\u0107 Postgres. Mo\u017ce to by\u0107 master lub replika, jedno z nich mo\u017ce przesta\u0107 dzia\u0142a\u0107. <\/li>\n<li>Mo\u017ce si\u0119 zepsu\u0107 sam Patroni. <\/li>\n<li>Mo\u017ce si\u0119 zepsu\u0107 DCS, gdzie przechowywany jest stan.<\/li>\n<li>I mo\u017ce si\u0119 zepsu\u0107 sie\u0107. <\/li>\n<\/ul>\n<p><\/p>\n<p>Wszystkie te kwestie om\u00f3wi\u0119 w prezentacji. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/1aeaf46d37bf1935b514b0581e0dbd0b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>B\u0119d\u0119 rozwa\u017ca\u0142 przypadki w miar\u0119 ich skomplikowania, nie z punktu widzenia, \u017ce przypadek obejmuje wiele komponent\u00f3w, ale z punktu widzenia subiektywnych odczu\u0107, \u017ce ten przypadek by\u0142 dla mnie trudny, trudno by\u0142o go analizowa\u0107\u2026 a odwrotnie, jaki\u015b przypadek by\u0142 \u0142atwy i \u0142atwo go by\u0142o rozwi\u0105za\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/65b0c98bf2284610e955ced5eb998f39.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pierwszy przypadek jest najprostszy. To ten przypadek, gdy wzi\u0119li\u015bmy klaster baz danych i na tym samym klastrze uruchomili\u015bmy nasze przechowywanie DCS. To najcz\u0119stszy b\u0142\u0105d. To b\u0142\u0105d projektowania architektur, tzn. \u0142\u0105czenie r\u00f3\u017cnych komponent\u00f3w w jednym miejscu. <\/p>\n<p><\/p>\n<p>I tak, wyst\u0105pi\u0142 failover, idziemy sprawdzi\u0107, co si\u0119 sta\u0142o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/244b69d623fe2205c2d9ed2aa4620067.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Interesuje nas moment, w kt\u00f3rym nast\u0105pi\u0142 failover. Tzn. interesuje nas ten moment w czasie, kiedy nast\u0105pi\u0142a zmiana stanu klastra. <\/p>\n<p><\/p>\n<p>Jednak failover nie zawsze jest jednoczesny, tzn. nie zajmuje jednej jednostki czasu, mo\u017ce trwa\u0107. Mo\u017ce to by\u0107 proces d\u0142ugotrwa\u0142y.<\/p>\n<p><\/p>\n<p>Dlatego ma on czas rozpocz\u0119cia i czas zako\u0144czenia, to znaczy, \u017ce jest to zdarzenie d\u0142ugoterminowe. Dzielimy wszystkie zdarzenia na trzy interwa\u0142y: mamy czas przed awari\u0105, w trakcie awarii i po awarii. To znaczy, \u017ce rozwa\u017camy wszystkie zdarzenia w tej osi czasu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a0ed61afe55d1a157147e0d80b17e5d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I pierwsz\u0105 rzecz\u0105, gdy nast\u0105pi\u0142a awaria, jest to, \u017ce szukamy przyczyny, co si\u0119 sta\u0142o, co by\u0142o powodem, kt\u00f3ry doprowadzi\u0142 do awarii. <\/p>\n<p><\/p>\n<p>Je\u015bli spojrzymy na logi, to b\u0119d\u0105 to klasyczne logi Patroni. Informuj\u0105 nas one, \u017ce serwer sta\u0142 si\u0119 mistrzem, a rola mistrza przesz\u0142a na ten w\u0119ze\u0142. Tutaj jest to pod\u015bwietlone. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/9998c69f7d0d4358b277f4e0e7b4350f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pnie musimy zrozumie\u0107, dlaczego wyst\u0105pi\u0142a awaria, tzn. jakie wydarzenia doprowadzi\u0142y do przeniesienia roli mistrza z jednego w\u0119z\u0142a na inny. W tym przypadku wszystko jest proste. Mamy b\u0142\u0105d w interakcji z systemem przechowywania. Mistrz zrozumia\u0142, \u017ce nie mo\u017ce pracowa\u0107 z DCS, tzn. wyst\u0105pi\u0142 jaki\u015b problem z interakcj\u0105. I m\u00f3wi, \u017ce nie mo\u017ce by\u0107 ju\u017c d\u0142u\u017cej mistrzem i zrzuca z siebie uprawnienia. Ta linia \u201edemoted self\u201d m\u00f3wi o tym. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/4a8eca27689546b4b0fc3c666a3c37c4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli spojrzymy na zdarzenia, kt\u00f3re poprzedzi\u0142y awari\u0119, to mo\u017cemy dostrzec te same przyczyny, kt\u00f3re by\u0142y problemem dla dalszej pracy mistrza. <\/p>\n<p><\/p>\n<p>Je\u015bli przejrzymy logi Patroni, to zobaczymy, \u017ce mamy mas\u0119 r\u00f3\u017cnych b\u0142\u0119d\u00f3w, czas\u00f3w oczekiwania, tzn. agent Patroni nie mo\u017ce pracowa\u0107 z DCS. W tym przypadku to agent Consul, z kt\u00f3rym komunikacja odbywa si\u0119 przez port 8500. <\/p>\n<p><\/p>\n<p>I problem polega na tym, \u017ce Patroni i baza danych s\u0105 uruchomione na jednym ho\u015bcie. Na tym samym w\u0119\u017ale by\u0142y uruchomione serwery Consul. Tworz\u0105c obci\u0105\u017cenie na serwerze, stworzyli\u015bmy problemy tak\u017ce dla <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pl\/server\/\"   title=\"serwer\u00f3w\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1515\">serwer\u00f3w<\/a> Consul. Nie mog\u0142y one normalnie komunikowa\u0107 si\u0119. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/0d8dba6641809560e6b32825d481e30b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po pewnym czasie, gdy obci\u0105\u017cenie spad\u0142o, nasz Patroni m\u00f3g\u0142 ponownie komunikowa\u0107 si\u0119 z agentami. Normalna praca zosta\u0142a wznowiona. A ten sam serwer Pgdb-2 znowu sta\u0142 si\u0119 mistrzem. To znaczy, \u017ce nast\u0105pi\u0142 ma\u0142y flip, przez kt\u00f3ry w\u0119ze\u0142 zrzuci\u0142 z siebie uprawnienia mistrza, a potem znowu je przej\u0105\u0142, to znaczy, wszystko wr\u00f3ci\u0142o do normy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/131b93e0bd83099e1b99b53742419e13.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I to mo\u017cna uzna\u0107 za fa\u0142szywe wyzwolenie, lub mo\u017cna oceni\u0107, \u017ce Patroni post\u0105pi\u0142 w\u0142a\u015bciwie. To znaczy, \u017ce zrozumia\u0142, i\u017c nie mo\u017ce utrzyma\u0107 stanu klastra i zrzuci\u0142 z siebie uprawnienia.<\/p>\n<p><\/p>\n<p>Problem pojawi\u0142 si\u0119, poniewa\u017c serwery Consul znajduj\u0105 si\u0119 na tym samym sprz\u0119cie, co bazy danych. W zwi\u0105zku z tym obci\u0105\u017cenie, czy to obci\u0105\u017cenie dysk\u00f3w, czy procesor\u00f3w, wp\u0142ywa r\u00f3wnie\u017c na interakcj\u0119 z klastrem Consul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/142c7cf839c8da078451f7ba9d5499e5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Postanowili\u015bmy, \u017ce to nie powinno \u017cy\u0107 razem, wi\u0119c wydzielili\u015bmy osobny klaster dla Consul. Patroni ju\u017c dzia\u0142a\u0142 z osobnym Consulem, tzn. by\u0142a oddzielna klaster Postgres i oddzielna klaster Consul. To podstawowa instrukcja, jak powinno si\u0119 rozdziela\u0107 te rzeczy i utrzymywa\u0107, aby nie \u017cy\u0142y razem. <\/p>\n<p><\/p>\n<p>Alternatywnie mo\u017cna dostosowa\u0107 parametry ttl, loop_wait, retry_timeout, tj. spr\u00f3bowa\u0107 przetrwa\u0107 te kr\u00f3tkotrwa\u0142e szczyty obci\u0105\u017cenia poprzez ich zwi\u0119kszenie. Ale to nie jest najbardziej odpowiednia opcja, poniewa\u017c obci\u0105\u017cenie mo\u017ce by\u0107 d\u0142ugotrwa\u0142e. W\u00f3wczas po prostu przekroczymy limity tych parametr\u00f3w. To mo\u017ce nie do ko\u0144ca pom\u00f3c. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/c51f35dcd88b1c792acec231c0c6c66c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pierwszy problem, jak si\u0119 domy\u015blili\u015bcie, jest prosty. Wzi\u0119li\u015bmy i umie\u015bcili\u015bmy DCS razem z baz\u0105, co spowodowa\u0142o problem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/cc2a98d9790441577fb4080406cbc53f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Drugi problem jest podobny do pierwszego. Podobnie jak w pierwszym przypadku mamy znowu problemy z interakcj\u0105 z systemem DCS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/e5c01b105adca48cc620085db8dd2d2b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli spojrzymy na logi, zobaczymy, \u017ce zn\u00f3w wyst\u0105pi\u0142 b\u0142\u0105d komunikacji. Patroni informuje, \u017ce nie mo\u017ce wsp\u00f3\u0142pracowa\u0107 z DCS, wi\u0119c aktualny mistrz przechodzi w tryb repliki.<\/p>\n<p><\/p>\n<p>Stary mistrz staje si\u0119 replik\u0105, tutaj Patroni dzia\u0142a jak powinien. Uruchamia pg_rewind, aby przeprowadzi\u0107 rewizj\u0119 dziennika transakcji, a potem pod\u0142\u0105cza si\u0119 do nowego mistrza i goni nowego mistrza. W tym przypadku Patroni dzia\u0142a jak nale\u017cy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/29255f4790abb15b64dbf9ee0b41c7fc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Musimy tutaj znale\u017a\u0107 miejsce, kt\u00f3re poprzedza\u0142o awari\u0119, tj. b\u0142\u0119dy, kt\u00f3re by\u0142y przyczyn\u0105 wyst\u0105pienia awarii. W tym kontek\u015bcie logi Patroni s\u0105 do\u015b\u0107 wygodne w pracy. Z okre\u015blonymi interwa\u0142ami zapisuje te same komunikaty. Je\u015bli zaczniemy szybko przewija\u0107 te logi, to zobaczymy, \u017ce logi si\u0119 zmieni\u0142y, co oznacza, \u017ce pojawi\u0142y si\u0119 jakie\u015b problemy. Szybko wracamy do tego miejsca i sprawdzamy, co si\u0119 dzieje. <\/p>\n<p><\/p>\n<p>W normalnej sytuacji logi wygl\u0105daj\u0105 mniej wi\u0119cej tak. Sprawdzany jest w\u0142a\u015bciciel blokady. I je\u015bli w\u0142a\u015bciciel, na przyk\u0142ad, si\u0119 zmieni\u0142, mog\u0105 wyst\u0105pi\u0107 jakie\u015b zdarzenia, na kt\u00f3re Patroni powinien zareagowa\u0107. Ale w tym przypadku wszystko jest w porz\u0105dku. Szukamy miejsca, w kt\u00f3rym zacz\u0119\u0142y si\u0119 b\u0142\u0119dy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f48ebd22a405f5b2900621451c68f543.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przewijaj\u0105c do momentu, w kt\u00f3rym zacz\u0119\u0142y si\u0119 pojawia\u0107 b\u0142\u0119dy, widzimy, \u017ce wyst\u0105pi\u0142 autofailover. Bior\u0105c pod uwag\u0119, \u017ce nasze b\u0142\u0119dy by\u0142y zwi\u0105zane z interakcj\u0105 z DCS, a w naszym przypadku u\u017cywali\u015bmy Consul, przygl\u0105damy si\u0119 tak\u017ce logom Consul, aby zobaczy\u0107, co si\u0119 tam dzia\u0142o. <\/p>\n<p><\/p>\n<p>Oko\u0142o por\u00f3wnuj\u0105c czas failovera z czasem w logach Consul, zauwa\u017camy, \u017ce s\u0105siedzi w klastrze Consul zacz\u0119li w\u0105tpi\u0107 w istnienie innych uczestnik\u00f3w klastra Consul.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/63b02ac5b4f5a34a2822f1eee2b1f2f8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli spojrzymy r\u00f3wnie\u017c na logi innych agent\u00f3w Consul, to tam tak\u017ce wida\u0107, \u017ce wyst\u0119puje jaki\u015b problem z sieci\u0105. Wszyscy uczestnicy klastra Consul w\u0105tpi\u0105 w istnienie siebie nawzajem. To zadzia\u0142a\u0142o jako impuls do failovera. <\/p>\n<p><\/p>\n<p>Patrz\u0105c na to, co dzia\u0142o si\u0119 przed tymi b\u0142\u0119dami, mo\u017cna zauwa\u017cy\u0107 r\u00f3\u017cne problemy, takie jak deadline, RPC failed, co oznacza, \u017ce wyra\u017anie wyst\u0119puje jaki\u015b problem w interakcji uczestnik\u00f3w klastra Consul. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/b15c912f2afb49d9d85e7bb9361ce449.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Najprostsz\u0105 odpowiedzi\u0105 jest naprawa sieci. Ale mi, stoj\u0105c na m\u00f3wnicy, \u0142atwo to m\u00f3wi\u0107. Jednak okoliczno\u015bci s\u0105 takie, \u017ce nie zawsze klient mo\u017ce sobie pozwoli\u0107 na napraw\u0119 sieci. Mo\u017ce mieszka\u0107 w DC i nie mie\u0107 mo\u017cliwo\u015bci naprawy sieci ani wp\u0142ywu na sprz\u0119t. Dlatego potrzebne s\u0105 inne opcje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/1dbdb66233acc3bc321a30a1c5fe14f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Opcje s\u0105:<\/p>\n<p><\/p>\n<ul>\n<li>Najprostsz\u0105 opcj\u0105, kt\u00f3ra moim zdaniem jest opisana nawet w dokumentacji, jest wy\u0142\u0105czenie sprawdzania przez Consul, tzn. przekazanie pustej tablicy. M\u00f3wimy agentowi Consul, aby nie korzysta\u0142 z \u017cadnych sprawdze\u0144. Dzi\u0119ki tym sprawdzeniom mo\u017cemy zignorowa\u0107 te burze sieciowe i nie inicjowa\u0107 failovera. <\/li>\n<li>Inna opcja to ponowne sprawdzenie raft_multiplier. To parametr samego serwera Consul. Domy\u015blnie ustawiony jest na warto\u015b\u0107 5. Ta warto\u015b\u0107 jest zalecana w dokumentacji dla \u015brodowisk staging. Zasadniczo wp\u0142ywa to na cz\u0119stotliwo\u015b\u0107 wymiany komunikat\u00f3w mi\u0119dzy uczestnikami sieci Consul. W praktyce, ten parametr wp\u0142ywa na szybko\u015b\u0107 komunikacji mi\u0119dzy uczestnikami klastra Consul. Dla \u015brodowiska produkcyjnego zaleca si\u0119 jego zmniejszenie, aby w\u0119z\u0142y cz\u0119\u015bciej wymienia\u0142y komunikaty. <\/li>\n<li>Innym rozwi\u0105zaniem, kt\u00f3re zacz\u0119li\u015bmy stosowa\u0107, jest zwi\u0119kszenie priorytetu proces\u00f3w Consul w\u015br\u00f3d innych proces\u00f3w dla planisty proces\u00f3w systemu operacyjnego. Istnieje taki parametr \u201enice\u201d, kt\u00f3ry w\u0142a\u015bnie definiuje priorytet proces\u00f3w uwzgl\u0119dniany przez planist\u0119 OS podczas planowania. Zmniejszyli\u015bmy warto\u015b\u0107 nice dla agent\u00f3w Consul, czyli podnie\u015bli\u015bmy priorytet, aby system operacyjny przydziela\u0142 procesom Consul wi\u0119cej czasu na prac\u0119 i wykonanie swojego kodu. W naszym przypadku to rozwi\u0105za\u0142o nasz problem. <\/li>\n<li>Inn\u0105 opcj\u0105 jest rezygnacja z u\u017cywania Consul. Mam znajomego, kt\u00f3ry jest zwolennikiem Etcd. Regularnie sprzeczamy si\u0119, co jest lepsze \u2013 Etcd czy Consul. W kwestii tego, co jest lepsze, zazwyczaj zgadzamy si\u0119, \u017ce Consul ma agenta, kt\u00f3ry musi by\u0107 uruchomiony na ka\u017cdym w\u0119\u017ale z baz\u0105 danych. To znaczy, interakcja Patroni z klastrem Consul odbywa si\u0119 poprzez ten agent. I ten agent staje si\u0119 w\u0105skim gard\u0142em. Je\u015bli co\u015b si\u0119 dzieje z agentem, t wtedy Patroni nie mo\u017ce ju\u017c komunikowa\u0107 si\u0119 z klastrem Consul. I to stanowi problem. W przypadku Etcd nie ma \u017cadnego agenta. Patroni mo\u017ce bezpo\u015brednio wsp\u00f3\u0142pracowa\u0107 z list\u0105 serwer\u00f3w Etcd i komunikowa\u0107 si\u0119 z nimi. W tym kontek\u015bcie, je\u015bli w twojej firmie u\u017cywasz Etcd, to prawdopodobnie b\u0119dzie to lepszy wyb\u00f3r ni\u017c Consul. Jednak my zawsze jeste\u015bmy ograniczeni tym, co klient wybra\u0142 i czego u\u017cywa. A w przypadku naszych klient\u00f3w, w wi\u0119kszo\u015bci przypadk\u00f3w, wszyscy korzystaj\u0105 z Consul. <\/li>\n<li>Ostatni punkt to przemy\u015blenie warto\u015bci parametr\u00f3w. Mo\u017cemy zwi\u0119kszy\u0107 te parametry w g\u00f3r\u0119, maj\u0105c nadziej\u0119, \u017ce nasze kr\u00f3tkoterminowe problemy z sieci\u0105 b\u0119d\u0105 kr\u00f3tkie i nie przekrocz\u0105 przedzia\u0142u tych parametr\u00f3w. W ten spos\u00f3b mo\u017cemy zmniejszy\u0107 agresywno\u015b\u0107 Patroni w realizacji auto-failover, je\u015bli wyst\u0105pi\u0105 jakie\u015b problemy z sieci\u0105.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f0043050da20f6368dabf66ec9a4eade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>My\u015bl\u0119, \u017ce wielu, kt\u00f3rzy u\u017cywaj\u0105 Patroni, zna t\u0119 komend\u0119. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/9f78f59dab166e47ac78436802156d04.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ta komenda pokazuje bie\u017c\u0105cy stan klastra. Na pierwszy rzut oka ten obraz mo\u017ce wydawa\u0107 si\u0119 normalny. Mamy g\u0142\u00f3wny w\u0119ze\u0142, mamy replik\u0119, brak op\u00f3\u017anienia replikacji. Ale ten obraz jest normalny tylko do momentu, gdy nie wiemy, \u017ce w tym klastrze powinny by\u0107 trzy w\u0119z\u0142y, a nie dwa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a39c891f8620ba210b6bce0727e0fa8b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zdarza si\u0119, \u017ce wyst\u0119puje auto-failover. Po tym auto-failoverze nasza replika znikn\u0119\u0142a. Musimy ustali\u0107, dlaczego znikn\u0119\u0142a i przywr\u00f3ci\u0107 j\u0105 z powrotem. Ponownie przeszukujemy logi i sprawdzamy, dlaczego wyst\u0105pi\u0142 auto-failover.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/e6e67d46cb20c8d7e58c7505157f68e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W tym przypadku druga replika sta\u0142a si\u0119 masterem. Wszystko jest w porz\u0105dku. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/b86ccea68b0c6013a23bbd2804e48320.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Musimy przeanalizowa\u0107 replik\u0119, kt\u00f3ra odpad\u0142a i nie jest w klastrze. Otwieramy logi Patroni i sprawdzamy, \u017ce podczas pr\u00f3by po\u0142\u0105czenia z klastrem wyst\u0105pi\u0142 problem na etapie pg_rewind. Aby po\u0142\u0105czy\u0107 si\u0119 z klastrem, nale\u017cy cofn\u0105\u0107 dziennik transakcji, za\u017c\u0105da\u0107 odpowiedniego dziennika transakcji od mastera i nadrobi\u0107 go do mastera. <\/p>\n<p><\/p>\n<p>W tym przypadku nie mamy dziennika transakcji, wi\u0119c replika nie mo\u017ce si\u0119 uruchomi\u0107. W zwi\u0105zku z tym zatrzymujemy Postgresa z b\u0142\u0119dem. Dlatego nie ma jej w klastrze. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/dadbd44b766674b719d85781ef7f0caa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Musimy zrozumie\u0107, dlaczego nie ma jej w klastrze i dlaczego nie ma log\u00f3w. Idziemy do nowego mastera i sprawdzamy jego logi. Okazuje si\u0119, \u017ce podczas pg_rewind wyst\u0105pi\u0142 checkpoint. Niekt\u00f3re stare dzienniki transakcji zosta\u0142y po prostu przemianowane. Gdy stary master pr\u00f3bowa\u0142 po\u0142\u0105czy\u0107 si\u0119 z nowym masterem i za\u017c\u0105da\u0107 tych log\u00f3w, one ju\u017c by\u0142y przemianowane i po prostu ich nie by\u0142o.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f2d5c37324f9436b2bdad1290612d86f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por\u00f3wnywa\u0142em znaczniki czasu, kiedy mia\u0142y miejsce te zdarzenia. R\u00f3\u017cnica wynosi\u0142a zaledwie 150 milisekund, a wi\u0119c checkpoint zako\u0144czy\u0142 si\u0119 w 369 milisekund. WAL-segmenty zosta\u0142y przemianowane, a nast\u0119pnie po 517 milisekundach uruchomiono rewind na starej replikacji. Czyli 150 milisekund wystarczy\u0142o, aby replika nie mog\u0142a si\u0119 po\u0142\u0105czy\u0107 i pracowa\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/99dd80deb8466bfc3aff568456e07102.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jakie s\u0105 opcje?<\/p>\n<p><\/p>\n<p>Pocz\u0105tkowo korzystali\u015bmy ze slot\u00f3w replikacji. Uwa\u017cali\u015bmy, \u017ce to dobre rozwi\u0105zanie. Chocia\u017c na pocz\u0105tku u\u017cytkowania wy\u0142\u0105czyli\u015bmy sloty. My\u015bleli\u015bmy, \u017ce je\u015bli sloty b\u0119d\u0105 gromadzi\u0107 zbyt wiele WAL-segment\u00f3w, mo\u017cemy zawali\u0107 mastera. W ko\u0144cu zmusili\u015bmy si\u0119 do przetrwania jaki\u015b czas bez slot\u00f3w, ale zrozumieli\u015bmy, \u017ce sloty s\u0105 nam potrzebne, wi\u0119c je przywr\u00f3cili\u015bmy. <\/p>\n<p><\/p>\n<p>Ale jest problem, \u017ce gdy master przechodzi w replik\u0119, usuwa sloty i razem ze slotami usuwa segmenty WAL. Aby wyeliminowa\u0107 ten problem, postanowili\u015bmy zwi\u0119kszy\u0107 parametr wal_keep_segments. Domy\u015blnie wynosi 8 segment\u00f3w. Przenie\u015bli\u015bmy go na 1000 i zobaczyli\u015bmy, ile mamy wolnego miejsca. I przekazali\u015bmy 16 gigabajt\u00f3w na wal_keep_segments. To znaczy, \u017ce podczas prze\u0142\u0105czania zawsze mamy na wszystkich w\u0119z\u0142ach zapas 16 gigabajt\u00f3w dziennik\u00f3w transakcji.<\/p>\n<p><\/p>\n<p>I dodatkowo \u2013 ma to znaczenie dla d\u0142ugotrwa\u0142ych zada\u0144 konserwacyjnych. Za\u0142\u00f3\u017cmy, \u017ce musimy zaktualizowa\u0107 jeden z replik. Chcemy go wy\u0142\u0105czy\u0107. Musimy zaktualizowa\u0107 oprogramowanie, by\u0107 mo\u017ce system operacyjny, co\u015b jeszcze. I gdy wy\u0142\u0105czamy replik\u0119, ten slot r\u00f3wnie\u017c jest usuwany. A je\u015bli u\u017cywamy ma\u0142ego wal_keep_segments, to w przypadku d\u0142ugotrwa\u0142ej nieobecno\u015bci repliki, dzienniki transakcji zostan\u0105 odtworzone. Wzniesiemy replik\u0119, ona za\u017c\u0105da tych dziennik\u00f3w transakcji, na kt\u00f3rych si\u0119 zatrzyma\u0142a, ale na masterze mo\u017ce ich nie by\u0107. I replikacja r\u00f3wnie\u017c nie b\u0119dzie mog\u0142a si\u0119 pod\u0142\u0105czy\u0107. Dlatego trzymamy du\u017cy zapas dziennik\u00f3w.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey 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=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/63e70f0b098567f3a6d4fd66a0c293bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mamy baz\u0119 produkcyjn\u0105. Tam ju\u017c dzia\u0142aj\u0105 projekty. <\/p>\n<p><\/p>\n<p>Wyst\u0105pi\u0142 failover. Sprawdzili\u015bmy i wszystko jest w porz\u0105dku, replikacje s\u0105 na miejscu, nie ma op\u00f3\u017anienia replikacji. R\u00f3wnie\u017c nie ma b\u0142\u0119d\u00f3w w dziennikach, wszystko w porz\u0105dku. <\/p>\n<p><\/p>\n<p>Zesp\u00f3\u0142 produktowy m\u00f3wi, \u017ce podobno powinny by\u0107 jakie\u015b dane, ale widzimy je w jednym \u017ar\u00f3dle, a w bazie ich nie widzimy. I trzeba zrozumie\u0107, co si\u0119 z nimi sta\u0142o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/568ca9aa31680d5e0c9d4ed9693b14e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jasne, \u017ce pg_rewind je nadpisa\u0142. Od razu to zrozumieli\u015bmy, ale poszli\u015bmy sprawdzi\u0107, co si\u0119 dzia\u0142o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a8fee389201d96e81761cd276c5265c3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W logach zawsze mo\u017cemy znale\u017a\u0107, kiedy wyst\u0105pi\u0142 failover, kto zosta\u0142 masterem i mo\u017cemy okre\u015bli\u0107, kto by\u0142 starym masterem i kiedy chcia\u0142 sta\u0107 si\u0119 replik\u0105, to znaczy potrzebujemy tych log\u00f3w, aby ustali\u0107, jaki by\u0142 utracony wolumen dziennik\u00f3w transakcji.<\/p>\n<p><\/p>\n<p>Nasz stary serwer zosta\u0142 zrestartowany. W autostarcie by\u0142 zapisany Patroni. Uruchomi\u0142 si\u0119 Patroni. Nast\u0119pnie uruchomi\u0142 Postgres. A dok\u0142adniej, przed uruchomieniem Postgres'a i przed przekszta\u0142ceniem go w replik\u0119, Patroni uruchomi\u0142 proces pg_rewind. W zwi\u0105zku z tym usun\u0105\u0142 cz\u0119\u015b\u0107 dziennik\u00f3w transakcji, pobra\u0142 nowe i po\u0142\u0105czy\u0142 si\u0119. Tutaj Patroni dzia\u0142a\u0142 doskonale, czyli tak, jak powinien. Nasz klaster zosta\u0142 przywr\u00f3cony. Mieli\u015bmy 3 w\u0119z\u0142y, po failoverze r\u00f3wnie\u017c 3 w\u0119z\u0142y \u2013 wszystko \u015bwietnie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/b747a24f53e20ed098c2dc0afc79bead.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Stracili\u015bmy cz\u0119\u015b\u0107 danych i musimy zrozumie\u0107, ile ich utracili\u015bmy. Szukamy dok\u0142adnego momentu, w kt\u00f3rym mieli\u015bmy rewind. Mo\u017cemy to znale\u017a\u0107 w zapisach w dzienniku. Rewind zosta\u0142 uruchomiony, co\u015b tam zrobi\u0142 i zako\u0144czy\u0142.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/5b7bacffb52e3ccd529a3a734c441295.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Musimy znale\u017a\u0107 pozycj\u0119 w dzienniku transakcji, w kt\u00f3rej zatrzyma\u0142 si\u0119 stary master. W tym przypadku jest to ta oto zaznaczenie. Potrzebujemy drugiego zaznaczenia, czyli odleg\u0142o\u015bci, na jak\u0105 r\u00f3\u017cni si\u0119 stary master od nowego. <\/p>\n<p><\/p>\n<p>Bierzemy zwyk\u0142y pg_wal_lsn_diff i por\u00f3wnujemy te dwa zaznaczenia. W tym przypadku otrzymujemy 17 megabajt\u00f3w. Czy to du\u017co, czy ma\u0142o, ka\u017cdy decyduje sam. Poniewa\u017c dla kogo\u015b 17 megabajt\u00f3w to niewiele, dla kogo\u015b innego to du\u017co i niedopuszczalne. To ju\u017c ka\u017cdy indywidualnie okre\u015bla w zale\u017cno\u015bci od potrzeb biznesowych. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/55335fce85961e159459c38300a0ad12.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale co ustalili\u015bmy dla siebie? <\/p>\n<p><\/p>\n<p>Po pierwsze, musimy zdecydowa\u0107, czy autostart Patroni po restarcie systemu jest nam zawsze potrzebny. Cz\u0119sto zdarza si\u0119, \u017ce musimy wej\u015b\u0107 na stary master, zobaczy\u0107, jak daleko odszed\u0142. Mo\u017cliwe, \u017ce sprawdzi\u0107 segmenty dziennika transakcji, zobaczy\u0107, co tam jest. I zrozumie\u0107, czy mo\u017cemy te dane utraci\u0107, czy musimy uruchomi\u0107 stary master w trybie standalone, aby wyci\u0105gn\u0105\u0107 te dane. <\/p>\n<p><\/p>\n<p>Dopiero po tym powinni\u015bmy podj\u0105\u0107 decyzj\u0119, czy mo\u017cemy te dane odrzuci\u0107, czy mo\u017cemy je odzyska\u0107, pod\u0142\u0105czy\u0107 ten w\u0119ze\u0142 jako replika do naszego klastra.<\/p>\n<p><\/p>\n<p>Opr\u00f3cz tego istnieje parametr \u201emaximum_lag_on_failover\u201d. Domy\u015blnie, je\u015bli dobrze pami\u0119tam, ten parametr ma warto\u015b\u0107 1 megabajt. <\/p>\n<p><\/p>\n<p>Jak to dzia\u0142a? Je\u015bli nasza replika sp\u00f3\u017ania si\u0119 o 1 megabajt danych w lagach replikacyjnych, to ta replika nie bierze udzia\u0142u w wyborach. A je\u015bli nagle dojdzie do failoveru, Patroni sprawdza, kt\u00f3re repliki si\u0119 sp\u00f3\u017aniaj\u0105. Je\u015bli sp\u00f3\u017aniaj\u0105 si\u0119 o du\u017c\u0105 ilo\u015b\u0107 dziennik\u00f3w transakcji, nie mog\u0105 sta\u0107 si\u0119 masterem. To bardzo dobra funkcja ochronna, kt\u00f3ra pozwala nie utraci\u0107 wielu danych. <\/p>\n<p><\/p>\n<p>Istnieje jednak problem, poniewa\u017c lag replikacji w klastrze Patroni i DCS jest aktualizowany w okre\u015blonych odst\u0119pach czasu. Wed\u0142ug mnie domy\u015blna warto\u015b\u0107 ttl wynosi 30 sekund.<\/p>\n<p><\/p>\n<p>Mo\u017ce zdarzy\u0107 si\u0119 sytuacja, w kt\u00f3rej op\u00f3\u017anienie replikacji dla replik w DCS jest jedno, a w rzeczywisto\u015bci mo\u017ce by\u0107 zupe\u0142nie inne op\u00f3\u017anienie lub wr\u0119cz nie ma \u017cadnego op\u00f3\u017anienia, tzn. to rozwi\u0105zanie nie jest w czasie rzeczywistym. I nie zawsze odzwierciedla rzeczywist\u0105 sytuacj\u0119. Nie warto na tym opiera\u0107 skomplikowanej logiki. <\/p>\n<p><\/p>\n<p>Ryzyko utraty danych zawsze istnieje. W najgorszym przypadku jedna formu\u0142a, a w przeci\u0119tnym przypadku inna formu\u0142a. Tzn. kiedy planujemy wdro\u017cenie Patroni i oceniamy, ile danych mo\u017cemy straci\u0107, musimy si\u0119 opiera\u0107 na tych formu\u0142ach i mniej wi\u0119cej przewidywa\u0107, ile danych mo\u017cemy straci\u0107. <\/p>\n<p><\/p>\n<p>Dobra wiadomo\u015b\u0107 jest taka, \u017ce kiedy stary master odszed\u0142 do przodu, m\u00f3g\u0142 si\u0119 do przodu przesun\u0105\u0107 dzi\u0119ki pewnym procesom w tle. Tzn. uruchomi\u0142 si\u0119 jaki\u015b auto-wakum, zapisa\u0142 dane, zachowa\u0142 je w dzienniku transakcji. I te dane mo\u017cemy swobodnie ignorowa\u0107 i straci\u0107. Nie ma w tym \u017cadnego problemu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a86e8971ab4ef41b89af9cf0bdf519ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tak wygl\u0105daj\u0105 logi w przypadku, gdy ustawiono maximum_lag_on_failover i nast\u0105pi\u0142o prze\u0142\u0105czenie, i trzeba wybra\u0107 nowego mastera. Replika ocenia siebie jako niezdoln\u0105 do udzia\u0142u w wyborach. Odrzuca udzia\u0142 w wy\u015bcigu o lidera. Czeka, a\u017c zostanie wybrany nowy master, aby p\u00f3\u017aniej do niego do\u0142\u0105czy\u0107. To dodatkowy \u015brodek zapobiegaj\u0105cy utracie danych.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey 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=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/c32f26e7526e1873f3bfd7d3693fcc72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nasza zesp\u00f3\u0142 produktowy zg\u0142osi\u0142, \u017ce ich produkt ma problemy z dzia\u0142aniem na Postgresie. Przy tym dost\u0119p do samego mastera jest niemo\u017cliwy, poniewa\u017c jest niedost\u0119pny przez SSH. Auto-prze\u0142\u0105czenie te\u017c si\u0119 nie odbywa. <\/p>\n<p><\/p>\n<p>Ten host zosta\u0142 wymuszenie zrestartowany. W wyniku restartu dosz\u0142o do auto-prze\u0142\u0105czenia, chocia\u017c mo\u017cna by\u0142o zrobi\u0107 to r\u00f3wnie\u017c r\u0119cznie, jak teraz rozumiem. Po restarcie idziemy sprawdzi\u0107, co dzia\u0142o si\u0119 z naszym aktualnym masterem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/95efb82e0647a396a21683cd53a69547.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jednocze\u015bnie z g\u00f3ry wiedzieli\u015bmy, \u017ce mamy problemy z dyskami, tzn. ju\u017c po monitoringu wiedzieli\u015bmy, gdzie szuka\u0107 i co sprawdza\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/367aaab607d833d96a573ddbbbced502.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zag\u0142\u0119biali\u015bmy si\u0119 w logi Postgresa, zacz\u0119li\u015bmy obserwowa\u0107, co si\u0119 tam dzieje. Zobaczyli\u015bmy commity, kt\u00f3re trwa\u0142y tam po jednej, dwie, trzy sekundy, co zdecydowanie nie jest normalne. Zauwa\u017cyli\u015bmy, \u017ce auto-wakum uruchamia si\u0119 bardzo d\u0142ugo i dziwnie. Zobaczyli\u015bmy te\u017c pliki tymczasowe na dysku. Tzn. to wszystko s\u0105 oznaki problem\u00f3w z dyskami. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/7e0cfce7a81901ef9ef736c3fefc8dce.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przyjrzeli\u015bmy si\u0119 systemowemu dmesg (logom komunikat\u00f3w j\u0105dra). Zobaczyli\u015bmy, \u017ce mamy problemy z jednym z dysk\u00f3w. Podsystem dyskowy stanowi\u0142 oprogramowanie RAID. Spodziewali\u015bmy si\u0119 w \/proc\/mdstat, \u017ce brakuje nam jednego dysku. To znaczy, \u017ce w tej konfiguracji RAID z 8 dysk\u00f3w brakuje nam jednego. Przy bli\u017cszym przyjrzeniu si\u0119 slajdowi, w wyj\u015bciu mo\u017cna zauwa\u017cy\u0107, \u017ce brakuje tam sde. Mo\u017cna powiedzie\u0107, \u017ce dysk nam 'wypad\u0142'. To wyzwoli\u0142o problemy z dyskiem, a aplikacje r\u00f3wnie\u017c mia\u0142y trudno\u015bci w pracy z klastrem Postgresa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/4b09b3aa761cb504fa79173ef280faac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W tej sytuacji Patroni nie m\u00f3g\u0142by nam pom\u00f3c, poniewa\u017c nie ma zadania \u015bledzenia stanu serwera ani stanu dysku. Musimy takie sytuacje monitorowa\u0107 zewn\u0119trznie. Szybko dodali\u015bmy monitoring dysk\u00f3w do zewn\u0119trznego monitoringu. <\/p>\n<p><\/p>\n<p>Zrodzi\u0142a si\u0119 my\u015bl - czy mogliby nam pom\u00f3c fensting lub programowy watchdog? Zastanawiali\u015bmy si\u0119, \u017ce w tym przypadku raczej by nam nie pomog\u0142o, poniewa\u017c podczas problem\u00f3w Patroni nadal komunikowa\u0142 si\u0119 z klastrem DCS i nie zauwa\u017ca\u0142 \u017cadnych problem\u00f3w. Z punktu widzenia DCS i Patroni z klastrem wszystko by\u0142o w porz\u0105dku, chocia\u017c w rzeczywisto\u015bci by\u0142y problemy z dyskiem, a tak\u017ce problemy z dost\u0119pno\u015bci\u0105 bazy danych. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/15fdac78535355d4eb889efcc27efc46.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Moim zdaniem, to jeden z najdziwniejszych problem\u00f3w, kt\u00f3re bada\u0142em bardzo d\u0142ugo, przeczyta\u0142em bardzo du\u017co log\u00f3w i nazwa\u0142em go klastrem-symulantem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/b5259774931c290eda6673deb14b6c48.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Problem polega\u0142 na tym, \u017ce stary master nie m\u00f3g\u0142 sta\u0107 si\u0119 normaln\u0105 replik\u0105, to znaczy Patroni go uruchamia\u0142, Patroni wskazywa\u0142, \u017ce ten w\u0119ze\u0142 wyst\u0119puje jako replika, ale jednocze\u015bnie nie by\u0142 normaln\u0105 replik\u0105. Teraz zobaczycie, dlaczego. To mi zosta\u0142o z analizy tego problemu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/c35a5d102a46764bbf96e5a75ee88171.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I od czego to wszystko si\u0119 zacz\u0119\u0142o? Zacz\u0119\u0142o si\u0119, jak w poprzednim problemie, od zastoju dysk\u00f3w. Mieli\u015bmy po jednej, dwie komendy na sekund\u0119. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/435c1b350a89f288e0e10ca9d5a2ec6e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>By\u0142y zerwania po\u0142\u0105cze\u0144, to znaczy klienci przerywali. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/920cb1f3f3b40578e15e6ff711e85c50.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>By\u0142y blokady o r\u00f3\u017cnym nasileniu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/285d6292d89b928a85e95602ee57d38a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I, co za tym idzie, podsystem dyskowy nie by\u0142 zbyt responsywny. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/ebe71d49360e7f604ecd6a3c8276cb73.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Najbardziej tajemnicze dla mnie to przychodz\u0105ce natychmiastowe \u017c\u0105danie wy\u0142\u0105czenia. Postgres ma trzy tryby wy\u0142\u0105czania:<\/p>\n<p><\/p>\n<ul>\n<li>To graceful, kiedy czekamy, a\u017c wszyscy klienci samodzielnie si\u0119 roz\u0142\u0105cz\u0105. <\/li>\n<li>Jest fast, kiedy zmuszamy klient\u00f3w do roz\u0142\u0105czenia, poniewa\u017c idziemy na wy\u0142\u0105czenie. <\/li>\n<li>I immediate. In this case, immediate does not even inform clients to disconnect; it just shuts down without warning. All clients receive a message from the operating system: RST (TCP message, indicating that the connection has been interrupted and the client has nothing more to catch). <\/li>\n<\/ul>\n<p><\/p>\n<p>Who sent this signal? Background Postgres processes do not send such signals to each other, i.e., this is a kill-9. They do not send such signals to each other; they only react to them, meaning this is an emergency restart of Postgres. I do not know who sent it. <\/p>\n<p><\/p>\n<p>I looked at the 'last' command and saw one person who also logged into this server with us, but I hesitated to ask the question. Perhaps this was a kill -9. I would have seen kill -9 in the logs, as Postgres indicates that it received a kill -9, but I did not see this in the logs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/fe8e844649cea3384ebfde86e36eba44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Digging further, I noticed that Patroni had not written to the log for quite a long time \u2013 54 seconds. And if we compare the two timestamps, there were approximately 54 seconds with no messages. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/ffb1c4db3d7de591d77d56ed2fcc4f2a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>During this time, an auto-failover occurred. Patroni worked flawlessly again. Our old master was unavailable, something was happening with it. New leader elections began. Everything worked well here. Our pgsql01 became the new leader. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/6b2457653e9f77af44cd64b4aff021a0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>We have a replica that became the master. And there is a second replica. And there were problems with the second replica. It was trying to reconfigure itself. As I understand it, it was trying to change recovery.conf, restart Postgres, and connect to the new master. Every 10 seconds, it writes messages that it is trying, but it is unsuccessful. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/381818f189e19c3e1154074b4652f837.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>And during these attempts, the old master received an immediate-shutdown signal. The master restarts. And recovery also stops because the old master is rebooting. That is, the replica cannot connect to it because it is in shut down mode. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/d8a8cde925fa8fe601d44ab908ae69dc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>At some point, it worked, but replication did not start. <\/p>\n<p><\/p>\n<p>I have a single hypothesis that the recovery.conf contained the address of the old master. And when the new master appeared, the second replica was still trying to connect to the old master. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/425ea3af1f1e186f4760e1fb1f5419fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>When Patroni started on the second replica, the node started up but could not connect via replication. And a replication lag was formed, which looked something like this. That is, all three nodes were present, but the second node was lagging. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/f564eacd9944666c9a3f5bea634ede6b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jednak patrz\u0105c na zapisy w logach, mo\u017cna by\u0142o zobaczy\u0107, \u017ce replikacja nie mo\u017ce si\u0119 uruchomi\u0107, poniewa\u017c dzienniki transakcji si\u0119 r\u00f3\u017cni\u0105. Te dzienniki transakcji, kt\u00f3re proponuje master, wskazane w recovery.conf, po prostu nie pasuj\u0105 do naszego obecnego w\u0119z\u0142a. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/6b09947d157c9ef0a190da2df2cb5892.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I tutaj pope\u0142ni\u0142em b\u0142\u0105d. Powinienem by\u0142 sprawdzi\u0107, co znajduje si\u0119 w recovery.conf, aby zweryfikowa\u0107 moj\u0105 hipotez\u0119, \u017ce \u0142\u0105czymy si\u0119 z niew\u0142a\u015bciwym masterem. Ale wtedy dopiero zaczyna\u0142em z tym i nie przysz\u0142o mi to do g\u0142owy, albo zauwa\u017cy\u0142em, \u017ce replikacja si\u0119 op\u00f3\u017ania i trzeba b\u0119dzie j\u0105 prze\u0142adowa\u0107, czyli jako\u015b na to wpad\u0142em z lenistwa. To by\u0142a moja wina. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/159f2256fd81428fd0d82a255528887d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po 30 minutach przyszed\u0142 administrator, tzn. zrestartowa\u0142em Patroni na replikacji. Ju\u017c postawi\u0142em na niej krzy\u017cyk, my\u015bla\u0142em, \u017ce trzeba b\u0119dzie j\u0105 prze\u0142adowa\u0107. I pomy\u015bla\u0142em \u2013 zrestartuj\u0119 Patroni, mo\u017ce co\u015b dobrego z tego wyjdzie. Aktywowano recovery. I baza nawet si\u0119 otworzy\u0142a, by\u0142a gotowa przyjmowa\u0107 po\u0142\u0105czenia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/aeac98750386c8389d39e006a229cc85.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Replikacja wystartowa\u0142a. Ale po minucie odpad\u0142a z b\u0142\u0119dem, \u017ce nie pasuj\u0105 do niej dzienniki transakcji. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/17eaba000a79c80c29d1bc3902de05e6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pomy\u015bla\u0142em, \u017ce spr\u00f3buj\u0119 jeszcze raz zrestartowa\u0107. Zrestartowa\u0142em jeszcze raz Patroni, przy czym nie restartowa\u0142em Postgresa, a w\u0142a\u015bnie Patroni, maj\u0105c nadziej\u0119, \u017ce w magiczny spos\u00f3b uruchomi baz\u0119. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a85b38e033c45ad73da317f41e0ef24a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Replikacja znowu wystartowa\u0142a, ale znaczniki w dzienniku transakcji si\u0119 r\u00f3\u017cni\u0142y, by\u0142y inne ni\u017c te przy poprzedniej pr\u00f3bie uruchomienia. Replikacja znowu si\u0119 zatrzyma\u0142a. I komunikat by\u0142 ju\u017c troch\u0119 inny. I nie by\u0142 dla mnie szczeg\u00f3lnie informacyjny. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/fd90d708230bd54af685786c7e361ee1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I wtedy przesz\u0142o mi przez my\u015bl \u2013 a co je\u015bli zrestartuj\u0119 Postgresa, a w tym czasie na bie\u017c\u0105cym masterze zrobi\u0119 checkpoint, aby przesun\u0105\u0107 punkt w dzienniku transakcji troch\u0119 do przodu, \u017ceby recovery rozpocz\u0119\u0142o si\u0119 z innego momentu? Dodatkowo mieli\u015bmy te\u017c zapasy WAL. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/19e67f95d1a74141a013947c9aa39e38.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zrestartowa\u0142em Patroni, zrobi\u0142em kilka checkpoint\u00f3w na masterze, kilka punkt\u00f3w restartowych na replikacji, kiedy si\u0119 otworzy\u0142a. I to pomog\u0142o. D\u0142ugo my\u015bla\u0142em, dlaczego to pomog\u0142o i jak to zadzia\u0142a\u0142o. I replikacja wystartowa\u0142a. I replikacja nie przerywa\u0142a si\u0119 ju\u017c wi\u0119cej. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/418ca59a681be84f51ed374a73a759c9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Taki problem jest dla mnie jednym z bardziej zagadkowych, nad kt\u00f3rym nadal si\u0119 zastanawiam, co tak naprawd\u0119 si\u0119 tam dzia\u0142o. <\/p>\n<p><\/p>\n<p>Jakie wnioski mo\u017cna tutaj wyci\u0105gn\u0105\u0107? Patroni mo\u017ce dzia\u0142a\u0107 zgodnie z zamys\u0142em i bez \u017cadnych b\u0142\u0119d\u00f3w. Ale to nie jest 100% gwarancj\u0105, \u017ce wszystko u nas jest w porz\u0105dku. Replika mo\u017ce ruszy\u0107, ale mo\u017ce by\u0107 w p\u00f3\u0142-roboczym stanie, a aplikacja nie powinna korzysta\u0107 z takiej repliki, poniewa\u017c b\u0119d\u0105 tam stare dane. <\/p>\n<p><\/p>\n<p>I po failoverze zawsze trzeba sprawdzi\u0107, czy wszystko w porz\u0105dku z klastrem, tzn. czy jest odpowiednia liczba replik, a tak\u017ce czy nie ma op\u00f3\u017anienia w replikacji.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/aca7047ff33d3efe14071b798b554091.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I w trakcie rozwa\u017cania tych problem\u00f3w sformu\u0142uj\u0119 rekomendacje. Pr\u00f3bowa\u0142em je po\u0142\u0105czy\u0107 w dwa slajdy. Prawdopodobnie wszystkie historie mo\u017cna by z\u0142\u0105czy\u0107 w dwa slajdy i tylko je opowiedzie\u0107.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/d4ad31b26d83c8846fe4097a11d70849.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kiedy u\u017cywasz Patroni, musisz mie\u0107 monitoring. Zawsze powiniene\u015b wiedzie\u0107, kiedy nast\u0105pi\u0142 auto-failover, poniewa\u017c je\u015bli nie wiesz, \u017ce mia\u0142e\u015b auto-failover, nie kontrolujesz klastra. I to jest z\u0142e.<\/p>\n<p><\/p>\n<p>Po ka\u017cdym failoverze zawsze musimy r\u0119cznie sprawdzi\u0107 klaster. Musimy upewni\u0107 si\u0119, \u017ce zawsze mamy aktualn\u0105 liczb\u0119 replik, nie ma op\u00f3\u017anienia w replikacji, a w logach nie ma b\u0142\u0119d\u00f3w zwi\u0105zanych z replikacj\u0105 strumieniow\u0105, z Patroni, z systemem DCS.<\/p>\n<p><\/p>\n<p>Automatyka mo\u017ce dzia\u0142a\u0107 skutecznie, Patroni to bardzo dobre narz\u0119dzie. Mo\u017ce dzia\u0142a\u0107, ale to nie doprowadzi klastra do wymaganego stanu. A je\u015bli si\u0119 o tym nie dowiemy, b\u0119d\u0105 mieli\u015bmy problemy.<\/p>\n<p><\/p>\n<p>I Patroni to nie srebrna kula. Wci\u0105\u017c musimy mie\u0107 poj\u0119cie, jak dzia\u0142a Postgres, jak dzia\u0142a replikacja oraz jak Patroni wsp\u00f3\u0142dzia\u0142a z Postgres i jak odbywa si\u0119 interakcja mi\u0119dzy w\u0119z\u0142ami. To jest potrzebne, aby m\u00f3c r\u0119cznie naprawia\u0107 wyst\u0119puj\u0105ce problemy.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/ea4162df3561d2ea7001f2ef6788eaaa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak podchodz\u0119 do diagnostyki? U\u0142o\u017cy\u0142o si\u0119 tak, \u017ce pracujemy z r\u00f3\u017cnymi klientami, a nikt nie ma stosu ELK, wi\u0119c musz\u0119 grzeba\u0107 w logach, otwieraj\u0105c 6 konsol i 2 zak\u0142adki. W jednej zak\u0142adce s\u0105 logi Patroni dla ka\u017cdego w\u0119z\u0142a, w drugiej zak\u0142adce \u2013 logi Consul lub Postgres w razie potrzeby. Diagnozowanie tego jest bardzo trudne. <\/p>\n<p><\/p>\n<p>Jakie podej\u015bcia wypracowa\u0142em? Po pierwsze, zawsze patrz\u0119, kiedy nast\u0105pi\u0142 failover. Dla mnie to jest pewien punkt zwrotny. Patrz\u0119, co si\u0119 wydarzy\u0142o przed failoverem, w trakcie failovera i po failoverze. Failover ma dwie znaczniki: to czas rozpocz\u0119cia i zako\u0144czenia. <\/p>\n<p><\/p>\n<p>Nast\u0119pnie w logach przegl\u0105dam zdarzenia przed failoverem, co mu towarzyszy\u0142o, tj. szukam przyczyn, dlaczego nast\u0105pi\u0142 failover. <\/p>\n<p><\/p>\n<p>Daje to obraz zrozumienia, co si\u0119 wydarzy\u0142o i co mo\u017cna zrobi\u0107 w przysz\u0142o\u015bci, aby takie okoliczno\u015bci nie mia\u0142y miejsca (a tym samym aby failover si\u0119 nie zdarzy\u0142).<\/p>\n<p><\/p>\n<p>I gdzie zwykle patrzymy? Patrz\u0119:<\/p>\n<p><\/p>\n<ul>\n<li>Najpierw w logi Patroni. <\/li>\n<li>Nast\u0119pnie przegl\u0105dam logi Postgres lub logi DCS, w zale\u017cno\u015bci od tego, co znalaz\u0142em w logach Patroni. <\/li>\n<li>Czasami logi systemowe r\u00f3wnie\u017c daj\u0105 zrozumienie, co by\u0142o przyczyn\u0105 failoveru. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/a53618e366020e1a550d852fc308c188.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak odnosz\u0119 si\u0119 do Patroni? Patrz\u0119 na Patroni bardzo pozytywnie. Moim zdaniem, to najlepsze, co obecnie istnieje. Znam wiele innych produkt\u00f3w. To Stolon, Repmgr, Pg_auto_failover, PAF. 4 narz\u0119dzia. Pr\u00f3bowa\u0142em ich wszystkich. Patroni spodoba\u0142 mi si\u0119 najbardziej. <\/p>\n<p><\/p>\n<p>Je\u015bli mnie zapytaj\u0105: \u201eCzy polecam Patroni?\u201d. Powiem, \u017ce tak, poniewa\u017c lubi\u0119 Patroni. I wydaje mi si\u0119, \u017ce nauczy\u0142em si\u0119 go dobrze obs\u0142ugiwa\u0107. <\/p>\n<p><\/p>\n<p>Je\u015bli jeste\u015b ciekawy, jakie inne problemy mog\u0105 wyst\u0105pi\u0107 z Patroni, opr\u00f3cz tych, kt\u00f3re wymieni\u0142em, zawsze mo\u017cesz przej\u015b\u0107 na stron\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\/issues\/\">issues<\/a><\/noindex> na GitHubie. Jest tam wiele r\u00f3\u017cnych historii i omawiane s\u0105 ciekawe problemy. W rezultacie zg\u0142oszono i rozwi\u0105zano niekt\u00f3re b\u0142\u0119dy, tj. to interesuj\u0105ca lektura. <\/p>\n<p><\/p>\n<p>S\u0105 tam ciekawe historie o tym, jak ludzie strzelaj\u0105 sobie w stop\u0119. Bardzo pouczaj\u0105ce. Czytasz i rozumiesz, \u017ce tak nie nale\u017cy robi\u0107. Postawi\u0142em sobie znacznik. <\/p>\n<p><\/p>\n<p>Chcia\u0142bym serdecznie podzi\u0119kowa\u0107 firmie Zalando za wspieranie tego projektu, a szczeg\u00f3lnie Aleksandrowi Kuku\u015bkinowi i Siergiejowi Kliukinowi. Siergiej Kliukin to jeden z wsp\u00f3\u0142autor\u00f3w, nie pracuje ju\u017c w Zalando, ale to s\u0105 dwie osoby, kt\u00f3re zaczyna\u0142y pracowa\u0107 z tym produktem. <\/p>\n<p><\/p>\n<p>Uwa\u017cam, \u017ce Patroni to bardzo fajna rzecz. Ciesz\u0119 si\u0119, \u017ce istnieje, jest z ni\u0105 ciekawie. I wielkie dzi\u0119ki wszystkim wsp\u00f3\u0142tw\u00f3rcom, kt\u00f3rzy pisz\u0105 poprawki do Patroni. Mam nadziej\u0119, \u017ce Patroni z wiekiem stanie si\u0119 bardziej dojrza\u0142y, \u015bwietny i wydajny. Ju\u017c teraz jest wydajny, ale mam nadziej\u0119, \u017ce b\u0119dzie jeszcze lepszy. Dlatego je\u015bli planujesz wdro\u017cy\u0107 Patroni, nie b\u00f3j si\u0119. To dobre rozwi\u0105zanie, kt\u00f3re mo\u017cna wdra\u017ca\u0107 i u\u017cywa\u0107. <\/p>\n<p><\/p>\n<p>To wszystko. Je\u015bli masz jakie\u015b pytania, pytaj.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historie awarii Patroni, czyli jak zrujnowa\u0107 sw\u00f3j klaster PostgreSQL. Aleksey Lesovskiy\" src=\"\/wp-content\/uploads\/2020\/07\/85c2fef2455999b48413c9fc3b235ed6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pytania<\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za prezentacj\u0119! Je\u015bli po failoverze i tak musisz tam dok\u0142adnie zajrze\u0107, to po co nam automatyczny failover?<\/em> <\/p>\n<p><\/p>\n<p>Poniewa\u017c to nowa rzecz. Pracujemy z ni\u0105 dopiero od roku. Lepiej by\u0107 ostro\u017cnym. Chcemy zajrze\u0107 i upewni\u0107 si\u0119, \u017ce wszystko dzia\u0142a tak, jak powinno. To poziom doros\u0142ego niedowiarstwa \u2013 lepiej znowu to sprawdzi\u0107 i zobaczy\u0107. <\/p>\n<p><\/p>\n<p><em>Na przyk\u0142ad, weszli\u015bmy rano i sprawdzili\u015bmy, tak?<\/em><\/p>\n<p><\/p>\n<p>Nie rano, zwykle dowiadujemy si\u0119 o auto-failoverze prawie natychmiast. Otrzymujemy powiadomienia, widzimy, \u017ce wyst\u0105pi\u0142 auto-failover. Prawie natychmiast wchodzimy i sprawdzamy. Ale wszystkie te kontrole powinny by\u0107 przeprowadzone na poziomie monitorowania. Je\u015bli odwo\u0142ujemy si\u0119 do Patroni za pomoc\u0105 REST API, jest historia. Na podstawie historii mo\u017cna sprawdzi\u0107 znaczniki czasowe, kiedy wyst\u0105pi\u0142 failover. Na tej podstawie mo\u017cna zrobi\u0107 monitoring. Mo\u017cna sprawdzi\u0107 histori\u0119, ile tam by\u0142o zdarze\u0144. Je\u015bli liczba zdarze\u0144 wzros\u0142a, to znaczy, \u017ce wyst\u0105pi\u0142 auto-failover. Mo\u017cna przej\u015b\u0107 i sprawdzi\u0107. Albo nasza automatyka w monitorowaniu sprawdzi\u0142a, \u017ce wszystkie nasze repliki s\u0105 na miejscu, nie ma op\u00f3\u017anie\u0144 i wszystko jest w porz\u0105dku. <\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119!<\/em><\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 bardzo za wspania\u0142\u0105 opowie\u015b\u0107! Je\u015bli przenie\u015bli\u015bmy klaster DCS w jakie\u015b odleg\u0142e miejsce od klastra Postgres, to czy ten klaster te\u017c trzeba okresowo obs\u0142ugiwa\u0107? Jakie s\u0105 najlepsze praktyki dotycz\u0105ce wy\u0142\u0105czania niekt\u00f3rych segment\u00f3w klastra DCS, co trzeba z nimi robi\u0107 itd.? Jak w tym czasie funkcjonuje ca\u0142a ta konstrukcja? I w jaki spos\u00f3b te rzeczy robi\u0107?<\/em><\/p>\n<p><\/p>\n<p>Dla jednej firmy trzeba by\u0142o stworzy\u0107 macierz problem\u00f3w, co si\u0119 dzieje, je\u015bli kt\u00f3rykolwiek z komponent\u00f3w lub kilka komponent\u00f3w ulega awarii. Na podstawie tej macierzy kolejno przegl\u0105damy wszystkie komponenty i tworzymy scenariusze w przypadku awarii tych komponent\u00f3w. Odpowiednio na ka\u017cdy scenariusz awarii mo\u017cna mie\u0107 plan dzia\u0142ania na rzecz naprawy. I w przypadku DCS jest to cz\u0119\u015b\u0107 standardowej infrastruktury. Administrator to administrowa\u0142, a my polegamy na administratorach, kt\u00f3rzy to zarz\u0105dzaj\u0105 i na jego zdolno\u015bci do naprawy w przypadku awarii. Je\u015bli DCS w og\u00f3le nie istnieje, to go wdra\u017camy, ale nie monitorujemy go szczeg\u00f3lnie, poniewa\u017c nie odpowiadamy za infrastruktur\u0119, ale dajemy zalecenia jak i co monitorowa\u0107. <\/p>\n<p><\/p>\n<p><em>To znaczy, czy dobrze rozumiem, \u017ce nale\u017cy wy\u0142\u0105czy\u0107 Patroni, wy\u0142\u0105czy\u0107 failover, wy\u0142\u0105czy\u0107 wszystko przed podj\u0119ciem jakichkolwiek dzia\u0142a\u0144 z hostami?<\/em><\/p>\n<p><\/p>\n<p>To zale\u017cy od tego, ile w\u0119z\u0142\u00f3w mamy w klastrze DCS. Je\u015bli jest ich du\u017co i w przypadku awarii tylko jednego z w\u0119z\u0142\u00f3w (replik), to klaster zachowuje quorum. Patroni pozostaje wtedy sprawny i nic si\u0119 nie uruchamia. Je\u015bli mamy jakie\u015b skomplikowane operacje, kt\u00f3re anga\u017cuj\u0105 wi\u0119cej w\u0119z\u0142\u00f3w, kt\u00f3rych brak mo\u017ce zburzy\u0107 quorum, to tak, by\u0107 mo\u017ce warto, aby Patroni zosta\u0142 wstrzymany. Ma na to odpowiedni\u0105 komend\u0119 \u2013 patronictl pause, patronictl resume. Po prostu wstrzymujemy, a autofailover w tym czasie si\u0119 nie uruchamia. Wykonujemy prace konserwacyjne na klastrze DCS, potem wznawiamy i kontynuujemy prac\u0119.<\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 bardzo!<\/em><\/p>\n<p><\/p>\n<p><em>Bardzo dzi\u0119kuj\u0119 za referat! Jak zesp\u00f3\u0142 produktowy odnosi si\u0119 do ryzyka utraty danych?<\/em> <\/p>\n<p><\/p>\n<p>Zespo\u0142y produktowe si\u0119 tym nie przejmuj\u0105, ale liderzy zespo\u0142u si\u0119 martwi\u0105. <\/p>\n<p><\/p>\n<p><em>Jakie s\u0105 tam gwarancje?<\/em><\/p>\n<p><\/p>\n<p>Z gwarancjami jest bardzo trudno. Jest referat Aleksandra Kuku\u015bkina \u201eJak oblicza\u0107 RPO i RTO\u201d, tzn. czas odzyskiwania i ile danych mo\u017cemy straci\u0107. My\u015bl\u0119, \u017ce warto znale\u017a\u0107 te slajdy i je przeanalizowa\u0107. O ile pami\u0119tam, s\u0105 tam konkretne kroki do obliczenia tych parametr\u00f3w. Ile transakcji mo\u017cemy straci\u0107, ile danych mo\u017cemy utraci\u0107. Mo\u017cemy rozwa\u017cy\u0107 u\u017cycie synchronnej replikacji na poziomie Patroni, ale to miecz obosieczny: albo mamy niezawodno\u015b\u0107 danych, albo tracimy na szybko\u015bci. Jest synchronna replikacja, ale te\u017c nie gwarantuje 100% ochrony przed utrat\u0105 danych.<\/p>\n<p><\/p>\n<p><em>Alekseju, dzi\u0119kuj\u0119 za wspania\u0142y referat! Czy masz do\u015bwiadczenie z u\u017cywaniem Patroni do ochrony zerowego poziomu? Tzn. w po\u0142\u0105czeniu z synchronnym standby? To pierwsze pytanie. A drugie pytanie. Korzystali\u015bcie z r\u00f3\u017cnych rozwi\u0105za\u0144. U\u017cywali\u015bmy Repmgr, ale bez autofailovera i teraz planujemy w\u0142\u0105czy\u0107 autofailover. Rozwa\u017camy Patroni jako alternatywne rozwi\u0105zanie. Co mo\u017cesz powiedzie\u0107 o zaletach w por\u00f3wnaniu do Repmgr?<\/em><\/p>\n<p><\/p>\n<p>Pierwsze pytanie dotyczy\u0142o synchronnych replik. Nikt u nas nie u\u017cywa synchronnej replikacji, bo wszyscy si\u0119 boj\u0105 (ju\u017c kilku klient\u00f3w j\u0105 stosuje, generalnie nie zauwa\u017cyli problem\u00f3w z wydajno\u015bci\u0105 - <em>Notatka prelegenta<\/em>). Jednak\u017ce, ustalili\u015bmy zasad\u0119, \u017ce w klastrze synchronnej replikacji powinny by\u0107 minimum trzy w\u0119z\u0142y, poniewa\u017c je\u015bli mamy dwa w\u0119z\u0142y i je\u015bli master lub replika zawiod\u0105, Patroni przekszta\u0142ca ten w\u0119ze\u0142 w tryb Standalone, aby aplikacja mog\u0142a nadal dzia\u0142a\u0107. W tym przypadku istnieje ryzyko utraty danych.<\/p>\n<p><\/p>\n<p>W odniesieniu do drugiego pytania, u\u017cywali\u015bmy Repmgr i wci\u0105\u017c go stosujemy u niekt\u00f3rych klient\u00f3w z powod\u00f3w historycznych. Co mo\u017cna powiedzie\u0107? W Patroni autofailover jest dost\u0119pny od razu, w Repmgr autofailover jest dodatkiem, kt\u00f3ry trzeba aktywowa\u0107. Musimy uruchomi\u0107 demon Repmgr na ka\u017cdym w\u0119\u017ale, aby m\u00f3c skonfigurowa\u0107 autofailover. <\/p>\n<p><\/p>\n<p>Repmgr sprawdza, czy w\u0119z\u0142y Postgres s\u0105 aktywne. Procesy Repmgr sprawdzaj\u0105 istnienie siebie nawzajem, co nie jest zbyt efektywnym podej\u015bciem, poniewa\u017c mog\u0105 wyst\u0105pi\u0107 skomplikowane przypadki izolacji sieciowej, przez co du\u017cy klaster Repmgr mo\u017ce si\u0119 rozpa\u015b\u0107 na kilka mniejszych i kontynuowa\u0107 dzia\u0142anie. Od d\u0142u\u017cszego czasu nie obserwuj\u0119 Repmgr, mo\u017ce to naprawili... a mo\u017ce nie. Natomiast wyodr\u0119bnienie informacji o stanie klastra do DCS, jak robi\u0105 Stolon i Patroni, to naj\u017cywotniejsza opcja. <\/p>\n<p><\/p>\n<p><em>Alieksiej, mam pytanie, mo\u017ce nieco naiwne. W jednym z pierwszych przyk\u0142ad\u00f3w DCS przenie\u015bli\u015bcie z lokalnej maszyny na zdalny w\u0119ze\u0142. Rozumiemy, \u017ce sie\u0107 to rzecz, kt\u00f3ra ma swoje specyfiki, \u017cyje samodzielnie. Co si\u0119 stanie, je\u015bli z jakiego\u015b powodu klaster DCS stanie si\u0119 niedost\u0119pny? Nie b\u0119d\u0119 m\u00f3wi\u0142 o przyczynach, mo\u017ce ich by\u0107 wiele: od z\u0142ej pracy sieciowc\u00f3w po realne problemy.<\/em> <\/p>\n<p><\/p>\n<p>Nie powiedzia\u0142em tego na g\u0142os, ale klaster DCS powinien by\u0107 r\u00f3wnie\u017c odporny na awarie, tj. musi mie\u0107 nieparzyst\u0105 liczb\u0119 w\u0119z\u0142\u00f3w, aby mo\u017cna by\u0142o osi\u0105gn\u0105\u0107 kworum. Co si\u0119 stanie, je\u015bli klaster DCS stanie si\u0119 niedost\u0119pny lub nie mo\u017cna osi\u0105gn\u0105\u0107 kworum, t.j. jaki\u015b podzia\u0142 sieciowy lub awaria w\u0119z\u0142\u00f3w? W tym przypadku klaster Patroni przechodzi w tryb tylko do odczytu. Klaster Patroni nie mo\u017ce okre\u015bli\u0107 stanu klastra ani co ma robi\u0107. Nie mo\u017ce po\u0142\u0105czy\u0107 si\u0119 z DCS i zapisa\u0107 tam nowego stanu klastra, dlatego ca\u0142y klaster przechodzi w tryb tylko do odczytu. Oczekuje na r\u0119czn\u0105 interwencj\u0119 operatora lub na przywr\u00f3cenie DCS.<\/p>\n<p><\/p>\n<p><em>M\u00f3wi\u0105c wprost, DCS staje si\u0119 dla nas us\u0142ug\u0105 r\u00f3wnie wa\u017cn\u0105, jak sama baza danych?<\/em><\/p>\n<p><\/p>\n<p>Tak, tak. W wielu nowoczesnych firmach Discovery us\u0142ug jest nieod\u0142\u0105czn\u0105 cz\u0119\u015bci\u0105 infrastruktury. Wprowadza si\u0119 go nawet wcze\u015bniej, zanim pojawi si\u0119 baza danych w infrastrukturze. M\u00f3wi\u0105c w skr\u00f3cie, uruchamia si\u0119 infrastruktur\u0119, rozbudowuje w centrum danych, a my natychmiast mamy Discovery us\u0142ug. Je\u015bli to jest Consul, to na nim mo\u017ce by\u0107 zbudowany tak\u017ce DNS. Je\u015bli to Etcd, mo\u017ce by\u0107 cz\u0119\u015bci\u0105 klastra Kubernetes, w kt\u00f3rym b\u0119dzie ju\u017c wszystko inne rozbudowywane. Uwa\u017cam, \u017ce Discovery us\u0142ug jest ju\u017c nieod\u0142\u0105czn\u0105 cz\u0119\u015bci\u0105 nowoczesnych infrastruktur. My\u015bl\u0105 o tym znacznie wcze\u015bniej, ni\u017c o bazach danych. <\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119!<\/em><\/p>\n<p>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Historie o awariach Patroni lub jak zablokowa\u0107 swoj\u0105 klaster PostgreSQL. Aleksiej Lesowski | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/90103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=90103"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/90103\/revisions"}],"predecessor-version":[{"id":158759,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/90103\/revisions\/158759"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/90104"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=90103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=90103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=90103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}