{"id":39169,"date":"2019-10-31T22:28:14","date_gmt":"2019-10-31T19:28:14","guid":{"rendered":"https:\/\/prohoster.info\/blog\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya\/"},"modified":"2019-10-31T22:28:14","modified_gmt":"2019-10-31T19:28:14","slug":"postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya","title":{"rendered":"PostgreSQL a nastaven\u00ed konzistence z\u00e1pisu pro ka\u017ed\u00e9 konkr\u00e9tn\u00ed p\u0159ipojen\u00ed","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><em>P\u0159eklad \u010dl\u00e1nku byl p\u0159ipraven speci\u00e1ln\u011b pro studenty kurzu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/jCX0\/\">\u201eDatab\u00e1ze\u201c<\/a><\/noindex>. Chcete se rozv\u00edjet v t\u00e9to oblasti? Zveme v\u00e1s na <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/jCX0\/\">Den Otev\u0159en\u00fdch Dve\u0159\u00ed<\/a><\/noindex>, kde podrobn\u011b p\u0159edstav\u00edme program, zvl\u00e1\u0161tnosti online form\u00e1tu, kompetence a kari\u00e9rn\u00ed vyhl\u00eddky, kter\u00e9 \u010dekaj\u00ed na absolventy po ukon\u010den\u00ed studia.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a nastaven\u00ed konzistence z\u00e1pisu pro ka\u017ed\u00e9 konkr\u00e9tn\u00ed p\u0159ipojen\u00ed\" src=\"\/wp-content\/uploads\/2019\/10\/e69e30ba059af157f021c9cb33a59f51.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>PostgreSQL a nastaven\u00ed konzistence z\u00e1pisu pro ka\u017ed\u00e9 konkr\u00e9tn\u00ed p\u0159ipojen\u00ed<br \/>\nV Compose m\u00e1me co do \u010din\u011bn\u00ed s mnoha datab\u00e1zemi, co\u017e n\u00e1m umo\u017e\u0148uje bl\u00ed\u017ee se sezn\u00e1mit s jejich funkcionalitou a nedostatky. Jak se u\u010d\u00edme m\u00edt r\u00e1di funk\u010dn\u00ed vlastnosti nov\u00fdch datab\u00e1z\u00ed, ob\u010das p\u0159em\u00fd\u0161l\u00edme o tom, jak skv\u011bl\u00e9 by bylo, kdyby podobn\u00e9 funkce byly k dispozici i v mnohem vysp\u011blej\u0161\u00edch n\u00e1stroj\u00edch, se kter\u00fdmi ji\u017e dlouho pracujeme. Jednou z nov\u00fdch funkc\u00ed, kterou jsme cht\u011bli vid\u011bt v PostgreSQL, byla nastavitelnost konzistence z\u00e1pisu podle p\u0159ipojen\u00ed v cel\u00e9m clusteru. A jak se uk\u00e1zalo, u\u017e ji m\u00e1me, a dnes se s v\u00e1mi chceme pod\u011blit o informace o tom, jak ji m\u016f\u017eete vyu\u017e\u00edt.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"zachem-mne-eto\">Pro\u010d mi to je?<\/h1>\n<p><\/p>\n<p>To, jak se m\u00e1 cluster chovat, z\u00e1vis\u00ed na va\u0161\u00ed aplikaci. Vezm\u011bme si jako p\u0159\u00edklad aplikaci pro placen\u00ed \u00fa\u010dt\u016f. Budete pot\u0159ebovat stoprocentn\u00ed konzistenci v clusteru, a proto budete muset zapnout synchronn\u00ed potvrzen\u00ed, aby va\u0161e datab\u00e1ze \u010dekala, a\u017e budou v\u0161echny zm\u011bny provedeny. Pokud je v\u0161ak va\u0161e aplikace rychle se vyv\u00edjej\u00edc\u00ed soci\u00e1ln\u00ed s\u00ed\u0165, pak bezpochyby up\u0159ednostn\u00edte rychlou odezvu p\u0159ed stoprocentn\u00ed konzistenc\u00ed. K tomu, abyste toho dos\u00e1hli, m\u016f\u017eete ve sv\u00e9m clusteru pou\u017e\u00edt asynchronn\u00ed potvrzen\u00ed.<\/p>\n<p><\/p>\n<h2 id=\"znakomtes-kompromiss\">Seznamte se, kompromis<\/h2>\n<p><\/p>\n<p>Mus\u00edte ud\u011blat kompromis mezi konzistenc\u00ed dat a v\u00fdkonem. PostgreSQL se od konzistence odkl\u00e1n\u00ed, proto\u017ee v\u00fdchoz\u00ed konfigurace je p\u0159edv\u00eddateln\u00e1 a bez p\u0159ekvapen\u00ed. Nyn\u00ed se poj\u010fme sezn\u00e1mit s kompromisy.<\/p>\n<p><\/p>\n<h3 id=\"kompromiss-1-proizvoditelnost\">Kompromis 1: V\u00fdkon<\/h3>\n<p><\/p>\n<p>Pokud klastru PostgreSQL nen\u00ed vy\u017eadov\u00e1na konzistence, m\u016f\u017ee fungovat asynchronn\u011b. Z\u00e1pis se prov\u00e1d\u00ed na vedouc\u00edm uzlu klastru, jeho repliky obdr\u017e\u00ed aktualizace b\u011bhem n\u011bkolika milisekund. Kdy\u017e je klastru PostgreSQL pot\u0159ebn\u00e1 konzistence, mus\u00ed fungovat synchronn\u011b. Z\u00e1pis bude proveden na vedouc\u00edm uzlu klastru, kter\u00fd ode\u0161le aktualizaci replik\u00e1m a po\u010dk\u00e1 na potvrzen\u00ed, \u017ee ka\u017ed\u00e1 provedla z\u00e1pis, ne\u017e po\u0161le potvrzen\u00ed klientovi, kter\u00fd inicioval z\u00e1pis, \u017ee prob\u011bhl \u00fasp\u011b\u0161n\u011b. Praktick\u00fd rozd\u00edl mezi t\u011bmito p\u0159\u00edstupy spo\u010d\u00edv\u00e1 v tom, \u017ee asynchronn\u00ed metoda vy\u017eaduje dva s\u00ed\u0165ov\u00e9 skoky, zat\u00edmco synchronn\u00ed \u010dty\u0159i. <\/p>\n<p><\/p>\n<h3 id=\"kompromiss-2-soglasovannost\">Komprosi 2: Konzistence<\/h3>\n<p><\/p>\n<p>V\u00fdsledek v p\u0159\u00edpad\u011b selh\u00e1n\u00ed vedouc\u00edho uzlu v t\u011bchto dvou p\u0159\u00edstupech bude tak\u00e9 odli\u0161n\u00fd. Pokud se pr\u00e1ce prov\u00e1d\u00ed asynchronn\u011b, p\u0159i takov\u00e9 chyb\u011b nebudou v\u0161echny z\u00e1pisy potvrzeny replikami. Kolik bude ztraceno? To z\u00e1vis\u00ed na samotn\u00e9 aplikaci a efektivit\u011b replikace. Replikace Compose zabr\u00e1n\u00ed replikaci st\u00e1t se vedouc\u00edm uzlem, pokud mno\u017estv\u00ed informac\u00ed v n\u00ed je o 1 MB m\u00e9n\u011b ne\u017e v vedouc\u00edm uzlu, co\u017e znamen\u00e1, \u017ee potenci\u00e1ln\u011b m\u016f\u017ee b\u00fdt ztraceno a\u017e 1 MB z\u00e1pis\u016f p\u0159i asynchronn\u00ed \u010dinnosti. <\/p>\n<p><\/p>\n<p>V synchronn\u00edm re\u017eimu k tomu nedoch\u00e1z\u00ed. Pokud vedouc\u00ed uzel sel\u017ee, v\u0161echny repliky se aktualizuj\u00ed, proto\u017ee jak\u00fdkoli z\u00e1pis potvrzen\u00fd na vedouc\u00edm uzlu mus\u00ed b\u00fdt potvrzen v replik\u00e1ch. Toto je konzistence. <\/p>\n<p><\/p>\n<p>Synchronn\u00ed chov\u00e1n\u00ed m\u00e1 smysl pou\u017e\u00edt v aplikaci pro placen\u00ed \u00fa\u010dt\u016f, kde m\u00e1 konzistence jasnou v\u00fdhodu v hled\u00e1n\u00ed kompromisu mezi konzistenc\u00ed a v\u00fdkonem. Nejv\u011bt\u0161\u00ed d\u016fle\u017eitost\u00ed pro takovou aplikaci jsou validn\u00ed data. A nyn\u00ed si vzpome\u0148te na soci\u00e1ln\u00ed s\u00ed\u0165, kde je hlavn\u00edm \u00fakolem udr\u017eet pozornost u\u017eivatele t\u00edm, \u017ee odpov\u00edd\u00e1te na dotazy co nejrychleji. V takov\u00e9m p\u0159\u00edpad\u011b bude v\u00fdkon s men\u0161\u00edm po\u010dtem s\u00ed\u0165ov\u00fdch skok\u016f a krat\u0161\u00edmi \u010dekac\u00edmi dobami pro potvrzen\u00ed prioritou. Nicm\u00e9n\u011b kompromis mezi v\u00fdkonem a konzistenc\u00ed nen\u00ed jedin\u00fd, o kter\u00e9m je t\u0159eba p\u0159em\u00fd\u0161let.<\/p>\n<p><\/p>\n<h3 id=\"kompromiss-3-sboi\">Komprosi 3: Selh\u00e1n\u00ed<\/h3>\n<p><\/p>\n<p>Je velmi d\u016fle\u017eit\u00e9 pochopit, jak se cluster chov\u00e1 b\u011bhem selh\u00e1n\u00ed. Zva\u017eme situaci, kdy sel\u017ee jedna nebo v\u00edce replik. Kdy\u017e jsou z\u00e1pisy zpracov\u00e1v\u00e1ny asynchronn\u011b, v\u016fdce bude pokra\u010dovat v \u010dinnosti, tedy p\u0159ij\u00edmat a zpracov\u00e1vat z\u00e1pisy, ani\u017e by \u010dekal na chyb\u011bj\u00edc\u00ed repliky. Kdy\u017e se repliky vr\u00e1t\u00ed do clusteru, do\u017eenou v\u016fdce. P\u0159i synchronn\u00ed replikaci, pokud repliky neodpov\u00eddaj\u00ed, nebude m\u00edt v\u016fdce na v\u00fdb\u011br a bude \u010dekat na potvrzen\u00ed z\u00e1pisu, dokud se replika nevr\u00e1t\u00ed do clusteru a nebudou moci p\u0159ijmout a potvrdit z\u00e1pis.<\/p>\n<p><\/p>\n<h2 id=\"po-odnomu-soedineniyu-na-tranzakciyu\">Jedno spojen\u00ed na transakci?<\/h2>\n<p><\/p>\n<p>Ka\u017ed\u00e1 aplikace pot\u0159ebuje specifick\u00fd typ kombinace konzistence a v\u00fdkonu. Pokud to samoz\u0159ejm\u011b nen\u00ed na\u0161e aplikace pro placen\u00ed \u00fa\u010dt\u016f, kterou si p\u0159edstavujeme jako zcela konzistentn\u00ed, nebo na\u0161e t\u00e9m\u011b\u0159 efem\u00e9rn\u00ed s\u00ed\u0165ov\u00e1 aplikace. Ve v\u0161ech ostatn\u00edch p\u0159\u00edpadech budou chv\u00edle, kdy n\u011bkter\u00e9 operace mus\u00ed b\u00fdt synchronn\u00ed a n\u011bkter\u00e9 asynchronn\u00ed. Mo\u017en\u00e1 nechcete, aby syst\u00e9m \u010dekal, dokud nebude zpr\u00e1va odeslan\u00e1 do chatu zapsan\u00e1, ale pokud se ve stejn\u00e9 aplikaci prov\u00e1d\u00ed platba, bude t\u0159eba po\u010dkat.<\/p>\n<p><\/p>\n<p>V\u0161echna tato rozhodnut\u00ed samoz\u0159ejm\u011b \u010din\u00ed v\u00fdvoj\u00e1\u0159 aplikace. Spr\u00e1vn\u00e1 rozhodnut\u00ed o tom, kdy pou\u017e\u00edt ten \u010di onen p\u0159\u00edstup, pomohou maxim\u00e1ln\u011b vyu\u017e\u00edt cluster. Je d\u016fle\u017eit\u00e9, aby v\u00fdvoj\u00e1\u0159 mohl p\u0159ep\u00ednat mezi nimi na \u00farovni SQL pro p\u0159ipojen\u00ed a pro transakce. <\/p>\n<p><\/p>\n<h2 id=\"obespechenie-kontrolya-na-praktike\">Zaji\u0161t\u011bn\u00ed kontroly v praxi<\/h2>\n<p><\/p>\n<p>Ve v\u00fdchoz\u00edm nastaven\u00ed PostgreSQL zaji\u0161\u0165uje konzistenci. To je \u0159\u00edzeno parametrem serveru <code>synchronous_commit<\/code>. Ve v\u00fdchoz\u00edm stavu je nastaven na <code>on<\/code>, ale m\u00e1 dal\u0161\u00ed t\u0159i mo\u017enosti: <code>local<\/code>, <code>remote_write<\/code> nebo <code>off<\/code>.<\/p>\n<p><\/p>\n<p>P\u0159i nastavov\u00e1n\u00ed parametru na <code>off<\/code> se zastav\u00ed v\u0161echny synchronn\u00ed z\u00e1pisy, dokonce i v m\u00edstn\u00edm syst\u00e9mu. Parametr `local` ur\u010duje synchronn\u00ed re\u017eim pro m\u00edstn\u00ed syst\u00e9m, ale z\u00e1pisy do repliky se prov\u00e1d\u011bj\u00ed asynchronn\u011b. <code>Remote_write<\/code> jde je\u0161t\u011b d\u00e1l: z\u00e1pisy do repliky se prov\u00e1d\u011bj\u00ed asynchronn\u011b, ale vr\u00e1t\u00ed se, kdy\u017e replika p\u0159ijme z\u00e1pis, ale nezap\u00ed\u0161e ho na disk.<\/p>\n<p><\/p>\n<p>S ohledem na dostupn\u00e9 mo\u017enosti vyb\u00edr\u00e1me chov\u00e1n\u00ed a s ohledem na to, \u017ee <code>on<\/code> \u2013 to jsou synchronn\u00ed z\u00e1pisy, zvol\u00edme <code>local<\/code> pro asynchronn\u00ed z\u00e1pisy p\u0159es s\u00ed\u0165, p\u0159i\u010dem\u017e m\u00edstn\u00ed z\u00e1pisy z\u016fst\u00e1vaj\u00ed synchronn\u00ed.<\/p>\n<p><\/p>\n<p>Nyn\u00ed v\u00e1m uk\u00e1\u017eeme, jak to nastavit b\u011bhem okam\u017eiku, ale p\u0159edstavte si, \u017ee jsme nainstalovali <code>synchronous_commit<\/code> v <code>local<\/code> pro server. Ptali jsme se, zda je mo\u017en\u00e9 m\u011bnit parametr <code>synchronous_commit<\/code> za b\u011bhu, a uk\u00e1zalo se, \u017ee nejen mo\u017en\u00e9, dokonce existuj\u00ed hned dva zp\u016fsoby. Prvn\u00ed je nastavit relaci va\u0161eho spojen\u00ed n\u00e1sleduj\u00edc\u00edm zp\u016fsobem:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SET SESSION synchronous_commit TO ON;  \n\/\/ Va\u0161e z\u00e1pisy p\u0159ich\u00e1zej\u00ed sem<\/code><\/pre>\n<p><\/p>\n<p>V\u0161echny n\u00e1sledn\u00e9 z\u00e1pisy v relaci potvrd\u00ed operace z\u00e1pisu pro repliky, ne\u017e vr\u00e1t\u00ed pozitivn\u00ed v\u00fdsledek p\u0159ipojen\u00e9mu klientovi. Pokud tedy nezm\u011bn\u00edte nastaven\u00ed <code>synchronous_commit<\/code> znovu. M\u016f\u017eete vynechat \u010d\u00e1st <code>SESSION<\/code> v p\u0159\u00edkazu, proto\u017ee bude m\u00edt v\u00fdchoz\u00ed hodnotu.<\/p>\n<p><\/p>\n<p>Druh\u00fd zp\u016fsob je dobr\u00fd, kdy\u017e si chcete b\u00fdt jisti, \u017ee z\u00edsk\u00e1v\u00e1te synchronn\u00ed replikaci pro jednu transakci. V mnoha datab\u00e1z\u00edch generace &#171;NoSQL&#187; neexistuje pojem transakc\u00ed, ale v PostgreSQL existuje. V tomto p\u0159\u00edpad\u011b spust\u00edte transakci a pot\u00e9 nastav\u00edte <code>synchronous_commit<\/code> v <code>on<\/code> p\u0159ed proveden\u00edm z\u00e1pisu pro transakci. <code>COMMIT<\/code> potvrd\u00ed transakci, pou\u017e\u00edvaj\u00edc jakoukoli hodnotu parametru <code>synchronous_commit<\/code>, kter\u00e1 byla nastavena v tu chv\u00edli, i kdy\u017e je nejlep\u0161\u00ed nastavit prom\u011bnnou p\u0159edem, abyste se ujistili, \u017ee ostatn\u00ed v\u00fdvoj\u00e1\u0159i ch\u00e1pou, \u017ee z\u00e1pisy nejsou asynchronn\u00ed.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">BEGIN;  \nSET LOCAL synchronous_commit TO ON;  \n\/\/ Va\u0161e z\u00e1pisy p\u0159ich\u00e1zej\u00ed sem\nCOMMIT;  <\/code><\/pre>\n<p><\/p>\n<p>V\u0161echny commity transakc\u00ed nyn\u00ed budou potvrzeny jako zapsan\u00e9 do replik je\u0161t\u011b p\u0159edt\u00edm, ne\u017e datab\u00e1ze vr\u00e1t\u00ed pozitivn\u00ed odpov\u011b\u010f p\u0159ipojen\u00e9mu klientovi.<\/p>\n<p><\/p>\n<h2 id=\"nastroyka-postgresql\">Nastaven\u00ed PostgreSQL<\/h2>\n<p><\/p>\n<p>Do t\u00e9to doby jsme si p\u0159edstavovali syst\u00e9m PostgreSQL s <code>synchronous_commit<\/code>, nainstalovan\u00fdm v <code>local<\/code>. Aby to byla realita na stran\u011b serveru, budete muset nastavit dva parametry konfigurace serveru. Dal\u0161\u00ed parametr <code>synchronous_standby_names<\/code> se uplatn\u00ed, kdy\u017e <code>synchronous_commit<\/code> bude v <code>on<\/code>. Ur\u010duje, kter\u00e9 repliky maj\u00ed pr\u00e1vo na synchronn\u00ed commity, a my ho nastav\u00edme na <code>*<\/code>, co\u017e znamen\u00e1 zapojen\u00ed v\u0161ech replik. Tyto hodnoty se obvykle nakonfiguruj\u00ed v <noindex><a rel=\"nofollow\" href=\"http:\/\/www.postgresql.org\/docs\/9.4\/static\/config-setting.html#CONFIG-SETTING-CONFIGURATION-FILE\">konfigura\u010dn\u00edm souboru<\/a><\/noindex> p\u0159id\u00e1n\u00edm: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">synchronous_commit = local  \nsynchronous_standby_names='*'<\/code><\/pre>\n<p><\/p>\n<p>Nastaven\u00edm parametru <code>synchronous_commit<\/code> na hodnotu <code>local<\/code>, vytv\u00e1\u0159\u00edme syst\u00e9m, ve kter\u00e9m z\u00e1znamy na lok\u00e1ln\u00edch disc\u00edch z\u016fst\u00e1vaj\u00ed synchronn\u00ed, ale commity s\u00ed\u0165ov\u00fdch replik jsou v\u00fdchoz\u00ed asynchronn\u00ed. Pokud ov\u0161em nehodl\u00e1me tyto commity ud\u011blat synchronn\u00ed, jak je uvedeno v\u00fd\u0161e.<\/p>\n<p><\/p>\n<p>Pokud jste sledovali v\u00fdvoj <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/compose\/governor\">projektu Governor<\/a><\/noindex>, m\u016f\u017eete si v\u0161imnout n\u011bkter\u00fdch ned\u00e1vn\u00fdch zm\u011bn (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/compose\/governor\/commit\/87f18c01f150b3f1b6f948e852c7add2949f7360\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/compose\/governor\/commit\/dcbe849d33c535b1522ce767803cb77a3ac91a7e\">2<\/a><\/noindex>), kter\u00e9 umo\u017enily u\u017eivatel\u016fm Governor testovat tyto parametry a kontrolovat jejich konzistenci.<\/p>\n<p><\/p>\n<h2 id=\"esche-para-slov\">Je\u0161t\u011b p\u00e1r slov\u2026<\/h2>\n<p><\/p>\n<p>P\u0159ed t\u00fddnem bych v\u00e1m \u0159ekl, \u017ee je nemo\u017en\u00e9 tak podrobn\u011b nastavit PostgreSQL. Tehdy Kurt, \u010dlen t\u00fdmu platformy Compose, trval na tom, \u017ee takov\u00e1 mo\u017enost existuje. Uti\u0161il m\u00e9 n\u00e1mitky a na\u0161el v dokumentaci PostgreSQL <noindex><a rel=\"nofollow\" href=\"http:\/\/www.postgresql.org\/docs\/devel\/static\/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT\">n\u00e1sleduj\u00edc\u00ed<\/a><\/noindex>:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a nastaven\u00ed konzistence z\u00e1pisu pro ka\u017ed\u00e9 konkr\u00e9tn\u00ed p\u0159ipojen\u00ed\" src=\"\/wp-content\/uploads\/2019\/10\/e77e97e588fa3d1e8acbe5de0e26436a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Tento parametr m\u016f\u017ee b\u00fdt zm\u011bn\u011bn kdykoli. Chov\u00e1n\u00ed p\u0159i jak\u00e9koli transakci se ur\u010duje nastaven\u00edm, kter\u00e9 je platn\u00e9 p\u0159i potvrzen\u00ed. Proto je mo\u017en\u00e9 a u\u017eite\u010dn\u00e9, aby u n\u011bkter\u00fdch transakc\u00ed byly potvrzen\u00ed provedeny synchronn\u011b, zat\u00edmco u jin\u00fdch asynchronn\u011b. Nap\u0159\u00edklad, aby se jedna <code>multistatement<\/code> transakce prov\u00e1d\u011bla potvrzen\u00ed asynchronn\u011b, kdy\u017e je v\u00fdchoz\u00ed hodnota parametru opa\u010dn\u00e1, zadejte <\/em><code>SET LOCAL synchronous_commit TO OFF<\/code> <em>v transakci.<\/em><\/p>\n<p><\/p>\n<p>D\u00edky t\u00e9to mal\u00e9 \u00faprav\u011b v konfigura\u010dn\u00edm souboru jsme u\u017eivatel\u016fm umo\u017enili kontrolovat jejich konzistenci a v\u00fdkon.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/472364\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438? \u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u0432\u0430\u0441 \u043d\u0430 \u0414\u0435\u043d\u044c \u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0414\u0432\u0435\u0440\u0435\u0439, \u0433\u0434\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u043e\u043d\u043b\u0430\u0439\u043d-\u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u044f\u0445 \u0438 \u043a\u0430\u0440\u044c\u0435\u0440\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0434\u0443\u0442 \u0432\u044b\u043f\u0443\u0441\u043a\u043d\u0438\u043a\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. PostgreSQL \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u041d\u0430\u043c \u0432 Compose \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441\u043e \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":29395,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-39169","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\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438?\" \/>\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\/cs\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\udd47PostgreSQL \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438?\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya\" \/>\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=\"2019-10-31T19:28:14+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:28:14+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\udd47PostgreSQL a nastaven\u00ed konzistence z\u00e1pisu pro ka\u017ed\u00e9 konkr\u00e9tn\u00ed p\u0159ipojen\u00ed | ProHoster","description":"P\u0159eklad \u010dl\u00e1nku byl p\u0159ipraven speci\u00e1ln\u011b pro studenty kurzu \u201eDatab\u00e1ze\u201c. M\u00e1te z\u00e1jem se v tomto sm\u011bru rozv\u00edjet?","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\udd47PostgreSQL \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f | ProHoster","og:description":"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00ab\u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438?","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/postgresql-i-nastrojki-soglasovannosti-zapisi-dlya-kazhdogo-konkretnogo-soedineniya","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":"2019-10-31T19:28:14+00:00","article:modified_time":"2019-10-31T19:28:14+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"39169","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":"2026-01-24 01:05:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:54:44","updated":"2026-01-24 01:05:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/39169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=39169"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/39169\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/29395"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=39169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=39169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=39169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}