{"id":81089,"date":"2020-05-11T01:42:24","date_gmt":"2020-05-10T23:42:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/tipovye-oshibki-v-prilozheniyah-kotorye-vedut-k-bloat-v-postgresql-andrej-salnikov"},"modified":"2020-05-11T01:42:24","modified_gmt":"2020-05-10T23:42:24","slug":"tipovye-oshibki-v-prilozheniyah-kotorye-vedut-k-bloat-v-postgresql-andrej-salnikov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/tipovye-oshibki-v-prilozheniyah-kotorye-vedut-k-bloat-v-postgresql-andrej-salnikov","title":{"rendered":"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Javaslom, hogy ismerkedjen meg Andrej Szalnyikov 2016 eleji el\u0151ad\u00e1s\u00e1nak a \"Tipikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a PostgreSQL-ben\" c\u00edm\u0171 jelent\u00e9s\u00e9nek a leirat\u00e1val.<\/strong><\/p>\n<p><\/p>\n<p>Ebben az el\u0151ad\u00e1sban a leggyakoribb hib\u00e1kat fogom elemezni, amelyek a tervez\u00e9si \u00e9s a k\u00f3dol\u00e1si szakaszban el\u0151fordulnak. Csak azokat a hib\u00e1kat emelem ki, amelyek bloat-ot okoznak a PostgreSQL-ben. \u00c1ltal\u00e1ban ezek a teljes rendszer teljes\u00edtm\u00e9ny\u00e9nek kezdet\u00e9t jelentik, mik\u00f6zben kezdetben nem mutattak el\u0151jelet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/a9e199bfe2e01c76966b32868790f8f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>\u00d6r\u00f6mmel \u00fcdv\u00f6zl\u00f6k mindenkit! Ez az el\u0151ad\u00e1s nem annyira technikai, mint a koll\u00e9g\u00e1m el\u0151z\u0151je. Ez az el\u0151ad\u00e1s f\u0151k\u00e9nt a backend rendszerek fejleszt\u0151ire f\u00f3kusz\u00e1l, mivel nagy sz\u00e1m\u00fa \u00fcgyfel\u00fcnk van. Mindannyian ugyanazokat a hib\u00e1kat k\u00f6vetik el. Ezekr\u0151l fogok besz\u00e9lni. Elmagyar\u00e1zom, hogy ezek a hib\u00e1k milyen s\u00falyos k\u00f6vetkezm\u00e9nyekkel j\u00e1rhatnak. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/c6c84dbafc595ae3068cd8bf804ccee7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi\u00e9rt k\u00f6vetnek el hib\u00e1kat? K\u00e9t okb\u00f3l t\u00f6rt\u00e9nnek: el\u0151sz\u00f6r is, a szerencs\u00e9re t\u00e1maszkodva, h\u00e1tha m\u0171k\u00f6dik, illetve az ismeretlen mechanizmusok miatt, amelyek a rendszer \u00e9s az alkalmaz\u00e1s k\u00f6z\u00f6tt, valamint mag\u00e1ban az adatb\u00e1zisban zajlanak. <\/p>\n<p><\/p>\n<p>H\u00e1rom p\u00e9ld\u00e1t fogok bemutatni borzalmas grafik\u00e1kkal arr\u00f3l, hogyan t\u00f6rt\u00e9nt a roml\u00e1s. R\u00f6viden bemutatom a m\u00f6g\u00f6ttes mechanizmust, mi t\u00f6rt\u00e9nik, hogyan lehet kezelni a probl\u00e9m\u00e1kat, amikor felmer\u00fclnek, \u00e9s milyen megel\u0151z\u0151 m\u00f3dszereket \u00e9rdemes alkalmazni a hib\u00e1k elker\u00fcl\u00e9s\u00e9re. Besz\u00e9lek a seg\u00e9deszk\u00f6z\u00f6kr\u0151l is, \u00e9s hasznos linkeket adok. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/b0230d992f5b44f0e542df2e4b4d526f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tesztadatb\u00e1zist haszn\u00e1ltam, amelyben k\u00e9t t\u00e1bla volt. Az egyik a klienti sz\u00e1ml\u00e1kat, a m\u00e1sik pedig a sz\u00e1ml\u00e1khoz kapcsol\u00f3d\u00f3 tranzakci\u00f3kat tartalmazza. Valamilyen id\u0151k\u00f6z\u00f6nk\u00e9nt friss\u00edtj\u00fck ezeken a sz\u00e1ml\u00e1kon a fennmarad\u00f3 \u00f6sszegeket.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/1d2a21278b095b07546e1bb870819dbf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A t\u00e1bl\u00e1zat kiindul\u00e1si adatai: el\u00e9g kicsi, 2 MB. Az adatb\u00e1zis \u00e9s a konkr\u00e9t t\u00e1bl\u00e1zat v\u00e1laszideje is nagyon j\u00f3. Az \u00e1tlagos terhel\u00e9s \u2013 2000 tranzakci\u00f3 m\u00e1sodpercenk\u00e9nt a t\u00e1bl\u00e1zaton.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/dea5a4b1ac7952f8cfed0e2e1cfc10dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez az el\u0151ad\u00e1s sor\u00e1n grafikonokat fogok bemutatni, hogy szeml\u00e9letes legyen, mi t\u00f6rt\u00e9nik. Mindig lesz k\u00e9t di\u00e1n grafikon. Az els\u0151 dia a szerveren zajl\u00f3 \u00e1ltal\u00e1nos esem\u00e9nyeket mutatja be. <\/p>\n<p><\/p>\n<p>Ebben a helyzetben val\u00f3ban l\u00e1tjuk, hogy a t\u00e1bl\u00e1zat kicsi m\u00e9ret\u0171. Az index is kicsi, 2 MB. Ez az els\u0151 grafikon balr\u00f3l. <\/p>\n<p><\/p>\n<p>A szerver \u00e1tlagos v\u00e1laszideje is stabil \u00e9s alacsony. Ez a jobb fels\u0151 grafikon. <\/p>\n<p><\/p>\n<p>A bal als\u00f3 grafikon a leghosszabb tranzakci\u00f3kat mutatja. L\u00e1tjuk, hogy a tranzakci\u00f3k gyorsan v\u00e9grehajt\u00f3dnak. Az autov\u00e1kum m\u00e9g nem m\u0171k\u00f6dik itt, mert ez egy kezdeti teszt volt. K\u00e9s\u0151bb m\u0171k\u00f6dni fog, \u00e9s hasznos lesz sz\u00e1munkra.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/9e9b46acd9a878ff70ca4a7850adff09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A m\u00e1sodik di\u00e1t mindig a vizsg\u00e1lt t\u00e1bl\u00e1zatnak szentelj\u00fck. Ebben a helyzetben folyamatosan friss\u00edtj\u00fck az \u00fcgyf\u00e9ln\u00e9l l\u00e9v\u0151 egyenlegeket. Azt l\u00e1tjuk, hogy az \u00e1tlagos v\u00e1laszid\u0151 a friss\u00edt\u00e9si m\u0171velethez el\u00e9g j\u00f3, kevesebb mint egy milliszekundum. L\u00e1tjuk azt is, hogy a processzor er\u0151forr\u00e1sai (ez a jobb fels\u0151 grafikon) egyenletesen \u00e9s viszonylag alacsonyan ker\u00fclnek felhaszn\u00e1l\u00e1sra. <\/p>\n<p><\/p>\n<p>A jobb als\u00f3 grafikon azt mutatja, hogy mennyi operat\u00edv \u00e9s diszk mem\u00f3ria \u00e1ll rendelkez\u00e9s\u00fcnkre, miel\u0151tt megkeress\u00fck a sz\u00fcks\u00e9ges sort, miel\u0151tt friss\u00edtj\u00fck. Az oper\u00e1ci\u00f3k sz\u00e1ma a t\u00e1bl\u00e1zaton \u2013 2000 m\u00e1sodpercenk\u00e9nt, ahogy az elej\u00e9n mondtam. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/84760d52716209b8dcfffb462c67a8e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s most trag\u00e9dia t\u00f6rt\u00e9nik. Valamilyen okb\u00f3l hossz\u00fa, elfeledett tranzakci\u00f3 l\u00e9p fel. Az okok \u00e1ltal\u00e1ban el\u00e9g ban\u00e1lisak: <\/p>\n<p><\/p>\n<ul>\n<li>Az egyik leggyakoribb ok, hogy a programk\u00f3dunk elkezdett kapcsolatba l\u00e9pni egy k\u00fcls\u0151 szolg\u00e1ltat\u00e1ssal. \u00c9s ez a szolg\u00e1ltat\u00e1s nem v\u00e1laszol. Azaz, megnyitottunk egy tranzakci\u00f3t, v\u00e1ltoz\u00e1st hajtottunk v\u00e9gre az adatb\u00e1zisban, \u00e9s elment\u00fcnk az alkalmaz\u00e1sb\u00f3l e-maileket olvasni vagy egy m\u00e1sik szolg\u00e1ltat\u00e1shoz l\u00e9trej\u00f6tt kapcsolat keretein bel\u00fcl, \u00e9s valamilyen okb\u00f3l nem v\u00e1laszol. \u00cdgy a munkamenet\u00fcnk egy olyan \u00e1llapotba ker\u00fcl, amelyb\u0151l nem tudjuk, mikor old\u00f3dik meg.<\/li>\n<li>A m\u00e1sik helyzet, amikor a k\u00f3dban valamilyen okb\u00f3l kiv\u00e9tel l\u00e9p fel. \u00c9s a kiv\u00e9telt nem kezelt\u00fck le a tranzakci\u00f3 bez\u00e1r\u00e1s\u00e1hoz. \u00cdgy egy l\u00f3g\u00f3 munkamenet\u00fcnk marad egy nyitott tranzakci\u00f3val. <\/li>\n<li>A harmadik pedig egy el\u00e9g gyakori eset: a rossz min\u0151s\u00e9g\u0171 k\u00f3d. N\u00e9h\u00e1ny keretrendszer megnyit egy tranzakci\u00f3t. Az l\u00f3g, \u00e9s lehet, hogy az alkalmaz\u00e1sban nem tudod, hogy l\u00f3g. <\/li>\n<\/ul>\n<p><\/p>\n<p>Mik ezek a dolgok, hov\u00e1 vezetnek? <\/p>\n<p><\/p>\n<p>Arra, hogy a t\u00e1bl\u00e1zatok \u00e9s indexek hirtelen megn\u0151nek. Ez \u00e9ppen az a bloat hat\u00e1s. Az adatb\u00e1zis sz\u00e1m\u00e1ra ez azt jelenti, hogy dr\u00e1mai m\u00f3don megn\u0151 az adatb\u00e1zis v\u00e1laszideje, n\u0151 a terhel\u00e9s az adatb\u00e1zis szerver\u00e9n. Ennek eredm\u00e9nyek\u00e9nt az alkalmaz\u00e1s szenvedni fog. Mert ha a k\u00f3dban 10 milliszekundumot k\u00f6lt\u00f6tt\u00e9l az adatb\u00e1zis lek\u00e9rdez\u00e9s\u00e9re, 10 milliszekundumot a logik\u00e1dra, akkor a funkci\u00f3 20 milliszekundum alatt v\u00e9gzett. Most viszont sokkal szomor\u00fabb helyzetbe ker\u00fclsz. <\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg, mi t\u00f6rt\u00e9nik. A bal als\u00f3 grafikon azt mutatja, hogy hossz\u00fa tranzakci\u00f3nk van. A bal fels\u0151 grafikonon pedig l\u00e1thatjuk, hogy a t\u00e1bl\u00e1zat m\u00e9rete k\u00e9t megab\u00e1jtr\u00f3l hirtelen h\u00e1romsz\u00e1z megab\u00e1jtra ugrik. Ek\u00f6zben az adatok mennyis\u00e9ge a t\u00e1bl\u00e1zatban v\u00e1ltozatlan maradt, teh\u00e1t ott sok a felesleges adat.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/b1947f6487e440a770a1251a955e62d2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az \u00e1ltal\u00e1nos helyzet a szerver \u00e1tlagos v\u00e1laszidej\u00e9vel is t\u00f6bb nagys\u00e1grendet v\u00e1ltozott. Azaz, az \u00f6sszes k\u00e9r\u00e9s a szerverhez jelent\u0151sen lelassult. Ek\u00f6zben a Postgres bels\u0151 folyamatai, mint p\u00e9ld\u00e1ul az automatikus takar\u00edt\u00e1s, elindultak, pr\u00f3b\u00e1lnak valamit tenni \u00e9s er\u0151forr\u00e1st fogyasztanak.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/8e91f035d1dd04e72e842d714cc611a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi t\u00f6rt\u00e9nik a t\u00e1bl\u00e1zatunkkal? Ugyanez. A t\u00e1bl\u00e1zat \u00e1tlagos v\u00e1laszideje t\u00f6bb nagys\u00e1grendet emelkedett. Ha konkr\u00e9tan az er\u0151forr\u00e1s-fogyaszt\u00e1sra n\u00e9z\u00fcnk, akkor azt l\u00e1tjuk, hogy jelent\u0151sen megn\u0151tt a processzorra nehezed\u0151 terhel\u00e9s. Ez a jobb fels\u0151 grafikon. Ennek oka, hogy a processzornak rengeteg felesleges sort kell \u00e1tn\u00e9znie, hogy megtal\u00e1lja az egy sz\u00fcks\u00e9geset. Ez a jobb als\u00f3 grafikon. Ennek eredm\u00e9nyek\u00e9nt a m\u00e1sodpercenk\u00e9nti h\u00edv\u00e1sok sz\u00e1ma szignifik\u00e1nsan cs\u00f6kkent, mert az adatb\u00e1zis nem k\u00e9pes azonos sz\u00e1m\u00fa k\u00e9r\u00e9s feldolgoz\u00e1s\u00e1ra. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/424685ce852bc5f3ef77151f8d3d7289.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vissza kell t\u00e9rn\u00fcnk az \u00e9letbe. Bejegyz\u00fcnk az internetre, \u00e9s megtudjuk, hogy a hossz\u00fa tranzakci\u00f3k probl\u00e9m\u00e1t okoznak. Megkeress\u00fck \u00e9s megsz\u00fcntetj\u00fck ezt a tranzakci\u00f3t. \u00c9s minden vissza\u00e1ll a norm\u00e1lis ker\u00e9kv\u00e1g\u00e1sba. Minden \u00fagy m\u0171k\u00f6dik, ahogy kell. <\/p>\n<p><\/p>\n<p>Megnyugodtunk, de n\u00e9h\u00e1ny id\u0151 eltelt\u00e9vel elkezdj\u00fck \u00e9szrevenni, hogy az alkalmaz\u00e1s nem \u00fagy m\u0171k\u00f6dik, mint a v\u00e9szhelyzet el\u0151tt. A k\u00e9relmek tov\u00e1bbra is lassabban feldolgoz\u00f3dnak, m\u00e9ghozz\u00e1 jelent\u0151sen lassabban. Az \u00e9n p\u00e9ld\u00e1mban m\u00e1sf\u00e9l-k\u00e9tszer lassabban. A szerver terhel\u00e9se is magasabb, mint a v\u00e9szhelyzet el\u0151tt volt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/ee3037719a31f8d18fc42745716c4da5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A k\u00e9rd\u00e9s: \u201eMi t\u00f6rt\u00e9nik az adatb\u00e1zissal ebben az id\u0151szakban?\u201d. Az adatb\u00e1zissal a k\u00f6vetkez\u0151 helyzet zajlik. A tranzakci\u00f3k grafikonj\u00e1n l\u00e1that\u00f3, hogy le\u00e1llt, \u00e9s val\u00f3ban nincsenek hossz\u00fa tranzakci\u00f3k. De a t\u00e1bl\u00e1zat m\u00e9rete v\u00e9szhelyzet alatt drasztikusan megn\u0151tt. Az\u00f3ta nem cs\u00f6kkent. Az adatb\u00e1zis \u00e1tlagos ideje stabiliz\u00e1l\u00f3dott. A v\u00e1laszok pedig \u00fagy t\u0171nik, hogy megfelel\u0151 sebess\u00e9ggel \u00e1ramlanak. Az automatikus takar\u00edt\u00e1s akt\u00edvabb\u00e1 v\u00e1lt \u00e9s elkezdett valamit tenni a t\u00e1bl\u00e1zattal, mert t\u00f6bb adat feldolgoz\u00e1sa sz\u00fcks\u00e9ges. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/f6205242c4024dc3ed4cade5844dbf76.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A konkr\u00e9tan a vizsg\u00e1lt t\u00e1bl\u00e1zatra vonatkoz\u00f3an, ahol a maradv\u00e1nyokat m\u00f3dos\u00edtjuk: a v\u00e1laszid\u0151 a lek\u00e9rdez\u00e9sre l\u00e1tsz\u00f3lag normaliz\u00e1l\u00f3dott. De val\u00f3j\u00e1ban m\u00e1sf\u00e9l szor magasabb.<\/p>\n<p><\/p>\n<p>A processzorterhel\u00e9s szempontj\u00e1b\u00f3l l\u00e1thatjuk, hogy a terhel\u00e9s nem t\u00e9rt vissza a baleset el\u0151tti megfelel\u0151 szintre. Az okok a jobb als\u00f3 grafikonban rejlenek. L\u00e1tszik, hogy ott a mem\u00f3ria egy bizonyos mennyis\u00e9g\u00e9nek a feldolgoz\u00e1sa t\u00f6rt\u00e9nik. Vagyis a sz\u00fcks\u00e9ges sor keres\u00e9s\u00e9hez a szerver adatb\u00e1zis\u00e1nak er\u0151forr\u00e1sait pazaroljuk haszontalan adatok feldolgoz\u00e1s\u00e1ra. A m\u00e1sodpercenk\u00e9nti tranzakci\u00f3k sz\u00e1ma stabiliz\u00e1l\u00f3dott. <\/p>\n<p><\/p>\n<p>\u00d6sszess\u00e9g\u00e9ben j\u00f3, de a helyzet rosszabb, mint volt. Nyilv\u00e1nval\u00f3 degrad\u00e1ci\u00f3 t\u00f6rt\u00e9nt az adatb\u00e1zisban, ami annak a k\u00f6vetkezm\u00e9nye, hogy az alkalmaz\u00e1sunk ezzel az adatb\u00e1zissal dolgozik. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/0dfc9cd453fd84bc639ffd99cf189fd2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s hogy kider\u00edts\u00fck, mi t\u00f6rt\u00e9nik ott, ha nem volt\u00e1l a kor\u00e1bbi el\u0151ad\u00e1son, itt van egy kis elm\u00e9let. Az elm\u00e9let a bels\u0151 folyamatr\u00f3l. Mire val\u00f3 az autov\u00e1kum, \u00e9s mit csin\u00e1l?<\/p>\n<p><\/p>\n<p>R\u00f6viden az \u00e9rthet\u0151s\u00e9g kedv\u00e9\u00e9rt. Valamikor van egy t\u00e1bl\u00e1zatunk. A t\u00e1bl\u00e1zatban sorok vannak. Ezek a sorok lehetnek akt\u00edvak, \u00e9l\u0151ek, \u00e9s most sz\u00fcks\u00e9g\u00fcnk van r\u00e1juk. A k\u00e9pen z\u00f6ld sz\u00ednnel vannak jel\u00f6lve. Vannak \u201ehalott\u201d sorok is, amelyek m\u00e1r feldolgoz\u00f3dtak, friss\u00fcltek, \u00faj bejegyz\u00e9sek keletkeztek r\u00f3luk. Ezeket \u00fagy jel\u00f6lik, hogy m\u00e1r nem \u00e9rdeklik az adatb\u00e1zist. De a Postgres saj\u00e1toss\u00e1gai miatt m\u00e9g mindig a t\u00e1bl\u00e1zatban maradnak.<\/p>\n<p><\/p>\n<p>Mi\u00e9rt van sz\u00fcks\u00e9g az autov\u00e1kumra? Az autov\u00e1kum egy pillanatban elj\u00f6n, megkeresi az adatb\u00e1zist, \u00e9s ezt k\u00e9rdezi: \"K\u00e9rlek, add meg a leg\u00f6regebb tranzakci\u00f3 azonos\u00edt\u00f3j\u00e1t, amely jelenleg nyitva van az adatb\u00e1zisban.\" Az adatb\u00e1zis visszaadja ezt az azonos\u00edt\u00f3t. Az autov\u00e1kum ezen az alapon v\u00e9gigvizsg\u00e1lja a t\u00e1bl\u00e1zat sorait. \u00c9s ha l\u00e1tja, hogy bizonyos sorok m\u00f3dos\u00edtottak r\u00e9gebbi tranzakci\u00f3k \u00e1ltal, akkor jogot form\u00e1lhat arra, hogy ezeket a sorokat kijel\u00f6lje, mint amelyeket a j\u00f6v\u0151ben \u00fajra felhaszn\u00e1lhatunk \u00faj adatok \u00edr\u00e1s\u00e1hoz. Ez egy h\u00e1tt\u00e9rfolyamat.<\/p>\n<p><\/p>\n<p>Ebben az id\u0151ben tov\u00e1bbra is dolgozunk az adatb\u00e1zissal, folytatunk valamilyen m\u00f3dos\u00edt\u00e1st a t\u00e1bl\u00e1zatban. \u00c9s ezekre a sorokra, amelyeket \u00fajra felhaszn\u00e1lhatunk, \u00faj adatokat \u00edrunk. \u00cdgy folyamatosan keletkeznek \u00fajabb halott r\u00e9gi sorok, amelyeket lecser\u00e9l\u00fcnk az \u00fajonnan sz\u00fcks\u00e9ges sorokra. Ez a PostgreSQL norm\u00e1lis m\u0171k\u00f6d\u00e9si \u00e1llapota.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/98dd4451a7ca5f418775f72822c2840c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi t\u00f6rt\u00e9nt a baleset sor\u00e1n? Hogyan zajlott ez a folyamat?<\/p>\n<p><\/p>\n<p>Volt egy t\u00e1bl\u00e1zatunk valamilyen \u00e1llapotban, n\u00e9h\u00e1ny sor \u00e9l\u0151, n\u00e9h\u00e1ny halott. J\u00f6tt az automatikus takar\u00edt\u00f3. Megk\u00e9rdezte az adatb\u00e1zist, hogy mi a legid\u0151sebb tranzakci\u00f3nk, mi a hozz\u00e1 tartoz\u00f3 azonos\u00edt\u00f3ja. Megkapta ezt az azonos\u00edt\u00f3t, amely lehet \u00f3r\u00e1kkal ezel\u0151tt t\u00f6rt\u00e9nt, vagy ak\u00e1r t\u00edz perccel ezel\u0151tt. Ez att\u00f3l f\u00fcgg, hogy mennyire van terhelve az adatb\u00e1zisunk. Azt\u00e1n elkezdett keresni olyan sorokat, amelyeket \u00fajra felhaszn\u00e1lhat. De nem tal\u00e1lt ilyet a t\u00e1bl\u00e1zatunkban. <\/p>\n<p><\/p>\n<p>De k\u00f6zben tov\u00e1bbra is dolgozunk a t\u00e1bl\u00e1zaton. Valamit csin\u00e1lunk benne, friss\u00edtj\u00fck, m\u00f3dos\u00edtjuk az adatokat. Mi t\u00f6rt\u00e9nik ek\u00f6zben az adatb\u00e1zissal? Nincs m\u00e1s v\u00e1laszt\u00e1sa, mint \u00faj sorokat \u00edrni a megl\u00e9v\u0151 t\u00e1bl\u00e1zat v\u00e9g\u00e9re. Ezzel a t\u00e1bl\u00e1zatunk m\u00e9rete elkezd megn\u0151ni. <\/p>\n<p><\/p>\n<p>Val\u00f3j\u00e1ban z\u00f6ld sorokra van sz\u00fcks\u00e9g\u00fcnk a munk\u00e1hoz. De egy ilyen probl\u00e9ma sor\u00e1n el\u0151fordul, hogy a z\u00f6ld sorok ar\u00e1nya rendk\u00edv\u00fcl alacsony az eg\u00e9sz t\u00e1bl\u00e1zatban. <\/p>\n<p><\/p>\n<p>Amikor v\u00e9grehajtunk egy lek\u00e9rdez\u00e9st, az adatb\u00e1zisnak v\u00e9gig kell mennie az \u00f6sszes soron: a piros \u00e9s a z\u00f6ld sorokon is, hogy megtal\u00e1lja a sz\u00fcks\u00e9ges sort. Az adatok felesleges bloat-ja, amely elherd\u00e1lja a lemezt\u00e1rol\u00f3nkat, azt jelenti, hogy eml\u00e9kezzen, hogy volt 2 MB, lett 300 MB? Most pedig cser\u00e9lje le a megab\u00e1jtokat gigab\u00e1jtokra, \u00e9s el\u00e9g gyorsan el fogja vesz\u00edteni az \u00f6sszes lemezt\u00e1rol\u00f3 er\u0151forr\u00e1s\u00e1t.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/fe7cb6b5c99610744ebcfe5ad7235d1e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mik lehetnek a k\u00f6vetkezm\u00e9nyek sz\u00e1munkra? <\/p>\n<p><\/p>\n<ul>\n<li>Az \u00e9n p\u00e9ld\u00e1mban a t\u00e1bl\u00e1zat \u00e9s az index 150-szeres\u00e9re n\u0151tt. N\u00e9h\u00e1ny \u00fcgyfel\u00fcnkn\u00e9l sokkal dr\u00e1maibb esetek voltak, amikor a lemezhely egyszer\u0171en elkezdett kifogyni. <\/li>\n<li>A t\u00e1bl\u00e1zatok m\u00e9rete \u00f6nmag\u00e1ban soha nem cs\u00f6kken. Az automatikus takar\u00edt\u00f3 egyes esetekben lev\u00e1ghatja a t\u00e1bl\u00e1zat v\u00e9g\u00e9t, ha ott csak halott sorok vannak. De mivel folyamatosan rot\u00e1l\u00f3dik, egy z\u00f6ld sor a v\u00e9g\u00e9n ragadhat \u00e9s nem friss\u00fclhet, m\u00edg a t\u00f6bbi sor valahol a t\u00e1bl\u00e1zat elej\u00e9n lesz be\u00edrva. De ez egy annyira val\u00f3sz\u00edn\u0171tlen esem\u00e9ny, hogy nem \u00e9rdemes rem\u00e9lni, hogy a t\u00e1bl\u00e1zat m\u00e9rete cs\u00f6kken. <\/li>\n<li>Az adatb\u00e1zisnak \u00e1t kell n\u00e9znie az \u00f6sszes felesleges sort. Ez\u00e1ltal disk er\u0151forr\u00e1sokat, CPU er\u0151forr\u00e1sokat \u00e9s energiafogyaszt\u00e1st pazarolunk. <\/li>\n<li>Ez k\u00f6zvetlen\u00fcl hat\u00e1ssal van az alkalmaz\u00e1sunkra, mert ha kezdetben 10 milliszekundumot t\u00f6lt\u00f6tt\u00fcnk el a lek\u00e9rdez\u00e9sre, 10 milliszekundumot a k\u00f3dunkra, akkor a hiba idej\u00e9n 1 m\u00e1sodpercet k\u00f6lt\u00f6tt\u00fcnk a lek\u00e9rdez\u00e9sre \u00e9s 10 milliszekundumot a k\u00f3dra, teh\u00e1t az alkalmaz\u00e1s teljes\u00edtm\u00e9nye a t\u00f6red\u00e9k\u00e9re esett vissza. Amikor a hib\u00e1t megsz\u00fcntett\u00fck, 20 milliszekundumra emelkedett a lek\u00e9rdez\u00e9s ideje \u00e9s 10 milliszekundumra a k\u00f3d\u00e9. Ez azt jelenti, hogy tov\u00e1bbra is m\u00e1sf\u00e9l szoros teljes\u00edtm\u00e9nycs\u00f6kkent\u00e9ssel n\u00e9zt\u00fcnk szembe. Mindez egyetlen tranzakci\u00f3 miatt t\u00f6rt\u00e9nt, ami megakadt, lehet, hogy a mi hib\u00e1nkb\u00f3l. <\/li>\n<li>A k\u00e9rd\u00e9s: \"Hogyan \u00e1ll\u00edthatjuk vissza mindent?\", hogy minden j\u00f3l menjen \u00e9s a lek\u00e9rdez\u00e9sek olyan gyorsan fussanak, mint a hiba el\u0151tt. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/1bf46e8cd9b28ca2862f978f2ca85819.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ehhez van egy meghat\u00e1rozott munkafolyamat, amelyet v\u00e9gre kell hajtani. <\/p>\n<p><\/p>\n<p>El\u0151sz\u00f6r meg kell tal\u00e1lnunk a probl\u00e9m\u00e1s t\u00e1bl\u00e1kat, amelyek megn\u00f6vekedtek. \u00c9rtelemszer\u0171en vannak olyan t\u00e1bl\u00e1k, ahol a be\u00edr\u00e1s akt\u00edvabb, \u00e9s vannak, ahol kev\u00e9sb\u00e9. \u00c9s ehhez haszn\u00e1lhat\u00f3 a kiterjeszt\u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/pgstattuple.html\">pgstattuple<\/a><\/noindex>. E kiterjeszt\u00e9s telep\u00edt\u00e9s\u00e9vel olyan lek\u00e9rdez\u00e9seket \u00edrhat, amelyek seg\u00edtenek megtal\u00e1lni a jelent\u0151sen megn\u00f6vekedett t\u00e1bl\u00e1kat. <\/p>\n<p><\/p>\n<p>Miut\u00e1n megtal\u00e1lta ezeket a t\u00e1bl\u00e1kat, azokat t\u00f6m\u00f6r\u00edteni kell. Erre m\u00e1r l\u00e9teznek eszk\u00f6z\u00f6k. A v\u00e1llalatunk h\u00e1rom eszk\u00f6zt haszn\u00e1l. Az els\u0151 a be\u00e9p\u00edtett VACUUM FULL. Ez kem\u00e9ny, szigor\u00fa \u00e9s k\u00f6ny\u00f6rtelen, de n\u00e9ha nagyon hasznos. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/reorg\/pg_repack\">Pg_repack<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dataegret\/pgcompacttable\">pgcompacttable<\/a><\/noindex> \u2013 harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 eszk\u00f6z\u00f6k a t\u00e1bl\u00e1k t\u00f6m\u00f6r\u00edt\u00e9s\u00e9hez. Ezek k\u00edm\u00e9l\u0151bbek az adatb\u00e1zissal szemben. <\/p>\n<p><\/p>\n<p>Ezek att\u00f3l f\u00fcgg\u0151en haszn\u00e1lhat\u00f3k, hogy mi a k\u00e9nyelmesebb az \u00d6n sz\u00e1m\u00e1ra. De err\u0151l a legv\u00e9g\u00e9n fogok besz\u00e9lni. A legfontosabb, hogy h\u00e1rom eszk\u00f6z \u00e1ll rendelkez\u00e9sre. Van mib\u0151l v\u00e1lasztani. <\/p>\n<p><\/p>\n<p>Miut\u00e1n mindent rendbe hoztunk \u00e9s megbizonyosodtunk arr\u00f3l, hogy minden j\u00f3l m\u0171k\u00f6dik, tudnunk kell, hogyan lehet megakad\u00e1lyozni, hogy ez a helyzet a j\u00f6v\u0151ben el\u0151forduljon:<\/p>\n<p><\/p>\n<ul>\n<li>Ez viszonylag k\u00f6nnyen megel\u0151zhet\u0151. Figyelni kell a Master-szerveren a munkamenetek id\u0151tartam\u00e1ra. <strong>K\u00fcl\u00f6n\u00f6sen vesz\u00e9lyesek az idle in transaction \u00e1llapot\u00fa munkamenetek<\/strong>. Ezek azok, amelyek \u00e9ppen tranzakci\u00f3t nyitottak, valamit tettek, majd elmentek, vagy egyszer\u0171en megakadtak, elvesztek a k\u00f3dban. <\/li>\n<li>Fejleszt\u0151k\u00e9nt fontos, hogy tesztelj\u00e9k a k\u00f3dot olyan helyzetek el\u0151fordul\u00e1sakor. Ez nem neh\u00e9z feladat. Egy hasznos ellen\u0151rz\u00e9st fog v\u00e9gezni. Elker\u00fclhetik a hossz\u00fa tranzakci\u00f3kkal kapcsolatos sz\u00e1mos \"gyerekbetegs\u00e9get\". <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/d55465d96c4018db733954867d23aaba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ezeken a grafikonokon meg akartam mutatni, hogyan v\u00e1ltozott meg a t\u00e1bl\u00e1zat \u00e9s az adatb\u00e1zis viselked\u00e9se, miut\u00e1n a VACUUM FULL m\u0171veletet v\u00e9grehajtottam a t\u00e1bl\u00e1zaton. Ez nem a produkci\u00f3s adatb\u00e1zisom.<\/p>\n<p><\/p>\n<p>A t\u00e1bla m\u00e9rete azonnal visszat\u00e9rt a norm\u00e1lis m\u0171k\u00f6d\u00e9si \u00e1llapot\u00e1ba, p\u00e1r megab\u00e1jtra. Ez nem befoly\u00e1solta k\u00fcl\u00f6n\u00f6sebben a szerver \u00e1tlagos v\u00e1laszidej\u00e9t. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/cbb07ad24dba899395223d1ca25e438e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De konkr\u00e9tan a tesztelt t\u00e1bl\u00e1zatunk eset\u00e9ben, ahol friss\u00edtett\u00fck a sz\u00e1ml\u00e1k egyenleg\u00e9t, l\u00e1that\u00f3, hogy az \u00e1tlagos v\u00e1laszid\u0151 a t\u00e1bl\u00e1zaton bel\u00fcli adatok friss\u00edt\u00e9se sor\u00e1n cs\u00f6kkent a kor\u00e1bbi szintre. A k\u00e9r\u00e9s teljes\u00edt\u00e9s\u00e9re felhaszn\u00e1lt CPU-er\u0151forr\u00e1sok is visszaestek a kor\u00e1bbi szintre. A jobb als\u00f3 grafikon pedig azt mutatja, hogy most azonnal megtal\u00e1ljuk azt a sorozatot, amely sz\u00fcks\u00e9ges sz\u00e1munkra, an\u00e9lk\u00fcl, hogy a t\u00e1bl\u00e1zat t\u00f6m\u00f6r\u00edt\u00e9se el\u0151tt l\u00e9v\u0151 halott sorokat kellene \u00e1tn\u00e9zni. Az \u00e1tlagos k\u00e9r\u00e9sid\u0151k nagyj\u00e1b\u00f3l ugyanazon a szinten maradtak. De itt ink\u00e1bb a hardverem hib\u00e1j\u00e1r\u00f3l van sz\u00f3.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/c1d90c5442e02fce209dc40e048a8ca2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ezzel v\u00e9get \u00e9rt az els\u0151 t\u00f6rt\u00e9net. Ez a leggyakoribb eset, \u00e9s mindenkivel megt\u00f6rt\u00e9nik, f\u00fcggetlen\u00fcl a kliens tapasztalat\u00e1t\u00f3l vagy a programoz\u00f3k k\u00e9pes\u00edt\u00e9seit\u0151l. El\u0151bb-ut\u00f3bb biztosan bek\u00f6vetkezik. <\/p>\n<p><\/p>\n<p>A m\u00e1sodik t\u00f6rt\u00e9net, ahol elosztjuk a terhel\u00e9st \u00e9s optimaliz\u00e1ljuk a szerver er\u0151forr\u00e1sait.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/cda421c554d1329107ddc935045cc1b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>M\u00e1r megn\u0151tt\u00fcnk \u00e9s komoly fi\u00fak lett\u00fcnk. Meg\u00e9rtett\u00fck, hogy van egy replik\u00e1nk, \u00e9s j\u00f3 lenne egyens\u00falyozni a terhel\u00e9st: az adatokat a Masterre \u00edrni, \u00e9s a replik\u00e1r\u00f3l olvasni. Ez a helyzet \u00e1ltal\u00e1ban akkor mer\u00fcl fel, amikor jelent\u00e9seket vagy ETL-t szeretn\u00e9nk k\u00e9sz\u00edteni. A business ennek nagyon \u00f6r\u00fcl. Szeretn\u00e9nek sokf\u00e9le jelent\u00e9st k\u00fcl\u00f6nb\u00f6z\u0151 bonyolult elemz\u00e9sekkel. <\/li>\n<li>A jelent\u00e9sek \u00f3r\u00e1kig tartanak, mert a bonyolult elemz\u00e9st nem lehet milli\u00e1rdos gyorsas\u00e1ggal kisz\u00e1m\u00edtani. Mi, mint vid\u00e1m fi\u00fak, k\u00f3dot \u00edrunk. Az alkalmaz\u00e1sban v\u00e9grehajtunk egyes\u00edt\u00e9seket, hogy az adatokat a Masterre \u00edrjuk, a jelent\u00e9seket pedig a replik\u00e1n v\u00e9gezz\u00fck. <\/li>\n<li>Elosszuk a terhel\u00e9st. <\/li>\n<li>Minden j\u00f3l m\u0171k\u00f6dik. \u00dcgyesek vagyunk. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/e94c8c492197a5015ac8aae79389a4c2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s hogyan n\u00e9z ki ez a helyzet? Ezeken a grafikonokon kifejezetten a tranzakci\u00f3k id\u0151tartama mellett a replik\u00e1r\u00f3l sz\u00e1rmaz\u00f3 tranzakci\u00f3k id\u0151tartam\u00e1t is hozz\u00e1adtam. Minden m\u00e1s grafikon kiz\u00e1r\u00f3lag a Master szerverhez tartozik. <\/p>\n<p><\/p>\n<p>A jelent\u00e9sek t\u00e1bl\u00e1zata eddig n\u00f6vekedett. T\u00f6bb lett bel\u0151l\u00fck. L\u00e1tjuk, hogy a szerver v\u00e1laszideje stabil. L\u00e1tjuk, hogy a replik\u00e1nk egy hossz\u00fa tranzakci\u00f3t futtat, ami m\u00e1r 2 \u00f3r\u00e1ja tart. L\u00e1tjuk, hogy az autovakuum nyugodtan dolgozik, ami a t\u00f6r\u00f6lt sorokat kezeli. Minden rendben van n\u00e1lunk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/2da8acf098d12d6f146ab9b9dcb54b81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A konkr\u00e9t vizsg\u00e1lt t\u00e1bl\u00e1zatra vonatkoz\u00f3an folytatjuk a sz\u00e1ml\u00e1k egyenleg\u00e9nek friss\u00edt\u00e9s\u00e9t. \u00c9s n\u00e1lunk is stabil a v\u00e1laszid\u0151 a lek\u00e9rdez\u00e9sekre, stabil er\u0151forr\u00e1s-felhaszn\u00e1l\u00e1s. Minden rendben van n\u00e1lunk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/3621ef723017bac6fb635caf0a5f4de6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Minden j\u00f3l van addig, am\u00edg ezek a jelent\u00e9sek nem kezdenek konfliktusba \u00fctk\u00f6zni a replik\u00e1ci\u00f3val. \u00c9s ezek rendszeres id\u0151k\u00f6z\u00f6nk\u00e9nt megjelennek. <\/p>\n<p><\/p>\n<p>Beles\u00fcnk az internetre, \u00e9s elkezdj\u00fck olvasni, hogy mi\u00e9rt t\u00f6rt\u00e9nik ez. \u00c9s megtal\u00e1ljuk a megold\u00e1st. <\/p>\n<p><\/p>\n<p>Az els\u0151 megold\u00e1s - megn\u00f6velni a replik\u00e1ci\u00f3s k\u00e9sleltet\u00e9st. Tudjuk, hogy a jelent\u00e9s 3 \u00f3r\u00e1n \u00e1t fut. Be\u00e1ll\u00edtjuk a replik\u00e1ci\u00f3s k\u00e9sleltet\u00e9st - 3 \u00f3r\u00e1ra. Minden elind\u00edtunk, de akkor is tov\u00e1bbra is probl\u00e9m\u00e1ink vannak azzal, hogy a jelent\u00e9sek n\u00e9ha megszakadnak. <\/p>\n<p><\/p>\n<p>Azt akarjuk, hogy minden t\u00f6k\u00e9letes legyen. Tov\u00e1bb keresg\u00e9l\u00fcnk, \u00e9s tal\u00e1lunk egy remek be\u00e1ll\u00edt\u00e1st az interneten - hot_standby_feedback. Bekapcsoljuk. A hot_standby_feedback lehet\u0151v\u00e9 teszi sz\u00e1munkra, hogy fenntartjuk az autovakuum munk\u00e1j\u00e1t a Mester szerveren. Ezzel teljesen megszabadulunk a replik\u00e1ci\u00f3s konfliktusokt\u00f3l. Minden j\u00f3l m\u0171k\u00f6dik a jelent\u00e9seinkkel.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/ee3c315168bdd3f392d2e8a1c5861004.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De mi t\u00f6rt\u00e9nik k\u00f6zben a Mester szerverrel? A Mester szerveren tot\u00e1lis katasztr\u00f3fa zajlik. Most a grafikonokat figyelj\u00fck, amikor mindk\u00e9t be\u00e1ll\u00edt\u00e1st bekapcsoltam. \u00c9s l\u00e1tjuk, hogy a replik\u00e1n l\u00e9v\u0151 session valamilyen m\u00f3don befoly\u00e1solja a Mester szerver helyzet\u00e9t. Val\u00f3ban befoly\u00e1solja, mert le\u00e1ll\u00edtotta az autovakuumot, ami a t\u00f6r\u00f6lt sorokat tiszt\u00edtja. A t\u00e1bl\u00e1zat m\u00e9rete \u00fajra az egekbe sz\u00f6k\u00f6tt. Az \u00f6sszes lek\u00e9rdez\u00e9s \u00e1tlagos v\u00e9grehajt\u00e1si ideje az adatb\u00e1zison szint\u00e9n az egekbe sz\u00f6k\u00f6tt. Az autovakuumok kicsit megfesz\u00fcltek. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/980611dcce8b189dc50f422ffd3d2d72.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Konkr\u00e9tan a mi t\u00e1bl\u00e1zatunkkal l\u00e1tjuk, hogy a benne l\u00e9v\u0151 adatok friss\u00edt\u00e9se is az egekbe sz\u00f6k\u00f6tt. A CPU er\u0151forr\u00e1s-felhaszn\u00e1l\u00e1s is jelent\u0151sen megn\u00f6vekedett. Ism\u00e9t egy nagy mennyis\u00e9g\u0171 haszontalan t\u00f6r\u00f6lt sorokat n\u00e9z\u00fcnk \u00e1t. \u00c9s ezen a t\u00e1bl\u00e1zaton a v\u00e1laszid\u0151 \u00e9s a tranzakci\u00f3k sz\u00e1ma cs\u00f6kkent. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/a648fd313a5dccf45f0056dc13c54263.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hogyan fog ez kin\u00e9zni, ha nem tudjuk, mir\u0151l besz\u00e9ltem el\u0151tte?<\/p>\n<p><\/p>\n<ul>\n<li>Kezdj\u00fck el keresni a probl\u00e9m\u00e1kat. Ha az els\u0151 r\u00e9szben probl\u00e9m\u00e1kkal szembes\u00fclt\u00fcnk, tudjuk, hogy ez lehet a hossz\u00fa tranzakci\u00f3k miatt, \u00e9s a Mesterhez ny\u00falunk. A probl\u00e9ma n\u00e1lunk a Mester oldalon van. Zakatol. F\u0171t, a Load Average pedig a sz\u00e1zhoz k\u00f6zel\u00edt. <\/li>\n<li>Ott lassulnak a k\u00e9r\u00e9sek, de nem l\u00e1tunk semmilyen hossz\u00fa tranzakci\u00f3t. \u00c9s nem \u00e9rtj\u00fck, mi a probl\u00e9ma. Nem tudjuk, hol keress\u00fcnk. <\/li>\n<li>Ellen\u0151rizz\u00fck a szerverhardvert. El\u0151fordulhat, hogy a RAID elromlott. Tal\u00e1n az egyik mem\u00f3ria modulunk meghib\u00e1sodott. B\u00e1rmi lehet. De nem, a szerverek \u00fajak, minden j\u00f3l m\u0171k\u00f6dik. <\/li>\n<li>Mindenki rohang\u00e1l: az adminisztr\u00e1torok, a fejleszt\u0151k \u00e9s a vezet\u0151. Semmi sem seg\u00edt. <\/li>\n<li>\u00c9s egy pillanatban minden v\u00e1ratlanul elkezd helyre\u00e1llni. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/7d4f6417bc5cb3cec33679d843c6661d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A replik\u00e1nk ek\u00f6zben egy k\u00e9r\u00e9s v\u00e9grehajt\u00f3dott \u00e9s elment. Megkaptuk a jelent\u00e9st. Az \u00fczlet m\u00e9g mindig el\u00e9gedett. Ahogy l\u00e1tjuk, a t\u00e1bl\u00e1zatunk \u00fajra megn\u0151tt \u00e9s nem sz\u00e1nd\u00e9kozik cs\u00f6kkenni. A munkamenetek grafikonj\u00e1n hagytam egy darabot err\u0151l a hossz\u00fa tranzakci\u00f3r\u00f3l a replik\u00e1r\u00f3l, hogy l\u00e1thass\u00e1tok, mennyi id\u0151 telik el, m\u00edg a helyzet stabiliz\u00e1l\u00f3dik. <\/p>\n<p><\/p>\n<p>A munkamenet elment. \u00c9s csak egy id\u0151 ut\u00e1n a szerver t\u00f6bb\u00e9-kev\u00e9sb\u00e9 helyre\u00e1ll. Az \u00e1tlagos v\u00e1laszid\u0151 a k\u00e9r\u00e9sekhez a Mester szerveren normaliz\u00e1l\u00f3dik. Mert v\u00e9gre az automatikus takar\u00edt\u00e1s lehet\u0151s\u00e9get kapott arra, hogy elt\u00e1vol\u00edtsa, megjel\u00f6lje ezeket a holt sorokat. \u00c9s elkezdte v\u00e9gezni a munk\u00e1j\u00e1t. \u00c9s amilyen gyorsan v\u00e9gzi, olyan gyorsan ker\u00fcl\u00fcnk helyre.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/547d195e08de1566da818150a47218eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az \u00e9rintett t\u00e1bl\u00e1zatunkon, ahol friss\u00edtj\u00fck a sz\u00e1ml\u00e1k egyenleg\u00e9t, ugyanazt a k\u00e9pet l\u00e1tjuk. A sz\u00e1mla friss\u00edt\u00e9si id\u0151 \u00e1tlagosan szint\u00e9n fokozatosan normaliz\u00e1l\u00f3dik. A CPU \u00e1ltal felhaszn\u00e1lt er\u0151forr\u00e1sok is cs\u00f6kkennek. \u00c9s a m\u00e1sodpercenk\u00e9nti tranzakci\u00f3k sz\u00e1ma visszat\u00e9r a norm\u00e1l \u00e9rt\u00e9kre. De \u00fajra nem a rendes szintre, ami a baleset el\u0151tt volt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/29372a5e9124690931485a7aea65befc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>B\u00e1rmilyen esetben teljes\u00edtm\u00e9nycs\u00f6kken\u00e9ssel szembes\u00fcl\u00fcnk, ahogy az els\u0151 esetben m\u00e1sf\u00e9l-k\u00e9tszeres, n\u00e9ha m\u00e9g enn\u00e9l is nagyobb. <\/p>\n<p><\/p>\n<p>\u00dagy t\u0171nik, mindent j\u00f3l csin\u00e1ltunk. Elosztottuk a terhel\u00e9st. A berendez\u00e9s nem \u00e1ll \u00fcresen. Okosan felosztottuk a k\u00e9r\u00e9seket, de \u00edgy is rosszul siker\u00fclt. <\/p>\n<p><\/p>\n<ul>\n<li>Ne kapcsolja be a hot_standby_feedback-t? Igen, ezt nem aj\u00e1nlott bekapcsolni k\u00fcl\u00f6n\u00f6sebb indok n\u00e9lk\u00fcl. Mert ez a be\u00e1ll\u00edt\u00e1s k\u00f6zvetlen\u00fcl befoly\u00e1solja a Master szervert, \u00e9s le\u00e1ll\u00edtja az automatikus v\u00e1kuum m\u0171k\u00f6d\u00e9s\u00e9t ott. Ha ezt bekapcsolja egy replik\u00e1n, \u00e9s elfelejti, k\u00f6nnyen t\u00f6nkreteheti a Master-t, \u00e9s komoly probl\u00e9m\u00e1kat okozhat az alkalmaz\u00e1sban. <\/li>\n<li>N\u00f6velje meg a max_standby_streaming_delay-t? Igen, ez igaz a jelent\u00e9sekre. Ha h\u00e1rom\u00f3r\u00e1s jelent\u00e9se van, \u00e9s nem akarja, hogy a replik\u00e1ci\u00f3s konfliktusok miatt le\u00e1lljon, egyszer\u0171en n\u00f6velje meg a k\u00e9sleltet\u00e9st. Hossz\u00fa jelent\u00e9sek soha nem ig\u00e9nyelnek azonnali adatokat, amelyek a rendszerbe \u00e9rkeznek. Ha h\u00e1rom \u00f3r\u00e1s, akkor bizony\u00e1ra egy r\u00e9gi adatperi\u00f3dusra ind\u00edtja. \u00d6nnek teljesen mindegy, hogy h\u00e1rom \u00f3r\u00e1s k\u00e9sleltet\u00e9se van, vagy hat \u00f3r\u00e1s, de akkor stabilan megkapja a jelent\u00e9seket, \u00e9s nem lesz probl\u00e9m\u00e1ja a le\u00e1ll\u00e1sokkal. <\/li>\n<li>Term\u00e9szetesen ellen\u0151rizni kell a hossz\u00fa munkameneteket a replik\u00e1kon, k\u00fcl\u00f6n\u00f6sen, ha \u00fagy d\u00f6nt\u00f6tt, hogy bekapcsolja a hot_standby_feedback-et a replik\u00e1n. Mert b\u00e1rmilyen helyzet el\u0151fordulhat. \u00c1tadtuk ezt a replik\u00e1t egy fejleszt\u0151nek, hogy tesztelje a lek\u00e9rdez\u00e9seket. \u0150 \u00edrt egy \u0151r\u00fclt lek\u00e9rdez\u00e9st. Lefuttatta, \u00e9s elment te\u00e1zni, m\u00edg mi a Master-t meg\u00f6lt\u00fck. Vagy egy nem megfelel\u0151 alkalmaz\u00e1st enged\u00fcnk od\u00e1ig. A helyzetek v\u00e1ltozatosak. A replik\u00e1kon l\u00e9v\u0151 munkameneteket ugyan\u00fagy figyelni kell, mint a Master-en. <\/li>\n<li>Ha gyors \u00e9s hossz\u00fa lek\u00e9rdez\u00e9sei vannak a replik\u00e1kon, akkor ebben az esetben c\u00e9lszer\u0171 a terhel\u00e9s eloszt\u00e1s\u00e1t sz\u00e9tbontani. Ez a streaming_delay-re vonatkozik. A gyorsaknak legyen egy replik\u00e1juk kisebb replik\u00e1ci\u00f3s k\u00e9sleltet\u00e9ssel. A hossz\u00fa jelent\u00e9sekhez pedig legyen egy replik\u00e1juk, amely ak\u00e1r 6 \u00f3r\u00e1t, ak\u00e1r 24 \u00f3r\u00e1t is k\u00e9slekedhet. Ez teljesen norm\u00e1lis helyzet. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ugyanazzal a m\u00f3dszerrel sz\u00fcntetj\u00fck meg a k\u00f6vetkezm\u00e9nyeket:<\/p>\n<p><\/p>\n<ul>\n<li>Megkeress\u00fck a megn\u00f6vekedett t\u00e1bl\u00e1kat.<\/li>\n<li>\u00c9s t\u00f6m\u00f6r\u00edtj\u00fck a legmegfelel\u0151bb eszk\u00f6zzel, amely nek\u00fcnk megfelel. <\/li>\n<\/ul>\n<p><\/p>\n<p>A m\u00e1sodik t\u00f6rt\u00e9net itt v\u00e9get \u00e9rt. T\u00e9rj\u00fcnk \u00e1t a harmadik t\u00f6rt\u00e9netre. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/c8784e0be27883640cb8f6919a1c25e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez is el\u00e9g szokv\u00e1nyos a sz\u00e1munkra, amelyben migr\u00e1ci\u00f3t v\u00e9gz\u00fcnk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/a04b9cd88a0e7e8a3b960ef930eb2657.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>B\u00e1rmely szoftverterm\u00e9k n\u00f6vekszik. A k\u00f6vetelm\u00e9nyek folyamatosan v\u00e1ltoznak. Mindig fejl\u0151dni akarunk. \u00c9s n\u00e9ha sz\u00fcks\u00e9ges a t\u00e1bl\u00e1zat adatait friss\u00edteni, \u00e9ppen egy friss\u00edt\u00e9st v\u00e9grehajtva a migr\u00e1ci\u00f3nk sor\u00e1n az \u00faj funkci\u00f3hoz, amelyet bevezet\u00fcnk a fejl\u0151d\u00e9s\u00fcnk keretein bel\u00fcl. <\/li>\n<li>A r\u00e9gi adatform\u00e1tum nem megfelel\u0151. Tegy\u00fck fel, hogy most r\u00e1t\u00e9r\u00fcnk a m\u00e1sodik t\u00e1bl\u00e1zatra, ahol ezekre a sz\u00e1ml\u00e1kra vonatkoz\u00f3 m\u0171veleteim vannak. \u00c9s felt\u00e9telezz\u00fck, hogy rubelben voltak, de d\u00f6nt\u00f6tt\u00fcnk \u00fagy, hogy n\u00f6velj\u00fck a pontoss\u00e1got, \u00e9s fill\u00e9rekben v\u00e9gezz\u00fck. Ehhez friss\u00edteni kell: a m\u0171velet \u00f6sszeg\u00e9n l\u00e9v\u0151 mez\u0151t meg kell szorozni sz\u00e1zal. <\/li>\n<li>A modern vil\u00e1gban automatiz\u00e1lt eszk\u00f6z\u00f6ket haszn\u00e1lunk az adatb\u00e1zisok verzi\u00f3ellen\u0151rz\u00e9s\u00e9re. Tegy\u00fck fel, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.liquibase.org\/\">Liquibase<\/a><\/noindex>. Ide \u00edrjuk a migr\u00e1ci\u00f3nkat. Tesztelj\u00fck a tesztadatb\u00e1zisunkon. Minden rendben van. A friss\u00edt\u00e9s sikeresen v\u00e9gbemegy. Kicsit le\u00e1ll\u00edtja a m\u0171k\u00f6d\u00e9st, de \u00edgy friss\u00edtett adatokat kapunk. \u00c9s elind\u00edthatjuk az \u00faj funkci\u00f3kat ezen az alapon. Mindent letesztelt\u00fcnk, ellen\u0151rizt\u00fcnk. Mindenki meger\u0151s\u00edtette. <\/li>\n<li>Elv\u00e9gezt\u00fck a tervezett munk\u00e1latokat, v\u00e9grehajtottuk a migr\u00e1ci\u00f3t. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/9e046583f7b1723fc1eaf61a03900918.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Itt a friss\u00edt\u00e9ssel ell\u00e1tott migr\u00e1ci\u00f3 bemutat\u00e1sa el\u0151ttetek. Mivel ezek sz\u00e1ml\u00e1kra vonatkoz\u00f3 m\u0171veleteim vannak, a t\u00e1bl\u00e1zat 15 GB volt. \u00c9s mivel minden egyes sort friss\u00edt\u00fcnk, a friss\u00edt\u00e9ssel megdupl\u00e1ztuk a t\u00e1bl\u00e1zat m\u00e9ret\u00e9t, mert minden egyes sort \u00fajra\u00edrtunk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/06120c98ea43d0568045e71935c23592.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A migr\u00e1ci\u00f3 sor\u00e1n nem tudtunk semmit csin\u00e1lni ezzel a t\u00e1bl\u00e1zattal, mert minden k\u00e9r\u00e9se v\u00e1rakoz\u00e1sra \u00e1llt, am\u00edg befejez\u0151dik ez a friss\u00edt\u00e9s. De szeretn\u00e9m felh\u00edvni a figyelmet a f\u00fcgg\u0151leges tengelyen l\u00e9v\u0151 sz\u00e1mokra. Teh\u00e1t az \u00e1tlaga az el\u0151tti migr\u00e1ci\u00f3s k\u00e9r\u00e9sek id\u0151tartama k\u00f6r\u00fclbel\u00fcl 5 milliszekundum, \u00e9s a CPU terhel\u00e9s, a mem\u00f3ria olvas\u00e1si m\u0171veletek sz\u00e1ma kevesebb mint 7,5. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/69a3ba4d1d0cec7d39284e09e9d3055b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A migr\u00e1ci\u00f3 sikeresen lezajlott, de \u00fajra probl\u00e9m\u00e1ink ad\u00f3dtak. <\/p>\n<p><\/p>\n<p>A migr\u00e1ci\u00f3 sikeres volt, de:<\/p>\n<p><\/p>\n<ul>\n<li>A r\u00e9gi funkci\u00f3k v\u00e9grehajt\u00e1sa tov\u00e1bb tartott. <\/li>\n<li>A t\u00e1bl\u00e1zat megint n\u0151tt a m\u00e9retei. <\/li>\n<li>A szerver terhel\u00e9se ism\u00e9t nagyobb lett, mint amilyen kor\u00e1bban volt. <\/li>\n<li>\u00c9s term\u00e9szetesen m\u00e9g mindig foglalkozunk a j\u00f3l m\u0171k\u00f6d\u0151 funkci\u00f3kkal, amelyeket egy kicsit jav\u00edtottunk. <\/li>\n<\/ul>\n<p><\/p>\n<p>\u00c9s ez megint bloat, ami \u00fajra megnehez\u00edti az \u00e9let\u00fcnket. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/becd7cce3a1c8821c81c96257f41202b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Itt bemutatom, hogy a t\u00e1bl\u00e1zat, ak\u00e1rcsak az el\u0151z\u0151 k\u00e9t esetben, nem k\u00e9sz\u00fcl visszat\u00e9rni a kor\u00e1bbi m\u00e9retekhez. A szerver \u00e1tlagos terhel\u00e9se l\u00e1tsz\u00f3lag megfelel\u0151. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/4d703a60d43a3460bc3782d49865b690.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha megn\u00e9zz\u00fck a sz\u00e1ml\u00e1k t\u00e1bl\u00e1zat\u00e1t, azt l\u00e1tjuk, hogy a lek\u00e9rdez\u00e9sek \u00e1tlagos ideje megdupl\u00e1z\u00f3dott ehhez a t\u00e1bl\u00e1zathoz k\u00e9pest. A processzor terhel\u00e9se \u00e9s a mem\u00f3ri\u00e1ban kezelt sorok sz\u00e1ma 7,5 f\u00f6l\u00e9 ugrott, m\u00edg kor\u00e1bban alatta volt. A processzorok eset\u00e9ben a n\u00f6veked\u00e9s k\u00e9tszeres, a blokkoper\u00e1ci\u00f3k eset\u00e9ben m\u00e1sf\u00e9l, teh\u00e1t a szerver teljes\u00edtm\u00e9nye romlott. Ennek k\u00f6vetkezm\u00e9nyek\u00e9nt a mi alkalmaz\u00e1sunk teljes\u00edtm\u00e9nye is cs\u00f6kkent. K\u00f6zben a h\u00edv\u00e1sok sz\u00e1ma nagyj\u00e1b\u00f3l ugyanazon a szinten maradt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/80772afa0643b29f5314a2482c9dfe0d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Itt a legfontosabb meg\u00e9rteni, hogyan kell helyesen v\u00e9grehajtani az ilyen migr\u00e1ci\u00f3kat. Ezeket el kell v\u00e9gezni. Mi rendszeresen v\u00e9gezz\u00fck ezeket a migr\u00e1ci\u00f3kat.<\/p>\n<p><\/p>\n<ul>\n<li>Az ilyen nagy migr\u00e1ci\u00f3kat sosem v\u00e9gzik automatikusan. Mindig kontroll\u00e1ltak kell, hogy legyenek. <\/li>\n<li>Sz\u00fcks\u00e9ges a kontroll egy tapasztalt szem\u00e9ly r\u00e9sz\u00e9r\u0151l. Ha van DBA a csapatban, akkor hagyjuk, hogy \u0151 v\u00e9gezze. Ez az \u0151 munk\u00e1ja. Ha nincs, akkor a legtapasztaltabb szem\u00e9ly v\u00e9gezze, aki tudja, hogyan kell dolgozni az adatb\u00e1zisokkal. <\/li>\n<li>Az \u00faj adatb\u00e1zis s\u00e9ma mindig l\u00e9p\u00e9sr\u0151l l\u00e9p\u00e9sre k\u00e9sz\u00fcl, m\u00e9g akkor is, ha csak egy oszlopot friss\u00edt\u00fcnk, teh\u00e1t el\u0151re, a leg\u00fajabb alkalmaz\u00e1sverzi\u00f3 kiad\u00e1sa el\u0151tt:<\/li>\n<li>\u00daj mez\u0151k ker\u00fclnek hozz\u00e1ad\u00e1sra, ahov\u00e1 az \u00e9ppen friss\u00edtett adatokat fogjuk r\u00f6gz\u00edteni. <\/li>\n<li>Az adatokat az \u00f6reg mez\u0151b\u0151l az \u00faj mez\u0151be kis r\u00e9szekben m\u00e1soljuk \u00e1t. Mi\u00e9rt csin\u00e1ljuk ezt? El\u0151sz\u00f6r is mindig ellen\u0151rizz\u00fck ennek a folyamatnak a menet\u00e9t. Tudjuk, hogy eddig ennyi k\u00f6teg adatot \u00e1tvitt\u00fcnk \u00e9s m\u00e9g ennyi van h\u00e1tra. <\/li>\n<li>A m\u00e1sodik pozit\u00edv hat\u00e1s, hogy minden ilyen k\u00f6teg k\u00f6z\u00f6tt lez\u00e1rjuk a tranzakci\u00f3t, nyitunk egy \u00fajat, \u00e9s ez lehet\u0151s\u00e9get ad az automatikus takar\u00edt\u00e1snak, hogy m\u0171k\u00f6dj\u00f6n a t\u00e1bl\u00e1n, megjel\u00f6li a halott sorokat \u00fajrahaszn\u00e1latra. <\/li>\n<li>Azok sz\u00e1m\u00e1ra, akik az alkalmaz\u00e1sunk m\u0171k\u00f6d\u00e9se sor\u00e1n fognak megjelenni (m\u00e9g mindig fut a r\u00e9gi alkalmaz\u00e1s), hozz\u00e1rendel\u00fcnk egy triggert, ami az \u00faj \u00e9rt\u00e9keket az \u00faj mez\u0151kbe \u00edrja. A mi eset\u00fcnkben ez az \u00f6reg \u00e9rt\u00e9k sz\u00e1zszoros\u00e1ra val\u00f3 szorz\u00e1sa. <\/li>\n<li>Ha teljesen makacsak vagyunk, \u00e9s ugyanazt a mez\u0151t akarjuk, akkor minden migr\u00e1ci\u00f3 befejez\u00e9se ut\u00e1n \u00e9s a leg\u00fajabb alkalmaz\u00e1s verzi\u00f3j\u00e1nak kiad\u00e1sa el\u0151tt egyszer\u0171en \u00e1tnevezz\u00fck a mez\u0151ket. A r\u00e9gieket valamif\u00e9le kital\u00e1lt n\u00e9vre, az \u00fajak pedig az \u00f6reg mez\u0151k nev\u00e9re. <\/li>\n<li>Csak ezt k\u00f6vet\u0151en ind\u00edtjuk el az \u00faj verzi\u00f3t. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ez\u00e1ltal nem fogunk bloatot kapni, \u00e9s nem romlik a teljes\u00edtm\u00e9ny. <\/p>\n<p><\/p>\n<p>Ezzel a harmadik t\u00f6rt\u00e9net v\u00e9get \u00e9rt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/2afab2906b5ccd30e4c8772248818057.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dataegret\/pg-utils\/blob\/master\/sql\/table_bloat.sql\">https:\/\/github.com\/dataegret\/pg-utils\/blob\/master\/sql\/table_bloat.sql<\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dataegret\/pg-utils\/blob\/master\/sql\/table_bloat_approx.sql\">https:\/\/github.com\/dataegret\/pg-utils\/blob\/master\/sql\/table_bloat_approx.sql<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Most pedig egy kicsit r\u00e9szletesebben az eszk\u00f6z\u00f6kr\u0151l, amelyeket az els\u0151 t\u00f6rt\u00e9netben eml\u00edtettem. <\/p>\n<p><\/p>\n<p>Bbefore searching for bloat, it is essential to install the extension. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/pgstattuple.html\">pgstattuple<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Annak \u00e9rdek\u00e9ben, hogy ne kelljen kital\u00e1lni a lek\u00e9rdez\u00e9seket, m\u00e1r meg\u00edrtuk \u0151ket a munk\u00e1nk sor\u00e1n. Ezeket haszn\u00e1lhatja. Itt k\u00e9t lek\u00e9rdez\u00e9s tal\u00e1lhat\u00f3. <\/p>\n<p><\/p>\n<ul>\n<li>Az els\u0151 lek\u00e9rdez\u00e9s meglehet\u0151sen hossz\u00fa ideig fut, de pontos \u00e9rt\u00e9keket fog mutatni a bloat-r\u00f3l a t\u00e1bl\u00e1zatban. <\/li>\n<li>A m\u00e1sodik gyorsabban m\u0171k\u00f6dik \u00e9s nagyon hat\u00e9kony, amikor gyorsan fel kell m\u00e9rni, hogy van-e bloat a t\u00e1bl\u00e1zatban. Ezenk\u00edv\u00fcl fontos meg\u00e9rteni, hogy a bloat mindig jelen van a Postgres t\u00e1bl\u00e1zatokban. Ez az MVCC modell saj\u00e1toss\u00e1ga. <\/li>\n<li>A 20% bloat norm\u00e1lis a t\u00e1bl\u00e1zatok eset\u00e9ben a legt\u00f6bb esetben. Teh\u00e1t nem kell agg\u00f3dnia, \u00e9s nem sz\u00fcks\u00e9ges t\u00f6m\u00f6r\u00edteni ezt a t\u00e1bl\u00e1t. <\/li>\n<\/ul>\n<p><\/p>\n<p>Mik\u00e9nt lehet azonos\u00edtani a megnagyobbodott t\u00e1bl\u00e1kat, m\u00e1r tiszt\u00e1ztuk, m\u00e9gpedig azokt\u00f3l a felesleges adatokat\u00f3l, amelyek megn\u00f6velt\u00e9k a m\u00e9ret\u00fcket. <\/p>\n<p><\/p>\n<p>Most pedig arr\u00f3l, hogyan lehet jav\u00edtani a bloat-ot:<\/p>\n<p><\/p>\n<ul>\n<li>Ha van egy kis t\u00e1bl\u00e1zatunk \u00e9s j\u00f3 lemezeink, azaz a t\u00e1bl\u00e1zat m\u00e9rete ak\u00e1r egy gigab\u00e1jt, \u00e9rdemes a VACUUM FULL-t haszn\u00e1lni. Ez p\u00e1r m\u00e1sodperces exkluz\u00edv z\u00e1rol\u00e1st ig\u00e9nyel a t\u00e1bl\u00e1zaton, de gyorsan \u00e9s hat\u00e9konyan v\u00e9gzi el a feladatot. Mi is a VACUUM FULL? Exkluz\u00edv z\u00e1rol\u00e1st hoz l\u00e9tre a t\u00e1bl\u00e1zaton, \u00e9s a r\u00e9gi t\u00e1bl\u00e1kr\u00f3l \u00e1tm\u00e1solja a jelenlegi sorokat egy \u00faj t\u00e1bl\u00e1zatba. V\u00e9g\u00fcl helyet cser\u00e9lnek. A r\u00e9gi f\u00e1jlok t\u00f6rl\u00e9se, az \u00faj f\u00e1jlok beilleszt\u00e9se a r\u00e9giek hely\u00e9re. Azonban a m\u0171k\u00f6d\u00e9se alatt exkluz\u00edv t\u00e1bl\u00e1zat z\u00e1rol\u00e1sra van sz\u00fcks\u00e9ge, ami azt jelenti, hogy nem lehet az adott t\u00e1bl\u00e1zathoz hozz\u00e1f\u00e9rni: sem \u00edrni bele, sem olvasni bel\u0151le, sem m\u00f3dos\u00edtani. A VACUUM FULL emellett tov\u00e1bbi lemezter\u00fcletet is ig\u00e9nyel az adatok elt\u00e1rol\u00e1s\u00e1hoz.<\/li>\n<li>A k\u00f6vetkez\u0151 eszk\u00f6z <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/reorg\/pg_repack\">pg_repack<\/a><\/noindex>. Alapelvei nagyon hasonl\u00edtanak a VACUUM FULL-ra, mert szint\u00e9n r\u00e9gi f\u00e1jlokb\u00f3l \u00faj f\u00e1jlokba m\u00e1solja az adatokat, majd cser\u00e9li \u0151ket a t\u00e1bl\u00e1zatban. De nem k\u00e9r exkluz\u00edv z\u00e1rol\u00e1st a t\u00e1bl\u00e1zaton a munka elej\u00e9n, csak akkor, amikor m\u00e1r k\u00e9szen \u00e1llnak az adatok a f\u00e1jlok cser\u00e9j\u00e9re. A lemezforr\u00e1sokkal kapcsolatos k\u00f6vetelm\u00e9nyei hasonl\u00f3ak mint a VACUUM FULL-nak. Teh\u00e1t sz\u00fcks\u00e9ge van plusz lemezter\u00fcletre, ami n\u00e9ha kritikus lehet, ha terab\u00e1jtos t\u00e1bl\u00e1k vannak. Emellett el\u00e9gg\u00e9 er\u0151forr\u00e1sig\u00e9nyes, mivel akt\u00edvan dolgozik a bemenet-kimenettel. <\/li>\n<li>A harmadik seg\u00e9deszk\u00f6z pedig <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dataegret\/pgcompacttable\">pgcompacttable<\/a><\/noindex>. A pgcompacttable jobban k\u00edm\u00e9li az er\u0151forr\u00e1sokat, mert kiss\u00e9 m\u00e1s elvek szerint m\u0171k\u00f6dik. A pgcompacttable l\u00e9nyeg\u00e9ben azzal foglalkozik, hogy az \u00f6sszes akt\u00edv sort el\u00f6l tartja a t\u00e1bl\u00e1zatban a friss\u00edt\u00e9sek sor\u00e1n. Ezut\u00e1n futtat egy takar\u00edt\u00e1st a t\u00e1bl\u00e1zaton, mivel tudjuk, hogy el\u00f6l tal\u00e1lhat\u00f3k az \u00e9l\u0151, h\u00e1tul pedig a holt sorok. A takar\u00edt\u00e1s pedig lev\u00e1lasztja ezt a 'farkat', teh\u00e1t nem ig\u00e9nyel t\u00fal sok plusz lemezter\u00fcletet. R\u00e1ad\u00e1sul az er\u0151forr\u00e1sait is lehet optimaliz\u00e1lni. <\/li>\n<\/ul>\n<p><\/p>\n<p>Minden eszk\u00f6zzel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"T\u00edpikus hib\u00e1k az alkalmaz\u00e1sokban, amelyek bloatot okoznak a postgresql-ben. Andrej Szalnyikov\" src=\"\/wp-content\/uploads\/2020\/05\/4187915e54e54a0b85a342fe0280f78f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha a bloat t\u00e9ma \u00e9rdekesnek t\u0171nik sz\u00e1modra a tov\u00e1bbi m\u00e9lyebb belen\u00e9z\u00e9s szempontj\u00e1b\u00f3l, itt van n\u00e9h\u00e1ny hasznos link:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/alexius2Mb\/where-is-the-space-postgres\">https:\/\/www.slideshare.net\/alexius2Mb\/where-is-the-space-postgres<\/a><\/noindex> \u2013 ez a koll\u00e9g\u00e1m el\u0151ad\u00e1sa. \u00c1tfog\u00f3an arr\u00f3l sz\u00f3l, hogy hova t\u0171nik el a hely a Postgres m\u0171k\u00f6d\u00e9se \u00e9s \u00e9lete sor\u00e1n. Nagy \u00e9s r\u00e9szletes technikai r\u00e9sz tal\u00e1lhat\u00f3 benne az adatb\u00e1zis-adminisztr\u00e1torok sz\u00e1m\u00e1ra a bloat-r\u00f3l. <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dataegret\/pg-utils\">https:\/\/github.com\/dataegret\/pg-utils<\/a><\/noindex> \u2013 ez a link a mi t\u00e1rol\u00f3nkhoz, ahol sok hasznos szkriptet t\u00e1rolunk az adatb\u00e1zis \u00e1llapot\u00e1nak ellen\u0151rz\u00e9s\u00e9re. Itt tal\u00e1lhatsz bloat keres\u00e9s\u00e9re szolg\u00e1l\u00f3 szkripteket. <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/reorg\/pg_repack\">Harmadik<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dataegret\/pgcompacttable\">negyedik<\/a><\/noindex> linkek az eszk\u00f6z\u00f6kh\u00f6z, amelyek seg\u00edtenek a t\u00e1bl\u00e1zatok optimaliz\u00e1l\u00e1s\u00e1ban. <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/blog.dataegret.com\/2Mb018\/03\/postgresql-bloatbusters.html\">http:\/\/blog.dataegret.com\/2Mb018\/03\/postgresql-bloatbusters.html<\/a><\/noindex> \u2013 ez a koll\u00e9g\u00e1m bejegyz\u00e9se. Itt el\u00e9g alaposan \u00e9s technikailag t\u00e1rgyalja a bloat-ot, k\u00f6zvetlen\u00fcl az adminisztr\u00e1torok szintj\u00e9n. <\/li>\n<\/ul>\n<p><\/p>\n<p>Itt ink\u00e1bb ezt a 'sz\u00f6rny\u0171s\u00e9get' pr\u00f3b\u00e1ltam bemutatni a fejleszt\u0151knek, mivel \u0151k k\u00f6zvetlen\u00fcl a mi adatb\u00e1zisaink \u00fcgyfelei, \u00e9s meg kell \u00e9rteni\u00fck, hogy bizonyos int\u00e9zked\u00e9sek milyen k\u00f6vetkezm\u00e9nyekkel j\u00e1rhatnak. Rem\u00e9lem, siker\u00fclt. K\u00f6sz\u00f6n\u00f6m a figyelmet!<\/p>\n<p><\/p>\n<p>K\u00e9rd\u00e9sek<\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m az el\u0151ad\u00e1st! Arr\u00f3l besz\u00e9lt, hogyan lehet azonos\u00edtani a probl\u00e9m\u00e1kat. De hogyan lehet ezeket megel\u0151zni? Volt egy helyzetem, amikor a lek\u00e9rdez\u00e9sek nemcsak k\u00fcls\u0151 szolg\u00e1ltat\u00e1sokra val\u00f3 hivatkoz\u00e1s miatt akadtak meg. Csak valamilyen furcsa egyes\u00edt\u00e9sek voltak. Volt n\u00e9h\u00e1ny kicsi, \u00e1rtalmatlan lek\u00e9rdez\u00e9s, amelyek 24 \u00f3r\u00e1n kereszt\u00fcl akadtak, majd valami furcs\u00e1t kezdtek el m\u0171velni. Nagyon hasonl\u00edt arra, amit le\u00edrt\u00e1l. Hogyan lehet ezt nyomon k\u00f6vetni? \u00dcln\u00f6m kellene \u00e9s folyamatosan figyelnem, hogy melyik lek\u00e9rdez\u00e9s akadt meg? Hogyan lehet ezt megel\u0151zni?<\/em><\/p>\n<p><\/p>\n<p>Ebben az esetben \u2013 ez a c\u00e9g\u00fck adminisztr\u00e1tor\u00e1nak a feladata, nem felt\u00e9tlen\u00fcl a DBA-\u00e9.<\/p>\n<p><\/p>\n<p><em>\u00c9n adminisztr\u00e1tor vagyok.<\/em><\/p>\n<p><\/p>\n<p>A PostgreSQL-ben van egy pg_stat_activity n\u00e9zet, amely megmutatja a leragadt lek\u00e9rdez\u00e9seket. \u00cdgy l\u00e1thatod, hogy mennyi ideig akadtak meg.<\/p>\n<p><\/p>\n<p><em>Minden 5 percben be kell l\u00e9pnem, \u00e9s megn\u00e9znem?<\/em><\/p>\n<p><\/p>\n<p>\u00c1ll\u00edtsd be a cron-t \u00e9s ellen\u0151rizd. Ha hossz\u00fa k\u00e9r\u00e9sed van, \u00edrj egy levelet, \u00e9s ennyi. Vagyis nem kell a szemednek n\u00e9znie, ezt automatiz\u00e1lni lehet. \u00c9rkezik egy lev\u00e9l, amire reag\u00e1lsz. Vagy automatikusan is el\u00e9rheted.<\/p>\n<p><\/p>\n<p><em>Vannak vil\u00e1gos okai, ami\u00e9rt ez t\u00f6rt\u00e9nik?<\/em><\/p>\n<p><\/p>\n<p>N\u00e9h\u00e1nyat m\u00e1r felsoroltam. M\u00e1sok bonyolultabb p\u00e9ld\u00e1k, \u00e9s ott a besz\u00e9lget\u00e9s hossz\u00fa lehet.<\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m a besz\u00e1mol\u00f3t! A pg_repack eszk\u00f6zr\u0151l szeretn\u00e9k k\u00e9rdezni. Ha nem hoz l\u00e9tre kiz\u00e1r\u00f3lagos z\u00e1rol\u00e1st, akkor...<\/em><\/p>\n<p><\/p>\n<p>Kiz\u00e1r\u00f3lagos z\u00e1rol\u00e1st hoz l\u00e9tre. <\/p>\n<p><\/p>\n<p>\u2026 <em>akkor potenci\u00e1lisan adatokat vesz\u00edthetek. Az alkalmaz\u00e1somnak nem szabadna semmit \u00edrnia ilyenkor?<\/em><\/p>\n<p><\/p>\n<p>Nem, az nyugodtan m\u0171k\u00f6dik a t\u00e1bl\u00e1val, vagyis a pg_repack el\u0151sz\u00f6r \u00e1thelyezi az \u00f6sszes \u00e9l\u0151 sort, ami van. Term\u00e9szetesen t\u00f6rt\u00e9nik valamilyen \u00edr\u00e1s a t\u00e1bl\u00e1ba. Csak ezt a v\u00e9gs\u0151 r\u00e9szt dobja hozz\u00e1. <\/p>\n<p><\/p>\n<p><em>Vagyis a v\u00e9g\u00e9n m\u00e9giscsak csin\u00e1lja?<\/em><\/p>\n<p><\/p>\n<p>A v\u00e9g\u00e9n kiz\u00e1r\u00f3lagos z\u00e1rol\u00e1st vesz a f\u00e1jlok felcser\u00e9l\u00e9s\u00e9hez. <\/p>\n<p><\/p>\n<p><em>Ez gyorsabb lesz, mint a VACUUM FULL?<\/em><\/p>\n<p><\/p>\n<p>A VACUUM FULL, amikor elkezd\u0151d\u00f6tt, azonnal kiz\u00e1r\u00f3lagos z\u00e1rol\u00e1st vett. \u00c9s am\u00edg mindent el nem v\u00e9gez, nem oldja fel. A pg_repack csak a f\u00e1jlok cser\u00e9j\u00e9nek pillanat\u00e1ban hoz l\u00e9tre kiz\u00e1r\u00f3lagos z\u00e1rol\u00e1st. Ebben a pillanatban nem \u00edrsz oda, de az adatok nem vesznek el, minden rendben lesz. <\/p>\n<p><\/p>\n<p><em>Hell\u00f3! Mes\u00e9lt\u00e9l az autov\u00e1kuum m\u0171k\u00f6d\u00e9s\u00e9r\u0151l. Volt egy diagram piros, s\u00e1rga \u00e9s z\u00f6ld cell\u00e1kkal. Vagyis a s\u00e1rg\u00e1kat t\u00f6r\u00f6ltnek jel\u00f6lte. Teh\u00e1t ezekbe lehet \u00faj dolgokat \u00edrni?<\/em><\/p>\n<p><\/p>\n<p>Igen. A Postgres nem t\u00f6rli a sorokat. Ennek ilyen a saj\u00e1toss\u00e1ga. Ha friss\u00edtett\u00fcnk egy sort, a r\u00e9gi sor t\u00f6r\u00f6ltk\u00e9nt van megjel\u00f6lve. Azt a tranzakci\u00f3 azonos\u00edt\u00f3ja \u00e1ll\u00edtja be, amelyik ezt a sort megv\u00e1ltoztatta, \u00e9s be\u00edrjuk az \u00faj sort. \u00c9s vannak olyan session\u00f6k, amelyek potenci\u00e1lisan olvashatj\u00e1k \u0151ket. Egy id\u0151 ut\u00e1n ezek m\u00e1r nagyon \u00f6regg\u00e9 v\u00e1lnak. Az autov\u00e1kuum m\u0171k\u00f6d\u00e9s\u00e9nek l\u00e9nyege, hogy \u00e1tfut ezeken a sorokon \u00e9s megjel\u00f6li \u0151ket feleslegesnek. \u00c9s oda \u00faj adatokat lehet \u00edrni. <\/p>\n<p><\/p>\n<p><em>\u00c9rtem. De a k\u00e9rd\u00e9s egy kicsit nem err\u0151l sz\u00f3l. Nem fejeztem be. Tegy\u00fck fel, hogy van egy t\u00e1bl\u00e1nk. Van benne v\u00e1ltoz\u00f3 m\u00e9ret\u0171 mez\u0151. \u00c9s ha megpr\u00f3b\u00e1lok valamit \u00fajonnan beilleszteni, akkor az a r\u00e9gi cell\u00e1ba egyszer\u0171en nem f\u00e9r be.<\/em> <\/p>\n<p><\/p>\n<p>Nem, ott \u00edgyis \u00fagyis friss\u00fcl az eg\u00e9sz sor. A Postgresben k\u00e9t adatt\u00e1rol\u00e1si modell l\u00e9tezik. Att\u00f3l f\u00fcgg, hogy milyen t\u00edpus\u00fa adatokr\u00f3l van sz\u00f3. Vannak adatok, amelyek k\u00f6zvetlen\u00fcl a t\u00e1bl\u00e1ban tal\u00e1lhat\u00f3k, \u00e9s vannak tov\u00e1bbi tos-adatok. Ezek nagy mennyis\u00e9g\u0171 adatok: sz\u00f6veg, json. Ezek k\u00fcl\u00f6n t\u00e1bl\u00e1kban vannak t\u00e1rolva. \u00c9s ezen t\u00e1bl\u00e1k eset\u00e9ben is ugyanez a helyzet a bloat-tal, teh\u00e1t minden ugyanolyan. Csak k\u00fcl\u00f6n vannak kezelve. <\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m a prezent\u00e1ci\u00f3t! Mennyire elfogadhat\u00f3 a k\u00e9rd\u00e9sek id\u0151tartam\u00e1nak korl\u00e1toz\u00e1s\u00e1ra a statement timeout haszn\u00e1lata?<\/em><\/p>\n<p><\/p>\n<p>Nagyon elfogadhat\u00f3. Mi ezt mindenhol haszn\u00e1ljuk. Mivel nincsenek saj\u00e1t szolg\u00e1ltat\u00e1saink, t\u00e1voli t\u00e1mogat\u00e1st ny\u00fajtunk, \u00edgy el\u00e9gg\u00e9 k\u00fcl\u00f6nb\u00f6z\u0151 \u00fcgyfeleink vannak. Mindenkit teljes m\u00e9rt\u00e9kben kiel\u00e9g\u00edt ez. Teh\u00e1t vannak cron feladataink, amelyek ellen\u0151rzik. Egyszer\u0171en egyeztetj\u00fck az \u00fcgyf\u00e9llel a munkamenetek id\u0151tartam\u00e1t, amely el\u0151tt nem z\u00e1rjuk le. Ez lehet egy perc, lehet 10 perc is. Ez az adatb\u00e1zis terhel\u00e9s\u00e9t\u0151l \u00e9s c\u00e9lj\u00e1t\u00f3l f\u00fcgg. De mindannyian a pg_stat_activity-t haszn\u00e1ljuk.<\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m a prezent\u00e1ci\u00f3t! Pr\u00f3b\u00e1lom alkalmazni a prezent\u00e1ci\u00f3j\u00e1t az alkalmaz\u00e1saimra. \u00dagy t\u0171nik, hogy minden\u00fctt elind\u00edtunk egy tranzakci\u00f3t, minden\u00fctt egy\u00e9rtelm\u0171en befejezz\u00fck azt. Ha valamilyen kiv\u00e9tel t\u00f6rt\u00e9nik, akkor is rollback t\u00f6rt\u00e9nik. \u00c9s itt elgondolkodtam. Hiszen lehet, hogy a tranzakci\u00f3 nem egy\u00e9rtelm\u0171en indul el. Ez tal\u00e1n egy tipp a h\u00f6lgynek. Ha egyszer\u0171en csak friss\u00edtek egy rekordot, akkor a tranzakci\u00f3 elindul a PostgreSQL-ben, \u00e9s csak akkor fejez\u0151dik be, amikor a kapcsolat megszakad?<\/em><\/p>\n<p><\/p>\n<p>Ha most az alkalmaz\u00e1s szintj\u00e9r\u0151l besz\u00e9l\u00fcnk, akkor ez att\u00f3l f\u00fcgg, hogy melyik drivert haszn\u00e1lja, melyik ORM van haszn\u00e1latban. Itt nagyon sok be\u00e1ll\u00edt\u00e1s van. Ha az auto commit on van enged\u00e9lyezve, akkor a tranzakci\u00f3 elindul, majd azonnal befejez\u0151dik.<\/p>\n<p><\/p>\n<p><em>Teh\u00e1t azonnal a friss\u00edt\u00e9s ut\u00e1n z\u00e1r\u00f3dik le?<\/em><\/p>\n<p><\/p>\n<p>Ez a be\u00e1ll\u00edt\u00e1sokt\u00f3l f\u00fcgg. Egy be\u00e1ll\u00edt\u00e1st m\u00e1r eml\u00edtettem. Ez az auto commit on. Ez meglehet\u0151sen elterjedt. Ha enged\u00e9lyezve van, akkor a tranzakci\u00f3 nyitva \u00e1llt, majd be is z\u00e1rult. Ha nem mondtad ki egy\u00e9rtelm\u0171en a \u201estart transaction\u201d \u00e9s \u201eend transaction\u201d parancsokat, hanem csak egy lek\u00e9rdez\u00e9st ind\u00edtott\u00e1l a munkamenetben. <\/p>\n<p><\/p>\n<p><em>\u00dcdv\u00f6zl\u00f6m! K\u00f6sz\u00f6n\u00f6m a prezent\u00e1ci\u00f3t! Tegy\u00fck fel, hogy van egy adatb\u00e1zisunk, amely folyamatosan n\u0151 \u00e9s a szerveren elfogy a hely. Vannak valamilyen eszk\u00f6z\u00f6k erre a helyzet megold\u00e1s\u00e1ra?<\/em> <\/p>\n<p><\/p>\n<p>A szerveren tal\u00e1lhat\u00f3 helyet \u00e9rdemes figyelni. <\/p>\n<p><\/p>\n<p><em>P\u00e9ld\u00e1ul, ha a DBA elment te\u00e1zni, nyaral\u00e1sra ment stb.<\/em><\/p>\n<p><\/p>\n<p>Amikor f\u00e1jlrendszert hoznak l\u00e9tre, akkor legal\u00e1bb valamilyen tartal\u00e9k helyet foglalnak, ahov\u00e1 nem \u00edrnak adatokat. <\/p>\n<p><\/p>\n<p><em>Mi van, ha teljesen null\u00e1ra cs\u00f6kkentj\u00fck?<\/em><\/p>\n<p><\/p>\n<p>Ez ak\u00e1r 'foglaltnak' is nevezhet\u0151, ami azt jelenti, hogy felszabad\u00edthat\u00f3, \u00e9s att\u00f3l f\u00fcgg\u0151en, hogy mennyire nagyra hozt\u00e1k l\u00e9tre, szabad helyet kapt\u00e1l. Alap\u00e9rtelmez\u00e9s szerint nem tudom, mennyi hely van ott. Egy m\u00e1sik esetben \u2013 lemezeket kell hozni, hogy legyen hely a helyre\u00e1ll\u00edt\u00e1si m\u0171velethez. T\u00f6r\u00f6lhetsz egy t\u00e1bl\u00e1t, amelynek garant\u00e1ltan nincs sz\u00fcks\u00e9ge. <\/p>\n<p><\/p>\n<p><em>Nincsenek m\u00e1s eszk\u00f6z\u00f6k?<\/em><\/p>\n<p><\/p>\n<p>Ez mindig manu\u00e1lis munka. A helysz\u00ednen der\u00fcl ki, hogy mit \u00e9rdemes tenni, mert vannak kritikus \u00e9s nem kritikus adatok. \u00c9s minden adatb\u00e1zis \u00e9s alkalmaz\u00e1s, amely vele dolgozik, a v\u00e1llalkoz\u00e1st\u00f3l f\u00fcgg. Mindig a helysz\u00ednen d\u0151l el. <\/p>\n<p><\/p>\n<p><em>K\u00f6sz\u00f6n\u00f6m a bemutat\u00f3t! K\u00e9t k\u00e9rd\u00e9sem van. El\u0151sz\u00f6r is, a bemutat\u00f3 sor\u00e1n azt l\u00e1ttam, hogy ha egy tranzakci\u00f3 leragad, akkor n\u0151 mind a t\u00e1bl\u00e1zati t\u00e9rfogat, mind az index m\u00e9rete. A bemutat\u00f3ban volt sok eszk\u00f6z, amelyek a t\u00e1bl\u00e1t t\u00f6m\u00f6r\u00edtik. Mi a helyzet az indexel?<\/em><\/p>\n<p><\/p>\n<p>Ezeket is t\u00f6m\u00f6r\u00edtik. <\/p>\n<p><\/p>\n<p><em>De a v\u00e1kuum nem \u00e9rinti az indexet?<\/em><\/p>\n<p><\/p>\n<p>N\u00e9h\u00e1ny eszk\u00f6z dolgozik az indexszel. P\u00e9ld\u00e1ul a pg_rapack, pgcompacttable. A v\u00e1kuum \u00fajraalkotja az indexeket, \u00e9rinti \u0151ket. A VACUUM FULL l\u00e9nyege, hogy mindent \u00fajra\u00edrjon, vagyis mindenkivel dolgozik. <\/p>\n<p><\/p>\n<p><em>A m\u00e1sodik k\u00e9rd\u00e9sem. Nem \u00e9rtettem, mi\u00e9rt f\u00fcggnek a jelent\u00e9sek ennyire a replik\u00e1ci\u00f3t\u00f3l. \u00dagy t\u0171nt, hogy a jelent\u00e9sek \u2013 ezek olvas\u00e1sok, m\u00edg a replik\u00e1ci\u00f3 \u2013 \u00edr\u00e1s.<\/em> <\/p>\n<p><\/p>\n<p>Miben \u00e1ll a replik\u00e1ci\u00f3s konfliktus? Van egy Mester\u00fcnk, ahol a folyamatok zajlanak. Ott avtv\u00e1kuum t\u00f6rt\u00e9nik. Az avtv\u00e1kuum val\u00f3j\u00e1ban mit csin\u00e1l? Elt\u00e1vol\u00edt n\u00e9h\u00e1ny r\u00e9gi sort. Ha ebben az id\u0151ben a replik\u00e1n egy k\u00e9r\u00e9s zajlik, amely ezekr\u0151l a r\u00e9gi sorokr\u00f3l olvas, \u00e9s a Mester\u00fcnkn\u00e9l az avtv\u00e1kuum azokat a sorokat rekviz\u00edrozta, mint amelyek \u00fajra\u00edr\u00e1sra alkalmasak, akkor \u00fajra\u00edrtuk \u0151ket. \u00c9s meg\u00e9rkezett egy adatcsomag, amikor \u00fajra kellene \u00edrni azokat a sorokat, amelyek sz\u00fcks\u00e9gesek a replik\u00e1n l\u00e9v\u0151 k\u00e9r\u00e9shez. A replik\u00e1ci\u00f3s folyamat megv\u00e1rja azt az id\u0151t\u00fall\u00e9p\u00e9st, amelyet be\u00e1ll\u00edtott\u00e1l. Azt\u00e1n a PostgreSQL eld\u00f6nti, mi fontosabb. A replik\u00e1ci\u00f3 fontosabb sz\u00e1m\u00e1ra, mint a k\u00e9rd\u00e9s, \u00e9s le\u00e1ll\u00edtja a k\u00e9rd\u00e9st, hogy v\u00e9grehajtsa ezeket a v\u00e1ltoztat\u00e1sokat a replik\u00e1n. <\/p>\n<p><\/p>\n<p><em>Andr\u00e1s, van egy k\u00e9rd\u00e9sem. Ezek a csod\u00e1s grafikonok, amelyeket a prezent\u00e1ci\u00f3 sor\u00e1n mutatt\u00e1l, a te eszk\u00f6z\u00f6d munk\u00e1j\u00e1nak az eredm\u00e9nyei? Mivel k\u00e9sz\u00edtetted a grafikonokat?<\/em><\/p>\n<p><\/p>\n<p>Ez egy szolg\u00e1ltat\u00e1s <noindex><a rel=\"nofollow\" href=\"https:\/\/okmeter.io\/\">Okmeter<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><em>Ez egy kereskedelmi term\u00e9k?<\/em><\/p>\n<p><\/p>\n<p>Igen. Ez egy kereskedelmi term\u00e9k.<\/p>\n<p>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/501040\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0410\u043d\u0434\u0440\u0435\u044f \u0421\u0430\u043b\u044c\u043d\u0438\u043a\u043e\u0432\u0430 &quot;\u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0434\u0443\u0442 \u043a bloat \u0432 postgresql&quot; \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418 \u0432\u043e\u0437\u044c\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0434\u0443\u0442 \u043a bloat \u0432 Postgresql. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u044d\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81090,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81089","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=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0410\u043d\u0434\u0440\u0435\u044f \u0421\u0430\u043b\u044c\u043d\u0438\u043a\u043e\u0432\u0430 &quot;\u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0434\u0443\u0442 \u043a bloat \u0432 postgresql&quot; \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435.\" \/>\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\/hu\/blog\/administrirovanie\/tipovye-oshibki-v-prilozheniyah-kotorye-vedut-k-bloat-v-postgresql-andrej-salnikov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0434\u0443\u0442 \u043a bloat \u0432 postgresql. \u0410\u043d\u0434\u0440\u0435\u0439 \u0421\u0430\u043b\u044c\u043d\u0438\u043a\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0410\u043d\u0434\u0440\u0435\u044f \u0421\u0430\u043b\u044c\u043d\u0438\u043a\u043e\u0432\u0430 &quot;\u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0434\u0443\u0442 \u043a bloat \u0432 postgresql&quot; \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/tipovye-oshibki-v-prilozheniyah-kotorye-vedut-k-bloat-v-postgresql-andrej-salnikov\" \/>\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-05-10T23:42:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-10T23:42:24+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\udd47Tipikus hib\u00e1k alkalmaz\u00e1sokban, amelyek bloat-ot okoznak a postgresql-ben. Andr\u00e1s Ssalnyikov | ProHoster","description":"Aj\u00e1nlom, hogy n\u00e9zd meg Andrej Ssalnyikov 2016 eleji el\u0151ad\u00e1s\u00e1nak \u00f6sszefoglal\u00f3j\u00e1t, amely a \"Tipikus hib\u00e1k alkalmaz\u00e1sokban, amelyek bloat-ot okoznak a postgresql-ben\" t\u00e9m\u00e1t \u00f6leli fel. Ebben az el\u0151ad\u00e1sban a f\u0151bb pontokat elemezni fogom.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/tipovye-oshibki-v-prilozheniyah-kotorye-vedut-k-bloat-v-postgresql-andrej-salnikov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0434\u0443\u0442 \u043a bloat \u0432 postgresql. \u0410\u043d\u0434\u0440\u0435\u0439 \u0421\u0430\u043b\u044c\u043d\u0438\u043a\u043e\u0432 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0410\u043d\u0434\u0440\u0435\u044f \u0421\u0430\u043b\u044c\u043d\u0438\u043a\u043e\u0432\u0430 &quot;\u0422\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0434\u0443\u0442 \u043a bloat \u0432 postgresql&quot; \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/tipovye-oshibki-v-prilozheniyah-kotorye-vedut-k-bloat-v-postgresql-andrej-salnikov","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-05-10T23:42:24+00:00","article:modified_time":"2020-05-10T23:42:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81089","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 16:05:22","updated":"2022-09-27 16:01:50","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/81089","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=81089"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/81089\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/81090"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=81089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=81089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=81089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}