{"id":30356,"date":"2019-10-31T21:35:06","date_gmt":"2019-10-31T18:35:06","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-my-ispolzovali-otlozhennuyu-replikatsiyu-dlya-avarijnogo-vosstanovleniya-s-postgresql\/"},"modified":"2019-10-31T21:35:06","modified_gmt":"2019-10-31T18:35:06","slug":"kak-my-ispolzovali-otlozhennuyu-replikatsiyu-dlya-avarijnogo-vosstanovleniya-s-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-ispolzovali-otlozhennuyu-replikatsiyu-dlya-avarijnogo-vosstanovleniya-s-postgresql","title":{"rendered":"Kuidas kasutame viivitusega replikatsiooni h\u00e4daolukordade taastamiseks PostgreSQL-is","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kuidas kasutame viivitusega replikatsiooni h\u00e4daolukordade taastamiseks PostgreSQL-is\" src=\"\/wp-content\/uploads\/2019\/03\/773f3b6c8d173be91c49066d7067bad3.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nReplikatsioon \u2014 ei ole varundamine. V\u00f5i siiski? Nii kasutasime me edasil\u00fckatud replikatsiooni taastamiseks, kogemata kustutades otseteed.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/handbook\/engineering\/infrastructure\/\">Infrastruktuuri spetsialistid<\/a><\/noindex> GitLabis vastutavad t\u00f6\u00f6 eest <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/\">GitLab.com<\/a><\/noindex> \u2014 k\u00f5ige suurema GitLabi instantsi eest maailmas. Siin on 3 miljonit kasutajat ja peaaegu 7 miljonit projekti, ja see on \u00fcks suurimaid avatud l\u00e4htekoodiga SaaS saite p\u00fchendatud arhitektuuriga. Ilma PostgreSQL andmebaasis\u00fcsteemita ei p\u00e4\u00e4se GitLab.com kaugele, ja mida iganes me ei tee, et tagada t\u00f5rkeajalise j\u00e4tkusuutlikkuse saamiseks, kui andmed v\u00f5ivad kaduda. Selline katastroof ei pruugi juhtuda, kuid oleme h\u00e4sti ette valmistatud ja varustatud erinevate varundamis- ja replikatsioonimehhanismidega.<\/p>\n<p><\/p>\n<p>Replikatsioon ei ole andmebaasi varundamise vahend (<noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/02\/13\/delayed-replication-for-disaster-recovery-with-postgresql\/#summing-up\">vt allpool<\/a><\/noindex>). Aga n\u00fc\u00fcd n\u00e4eme, kui kiiresti saab kogemata kustutatud andmeid taastada edasil\u00fckatud replikatsiooni abil: eemaldasin <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/\">GitLab.com<\/a><\/noindex> kasutaja <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/gl-infra\/production\/issues\/509\">otsetee<\/a><\/noindex> projekti jaoks <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-org\/gitlab-ce\/\"><code>gitlab-ce<\/code><\/a><\/noindex> ja kaotasin sidemed \u00fchendamise taotluste ja \u00fclesannetega.<\/p>\n<p><\/p>\n<p>Edasil\u00fckatud replikatsiooniga taastasime andmed vaid 1,5 tunniga. Vaadake, kuidas see toimus.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vosstanovlenie-na-moment-vremeni-s-postgresql\">Taastamine PostgreSQL-i ajas<\/h3>\n<p><\/p>\n<p>PostgreSQL-l on sisseehitatud funktsioon, mis taastab andmebaasi oleku kindlal ajahetkel. Selle nimi on <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/continuous-archiving.html\">Punkt-aegne taastamine<\/a><\/noindex> (PITR) ja see kasutab samu mehhanisme, mis s\u00e4ilitavad repliika ajakohasuse: alates usaldusv\u00e4\u00e4rsest kogu andmebaasi klastrist tehtud pildist (baasbackup), rakendame muudatusi olekusse kuni kindla ajani.<\/p>\n<p><\/p>\n<p>Selle funktsiooni kasutamiseks k\u00fclma varundamise jaoks teeme regulaarselt andmebaasi baasbackup'i ja hoiame seda arhiivis (GitLabi arhiivid elavad <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/storage\/\">Google'i pilvek\u00fcljel<\/a><\/noindex>). Samuti j\u00e4lgime andmebaasi oleku muudatusi, arhiveerides ette kirjutamise ajakirja (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/wal-intro.html\">write-ahead log<\/a><\/noindex>, WAL). K\u00f5ikide nende andmetega saame teha PITR-i avariirestaurimiseks: alustame pildist, mis tehti enne viga, ja rakendame WAL-i arhiivist muudatused kuni t\u00f5rkeni.<\/p>\n<p><\/p>\n<h3 id=\"chto-takoe-otlozhennaya-replikaciya\">Mis on viivitusega replikatsioon?<\/h3>\n<p><\/p>\n<p>Viivitusega replikatsioon on muudatuste rakendamine WAL-ist viivitusega. See t\u00e4hendab, et tehing toimus kell <code>X<\/code>, kuid replikatsioonis ilmneb see viivitusega <code>d<\/code> tunni v\u00f5rra <code>X + d<\/code>.<\/p>\n<p><\/p>\n<p>PostgreSQL-is on 2 viisi andmebaasi f\u00fc\u00fcsilise replika seadistamiseks: taastamine arhivist ja voogedastusreplikatsioon. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/archive-recovery-settings.html\">Taastamine arhivist<\/a><\/noindex>, toimib p\u00f5him\u00f5tteliselt nagu PITR, kuid pidevalt: me ekstraktime pidevalt muudatused arhivist WAL ja kohandame need replikale. Ja <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Streaming_Replication\">voogedastusreplikatsioon<\/a><\/noindex> ekstraktib otse WAL voolu k\u00f5rgemalt andmebaasi hostilt. Eelistame taastamist arhivist \u2013 sellega on lihtsam hallata ja sellel on normaalne j\u00f5udlus, mis ei j\u00e4\u00e4 t\u00f6\u00f6klastrist maha.<\/p>\n<p><\/p>\n<h3 id=\"kak-nastroit-otlozhennoe-vosstanovlenie-iz-arhiva\">Kuidas seadistada viivitusega taastamine arhivist<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/recovery-config.html\">Taastamisvalikud<\/a><\/noindex> on kirjeldatud failis <code>recovery.conf<\/code>. N\u00e4ide:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">standby_mode = 'on'\nrestore_command = '\/usr\/bin\/envdir \/etc\/wal-e.d\/env \/opt\/wal-e\/bin\/wal-e wal-fetch -p 4 \"%f\" \"%p\"'\nrecovery_min_apply_delay = '8h'\nrecovery_target_timeline = 'latest'<\/code><\/pre>\n<p><\/p>\n<p>Nende parameetritega oleme seadistanud viivitusega repliika taastamise arhivist. Siin kasutatakse <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">wal-e<\/a><\/noindex> WAL segmentide (<code>restore_command<\/code>) ekstraheerimiseks arhivist, ja muudatused rakendatakse kaheksa tunni p\u00e4rast (<code>recovery_min_apply_delay<\/code>). Replika j\u00e4lgib arhivi ajaskaala muutusi, n\u00e4iteks klasteri t\u00f5rke juhtumite korral (<code>recovery_target_timeline<\/code>).<\/p>\n<p><\/p>\n<p>C <code>recovery_min_apply_delay<\/code> streamingu replikatsiooni on v\u00f5imalik seadistada viivitusega, kuid siin on m\u00f5ned takistused, mis on seotud replikatsiooni slotidega, kuuma varundamise tagasisidega jne. WAL arhiiv aitab neid v\u00e4ltida.<\/p>\n<p><\/p>\n<p>Parameeter <code>recovery_min_apply_delay<\/code> ilmus ainult PostgreSQL 9.3-s. Eelmistes versioonides tuli viivitatud replikatsiooni seadistamiseks kasutada kombinatsiooni <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.3\/functions-admin.html\">taasterehvide haldusfunktsioonidest<\/a><\/noindex> (<code>pg_xlog_replay_pause(), pg_xlog_replay_resume()<\/code>) v\u00f5i hoida WAL segmente arhiivis viivituse kestuse jooksul.<\/p>\n<p><\/p>\n<h3 id=\"kak-postgresql-eto-delaet\">Kuidas PostgreSQL seda teeb?<\/h3>\n<p><\/p>\n<p>Huvitav on vaadata, kuidas PostgreSQL rakendab viivitatud taastamist. Vaatame <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres\/postgres\/blob\/c24dcd0cfd949bdf245814c4c2b3df828ee7db36\/src\/backend\/access\/transam\/xlog.c#L6124\"><code>recoveryApplyDelay(XlogReaderState)<\/code><\/a><\/noindex>. Seda kutsutakse v\u00e4lja <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres\/postgres\/blob\/c24dcd0cfd949bdf245814c4c2b3df828ee7db36\/src\/backend\/access\/transam\/xlog.c#L7196\">peamise kordusprotsessi k\u00e4igus<\/a><\/noindex> iga WAL-i kirje jaoks.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">static bool\nrecoveryApplyDelay(XLogReaderState *record)\n{\n    uint8       xact_info;\n    TimestampTz xtime;\n    long        secs;\n    int         microsecs;\n\n    \/* \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 *\/\n    if (recovery_min_apply_delay &lt;= 0)\n        return false;\n\n    \/* \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0449\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 *\/\n    if (!reachedConsistency)\n        return false;\n\n    \/*\n     * \u042d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c COMMIT?\n     *\n     * \u041c\u044b \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u043d\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430\n     * MVCC. \u041c\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0438,\n     * \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u043d\u043d\u0438\u043c\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430\u043c\u0438 \u043d\u0430\n     * \u0437\u0430\u043f\u0430\u0441\u043d\u044b\u0445.\n     *\/\n    if (XLogRecGetRmid(record) != RM_XACT_ID)\n        return false;\n\n    xact_info = XLogRecGetInfo(record) &amp; XLOG_XACT_OPMASK;\n\n    if (xact_info != XLOG_XACT_COMMIT &amp;&amp;\n        xact_info != XLOG_XACT_COMMIT_PREPARED)\n        return false;\n\n    if (!getRecordTimestamp(record, &amp;xtime))\n        return false;\n\n    recoveryDelayUntilTime =\n        TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay);\n\n    \/*\n     * \u0412\u044b\u0445\u043e\u0434\u0438\u0442\u0435, \u043d\u0435 \u0432\u0437\u0432\u043e\u0434\u044f \u0437\u0430\u0434\u0432\u0438\u0436\u043a\u0443, \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439\n     * \u0437\u0430\u043f\u0438\u0441\u0438\n     *\/\n    TimestampDifference(GetCurrentTimestamp(), recoveryDelayUntilTime,\n                        &amp;secs, &amp;microsecs);\n    if (secs &lt;= 0 &amp;&amp; microsecs &lt;= 0)\n        return false;\n\n    while (true)\n    {\n        \/\/ \u0423\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043e:\n        \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 WaitLatch, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u043c recoveryDelayUntilTime\n        \/\/ \u0438 \u0437\u0430\u0442\u0435\u043c\n        break;\n    }\n    return true;\n}<\/code><\/pre>\n<p><\/p>\n<p>M\u00f5te on selles, et viivitus p\u00f5hineb f\u00fc\u00fcsilisel ajal, mis on fikseeritud tehingu kinnituse ajal (<code>xtime<\/code>). Nagu n\u00e4ha, rakendatakse viivitust ainult kinnitustele ja see ei puuduta teisi sisestusi \u2014 k\u00f5ik muudatused rakendatakse otse, samas kui kinnitus l\u00fckatakse edasi, nii et n\u00e4eme muudatusi alles p\u00e4rast seadistatud viivitust.<\/p>\n<p><\/p>\n<h3 id=\"kak-ispolzovat-otlozhennuyu-repliku-dlya-vosstanovleniya-dannyh\">Kuidas kasutada viivitavat koopiat andmete taastamiseks<\/h3>\n<p><\/p>\n<p>Oletame, et meil on tootmises andmebaasi klaster ja kaheksa tunni viivitusega koopiad. Vaatame, kuidas andmeid taastada n\u00e4ite kaudu <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-com\/gl-infra\/production\/issues\/509\">juhusliku otste kustutamise<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Kui me probleemist teada saime, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/9.3\/functions-admin.html\">peatame taastamise arhiivist<\/a><\/noindex> viivitava koopia jaoks:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT pg_xlog_replay_pause();<\/code><\/pre>\n<p><\/p>\n<p>Peatamise ajal ei olnud meil riski, et koopia kordab p\u00e4ringut <code>DELETE<\/code>. Kasulik asi, kui on vaja aega k\u00f5ike l\u00e4bi m\u00f5elda.<\/p>\n<p><\/p>\n<p>K\u00fcsimus on selles, et viivitav koopia peab j\u00f5udma hetke enne p\u00e4ringut <code>DELETE<\/code>. Me teadsime ligikaudset f\u00fc\u00fcsilist kustutamise aega. Kustutasime <code>recovery_min_apply_delay<\/code> ja lisasime <code>recovery_target_time<\/code> \u00fches <code>recovery.conf<\/code>. Nii j\u00f5uab koopia soovitud hetkeni viivitusteta:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">recovery_target_time = '2018-10-12 09:25:00+00'<\/code><\/pre>\n<p><\/p>\n<p>Aja m\u00e4rkide puhul on parem liialdamist v\u00e4ltida, et eksida ei teeks. Kuid mida rohkem v\u00e4hendate, seda rohkem andmeid kaotate. Taas, kui eksime p\u00e4ringust m\u00f6\u00f6da <code>DELETE<\/code>, k\u00f5ik j\u00e4lle kustutatakse ja tuleb alustada uuesti (v\u00f5i \u00fcldse v\u00f5tta k\u00fclm varundus PITR jaoks).<\/p>\n<p><\/p>\n<p>Me taask\u00e4ivitame edasi l\u00fckatud Postgres'i eksemplari ja WAL segmentide korduvad kuni m\u00e4\u00e4ratud ajani. Selle etapi edenemist saab j\u00e4lgida p\u00e4ringuga:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">SELECT\n  -- praegune asukoht WAL'is\n  pg_last_xlog_replay_location(),\n  -- praegune tehingu ajatemperatuur (repliika seisund)\n  pg_last_xact_replay_timestamp(),\n  -- praegune f\u00fc\u00fcsiline aeg\n  now(),\n  -- aeg, mis on veel rakendamiseks, kuni recovery_target_time on saavutatud\n  '2018-10-12 09:25:00+00'::timestamptz - pg_last_xact_replay_timestamp() as delay;<\/code><\/pre>\n<p><\/p>\n<p>Kui ajatemperatuur enam ei muutu, on taastamine l\u00f5petatud. V\u00f5ib seadistada toimingu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/recovery-target-settings.html\"><code>recovery_target_action<\/code><\/a><\/noindex>, et sulgeda, edendada v\u00f5i peatada eksemplar p\u00e4rast kordamist (vaikimisi peatatakse see).<\/p>\n<p><\/p>\n<p>Andmebaas on j\u00f5udnud enne seda kurikuulsat p\u00e4ringut. N\u00fc\u00fcd saab n\u00e4iteks andmeid eksportida. Me eksportisime kustutatud andmed sildist ja k\u00f5ik seosed \u00fclesannete ja sulandumisettepanekutega ning kandisime need t\u00f6\u00f6tavasse andmebaasi. Kui kaduded on ulatuslikud, v\u00f5ib lihtsalt edendada repliika ja kasutada seda p\u00f5hina. kuid siis kaovad k\u00f5ik muudatused p\u00e4rast seda aega, millele me taastusime.<\/p>\n<p><\/p>\n<p>Aja aegade asemel on parem kasutada tehingu ID-sid. Need ID-d on kasulikud n\u00e4iteks DDL-operaatorite jaoks (nagu <code>DROP TABLE<\/code>), kasutades <code>log_statements = 'ddl'<\/code>. Kui meil oleks tehingu ID, v\u00f5taksime <code>recovery_target_xid<\/code> ja viiksime l\u00e4bi k\u00f5ik kuni tehinguni, mis eelnes p\u00e4ringule <code>DELETE<\/code>.<\/p>\n<p><\/p>\n<p>Tagasi t\u00f6\u00f6le saamine on v\u00e4ga lihtne: kustutage k\u00f5ik muudatused ja <code>recovery.conf<\/code> ja taask\u00e4ivitage Postgres. Peagi ilmub replikas taas kaheksa tunni viivitus ja oleme valmis tulevaste h\u00e4dadeks.<\/p>\n<p><\/p>\n<h3 id=\"preimuschestva-dlya-vosstanovleniya\">Taastamise eelised<\/h3>\n<p><\/p>\n<p>Kavandatud replikaga ei pea tundide kaupa kogu arhiivist tagasi t\u00f5mbama. N\u00e4iteks kulub meil viis tundi, et hankida kogu 2 TB p\u00f5hi varukoopia. Ja siis tuleb veel rakendada kogu \u00fchep\u00e4evane WAL, et taastuda soovitud olekusse (halvimal juhul).<\/p>\n<p><\/p>\n<p>Kavandatud replikal on kaks eelist k\u00fclmalt varukoopialt:<\/p>\n<p><\/p>\n<ol>\n<li>Pole vaja terve p\u00f5hi varukoopia arhiivist v\u00e4lja t\u00f5mmata.<\/li>\n<li>On fikseeritud kaheksa tunni akna WAL-s segmentoore, mida tuleb korrata.<\/li>\n<\/ol>\n<p><\/p>\n<p>Ja me kontrollime pidevalt, kas WAL-ist on v\u00f5imalik PITR-i teha, ning m\u00e4rkaksime kiiresti kahjustusi v\u00f5i muid WAL arhiiviga seotud probleeme, j\u00e4lgides kavandatud replikate mahaj\u00e4\u00e4must.<\/p>\n<p><\/p>\n<p>Selles n\u00e4ites kulus meie taastamiseks 50 minutit, st kiirus oli 110 GB WAL andmeid tunnis (arhiiv oli siis veel) <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/s3\/\">AWS S3<\/a><\/noindex>). Kokku lahendasime probleemi ja taastamise aeg oli 1,5 tundi.<\/p>\n<p><\/p>\n<h3 id=\"itogi-gde-prigoditsya-otlozhennaya-replika-a-gde-net\">Kokkuv\u00f5tteks: kus v\u00f5ib abiks olla viivitusega replikatsioon (ja kus mitte)<\/h3>\n<p><\/p>\n<p>Kasutage viivitusega replikatsiooni esmaabina, kui te juhuslikult kaotasite andmeid ja m\u00e4rkate seda probleemi seadedud viivituse jooksul.<\/p>\n<p><\/p>\n<blockquote><p>Aga pidage meeles: replikatsioon ei ole varundamine.<\/p><\/blockquote>\n<p>Varundamise ja replikatsiooni eesm\u00e4rgid on erinevad. K\u00fclman varundamine on kasulik, kui olete juhuslikult teinud <code>DELETE<\/code> v\u00f5i <code>DROP TABLE<\/code>. Teeme varundamise k\u00fclmhoidlast ja taastame tabeli v\u00f5i kogu andmebaasi eelneva oleku. Kuid sel juhul p\u00e4ring <code>DROP TABLE<\/code> kordub peaaegu koheselt k\u00f5igis replikatsioonides t\u00f6\u00f6klusteris, seega tavaline replikatsioon ei p\u00e4\u00e4sta siin. Replikatsioon ise hoiab andmebaasi kergesti saadaval, kui eraldi serverid langevad, ja jagab koormust.<\/p>\n<p><\/p>\n<p>Isegi viivitusega replikatsiooniga on meil m\u00f5nikord v\u00e4ga vajalik k\u00fclmv\u00f5tt varundamine ohutus kohas, kui peaks toimuma andmekeskuse rike, varjatud kahjustus v\u00f5i muud s\u00fcndmused, mida kohe ei m\u00e4rkate. Siin ei aita ainult replikatsioon.<\/p>\n<p><\/p>\n<p><strong>M\u00e4rkus<\/strong>. Lehelt <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/\">GitLab.com<\/a><\/noindex> meie kaitse andmete kadumise eest kehtib praegu ainult s\u00fcsteemitasemel ega taasta andmeid kasutajatulemuses.<\/p>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/445446\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u2014 \u043d\u0435 \u0431\u044d\u043a\u0430\u043f. \u0418\u043b\u0438 \u043d\u0435\u0442? \u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0432 \u044f\u0440\u043b\u044b\u043a\u0438. \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043d\u0430 GitLab \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 GitLab.com \u2014 \u0441\u0430\u043c\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 GitLab \u0432 \u043f\u0440\u0438\u0440\u043e\u0434\u0435. \u0417\u0434\u0435\u0441\u044c 3 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u043e\u0447\u0442\u0438 7 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u0441\u0430\u0439\u0442\u043e\u0432 SaaS \u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u0411\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22360,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-30356","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u2014 \u043d\u0435 \u0431\u044d\u043a\u0430\u043f. \u0418\u043b\u0438 \u043d\u0435\u0442? \u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0432 \u044f\u0440\u043b\u044b\u043a\u0438. \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043d\u0430 GitLab \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 GitLab.com \u2014 \u0441\u0430\u043c\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 GitLab \u0432 \u043f\u0440\u0438\u0440\u043e\u0434\u0435. \u0417\u0434\u0435\u0441\u044c 3 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u043e\u0447\u0442\u0438 7 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u0441\u0430\u0439\u0442\u043e\u0432 SaaS \u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u0411\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" \/>\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\/et\/blog\/administrirovanie\/kak-my-ispolzovali-otlozhennuyu-replikatsiyu-dlya-avarijnogo-vosstanovleniya-s-postgresql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\u041a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u2014 \u043d\u0435 \u0431\u044d\u043a\u0430\u043f. \u0418\u043b\u0438 \u043d\u0435\u0442? \u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0432 \u044f\u0440\u043b\u044b\u043a\u0438. \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043d\u0430 GitLab \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 GitLab.com \u2014 \u0441\u0430\u043c\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 GitLab \u0432 \u043f\u0440\u0438\u0440\u043e\u0434\u0435. \u0417\u0434\u0435\u0441\u044c 3 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u043e\u0447\u0442\u0438 7 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u0441\u0430\u0439\u0442\u043e\u0432 SaaS \u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u0411\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-ispolzovali-otlozhennuyu-replikatsiyu-dlya-avarijnogo-vosstanovleniya-s-postgresql\" \/>\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-31T18:35:06+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:35:06+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\udd47Kuidas kasutasime viivitatud replikatsiooni katastroofide taastamiseks PostgreSQL-i | ProHoster","description":"Replikatsioon ei ole varukoopia. V\u00f5i siiski? Nii kasutasime me viivitatud replikatsiooni taastamiseks, kui kustutasime kogemata otseteed. GitLabi infrastruktuuri spetsialistid vastutavad GitLab.com-i, looduse suurima GitLabi instantsi, eest. Siin on 3 miljonit kasutajat ja peaaegu 7 miljonit projekti, ning see on \u00fcks suurimaid avatud l\u00e4htekoodiga SaaS-saitide p\u00fchendatud arhitektuuriga. Ilma s\u00fcsteemita","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-ispolzovali-otlozhennuyu-replikatsiyu-dlya-avarijnogo-vosstanovleniya-s-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\u041a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441 PostgreSQL | ProHoster","og:description":"\u0420\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u2014 \u043d\u0435 \u0431\u044d\u043a\u0430\u043f. \u0418\u043b\u0438 \u043d\u0435\u0442? \u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0432 \u044f\u0440\u043b\u044b\u043a\u0438. \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043d\u0430 GitLab \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 GitLab.com \u2014 \u0441\u0430\u043c\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 GitLab \u0432 \u043f\u0440\u0438\u0440\u043e\u0434\u0435. \u0417\u0434\u0435\u0441\u044c 3 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u043e\u0447\u0442\u0438 7 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u0441\u0430\u0439\u0442\u043e\u0432 SaaS \u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u0411\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-ispolzovali-otlozhennuyu-replikatsiyu-dlya-avarijnogo-vosstanovleniya-s-postgresql","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-31T18:35:06+00:00","article:modified_time":"2019-10-31T18:35:06+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30356","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-21 00:50:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:48:29","updated":"2026-01-21 00:50:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/30356","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=30356"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/30356\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/22360"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=30356"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=30356"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=30356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}