Kubwereza sikusunga zosunga zobwezeretsera. Kapena osati? Umu ndi momwe tidagwiritsira ntchito kubwereza kochedwetsa kuti tipezenso njira zazifupi mwangozi.
Kubwerezanso si njira yosungira nkhokwe (gitlab-ce
Ndi chifaniziro chochedwetsedwa, tidapezanso zambiri m'maola 1,5 okha. Taonani momwe izo zinachitikira.
Lozani mu nthawi yochira ndi PostgreSQL
PostgreSQL ili ndi ntchito yomangidwira yomwe imabwezeretsanso chikhalidwe cha database ku nthawi inayake. Amatchedwa
Kuti tigwiritse ntchito izi posunga zoziziritsa kukhosi, timasunga zosunga zobwezeretsera nthawi zonse ndikuzisunga munkhokwe (zosunga zakale za GitLab zimakhalamo.
Kodi kubwerezedwa kochedwetsedwa ndi chiyani?
Kubwereza kwaulesi ndiko kugwiritsa ntchito zosintha kuchokera ku WAL ndikuchedwa. Ndiko kuti, kugulitsako kunachitika mu ola limodzi X
, koma idzawonekera pachifaniziro ndi kuchedwa d
mu ola limodzi X + d
.
PostgreSQL ili ndi njira ziwiri zokhazikitsira choyimira cha database: kubwezeretsa zosunga zobwezeretsera ndi kubwerezabwereza.
Momwe mungakhazikitsire kuchira kochedwa kuchokera ku archive
recovery.conf
. Chitsanzo:
standby_mode = 'on'
restore_command = '/usr/bin/envdir /etc/wal-e.d/env /opt/wal-e/bin/wal-e wal-fetch -p 4 "%f" "%p"'
recovery_min_apply_delay = '8h'
recovery_target_timeline = 'latest'
Ndi magawo awa, tidakonza chofananira chosinthidwa ndikubwezeretsa zosunga zobwezeretsera. Apa amagwiritsidwa ntchito restore_command
) kuchokera pazosungidwa, ndipo zosintha zidzagwiritsidwa ntchito pakatha maola asanu ndi atatu (recovery_min_apply_delay
). Choyimiracho chidzawona kusintha kwa nthawi muzosungirako, mwachitsanzo chifukwa cha kulephera kwa gulu (recovery_target_timeline
).
Π‘ recovery_min_apply_delay
Mutha kukhazikitsa kubwereza kobwereza ndikuchedwa, koma pali misampha ingapo pano yomwe ikugwirizana ndi mipata yobwerezabwereza, mayankho otentha oyimilira, ndi zina zotero. Zosungidwa za WAL zimakulolani kuti mupewe.
chizindikiro recovery_min_apply_delay
adangowonekera mu PostgreSQL 9.3. M'matembenuzidwe am'mbuyomu, pakubwereza kochedwetsa muyenera kukonza kuphatikiza pg_xlog_replay_pause(), pg_xlog_replay_resume()
) kapena sungani magawo a WAL m'malo osungira nthawi yonseyi.
Kodi PostgreSQL imachita bwanji izi?
Ndizosangalatsa kuwona momwe PostgreSQL imagwiritsira ntchito kuchira kwaulesi. Tiyeni tione recoveryApplyDelay(XlogReaderState)
static bool
recoveryApplyDelay(XLogReaderState *record)
{
uint8 xact_info;
TimestampTz xtime;
long secs;
int microsecs;
/* nothing to do if no delay configured */
if (recovery_min_apply_delay <= 0)
return false;
/* no delay is applied on a database not yet consistent */
if (!reachedConsistency)
return false;
/*
* Is it a COMMIT record?
*
* We deliberately choose not to delay aborts since they have no effect on
* MVCC. We already allow replay of records that don't have a timestamp,
* so there is already opportunity for issues caused by early conflicts on
* standbys.
*/
if (XLogRecGetRmid(record) != RM_XACT_ID)
return false;
xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;
if (xact_info != XLOG_XACT_COMMIT &&
xact_info != XLOG_XACT_COMMIT_PREPARED)
return false;
if (!getRecordTimestamp(record, &xtime))
return false;
recoveryDelayUntilTime =
TimestampTzPlusMilliseconds(xtime, recovery_min_apply_delay);
/*
* Exit without arming the latch if it's already past time to apply this
* record
*/
TimestampDifference(GetCurrentTimestamp(), recoveryDelayUntilTime,
&secs, µsecs);
if (secs <= 0 && microsecs <= 0)
return false;
while (true)
{
// Shortened:
// Use WaitLatch until we reached recoveryDelayUntilTime
// and then
break;
}
return true;
}
Chofunikira ndichakuti kuchedwaku kumatengera nthawi yomwe yalembedwa mu sitepe ya nthawi ya transaction (xtime
). Monga mukuwonera, kuchedwa kumangogwira ntchito pazochita zokha ndipo sizikhudza zolemba zina - zosintha zonse zimayikidwa mwachindunji, ndipo kudzipereka kumachedwa, ndiye tidzangowona zosintha pambuyo pochedwa.
Momwe mungagwiritsire ntchito chofananira chochedwetsedwa kuti mubwezeretse deta
Tiyerekeze kuti tili ndi gulu la database ndi chofananira chokhala ndi kuchedwa kwa maola asanu ndi atatu pakupanga. Tiyeni tione mmene achire deta ntchito chitsanzo
Pamene tinaphunzira za vutolo, ife
SELECT pg_xlog_replay_pause();
Titapuma pang'ono, tinalibe chiwopsezo choti chofananacho chingabwereze pempholo DELETE
. Chinthu chothandiza ngati mukufuna nthawi kuti mudziwe zonse.
Chowonadi ndichakuti chofananira chomwe chachedwetsedwa chiyenera kufikira mphindi isanapemphe DELETE
. Tinkadziwa pafupifupi nthawi yochotsedwa. Tachotsa recovery_min_apply_delay
ndi kuwonjezera recovery_target_time
Π² recovery.conf
. Umu ndi momwe chithunzichi chimafikira nthawi yoyenera popanda kuchedwa:
recovery_target_time = '2018-10-12 09:25:00+00'
Ndi masitampu a nthawi, ndi bwino kuchepetsa owonjezera kuti musaphonye. Zowona, kuchepa kwakukulu, timataya zambiri. Apanso, ngati taphonya pempho DELETE
, chilichonse chidzachotsedwanso ndipo muyenera kuyambiranso (kapena kutenga zosunga zoziziritsa kukhosi za PITR).
Tinayambitsanso chitsanzo cha Postgres chomwe chinachedwetsedwa ndipo magawo a WAL adabwerezedwa mpaka nthawi yodziwika. Mutha kuyang'anira momwe zikuyendera panthawiyi pofunsa kuti:
SELECT
-- current location in WAL
pg_last_xlog_replay_location(),
-- current transaction timestamp (state of the replica)
pg_last_xact_replay_timestamp(),
-- current physical time
now(),
-- the amount of time still to be applied until recovery_target_time has been reached
'2018-10-12 09:25:00+00'::timestamptz - pg_last_xact_replay_timestamp() as delay;
Ngati chidindo chanthawi sichikusintha, kuchira kwatha. Zochita zitha kusinthidwa mwamakonda recovery_target_action
Dongosolo la database lidabwerera m'malo ake asanapemphe mwatsoka. Tsopano mutha, mwachitsanzo, kutumiza deta. Tidatumiza data yomwe yafufutidwa ndi maulalo onse okhudzana ndi zovuta ndikuphatikiza zopempha ndikuzisunthira kumalo osungirako zinthu. Ngati zotayika zili zazikulu, mutha kungolimbikitsa chofanizira ndikuchigwiritsa ntchito ngati chachikulu. Koma ndiye zosintha zonse pambuyo poti tachira zidzatayika.
M'malo mwa masitampu anthawi, ndibwino kugwiritsa ntchito ma ID ochitika. Ndizothandiza kulemba ma ID awa, mwachitsanzo, pamawu a DDL (monga DROP TABLE
), pogwiritsa ntchito log_statements = 'ddl'
. Tikanakhala ndi ID yamalonda, tikanatenga recovery_target_xid
ndikuthamangitsa zonse mpaka kugulitsako musanapemphe DELETE
.
Kubwerera kuntchito ndikosavuta: chotsani zosintha zonse recovery.conf
ndikuyambitsanso Postgres. Chofananiracho posachedwapa chidzachedwanso kwa maola asanu ndi atatu, ndipo takonzekera mavuto amtsogolo.
Ubwino Wobwezeretsa
Ndi choyimira chochedwetsedwa m'malo mosunga zoziziritsa kukhosi, simuyenera kuthera maola ambiri mukubwezeretsa chithunzi chonsecho kuchokera pazosungidwa. Mwachitsanzo, zimatitengera maola asanu kuti tipeze zosunga zobwezeretsera zonse za 2 TB. Ndiyeno muyenera kugwiritsabe ntchito WAL yonse ya tsiku ndi tsiku kuti mubwererenso kumalo omwe mukufuna (zoipa kwambiri).
Chifaniziro chochedwetsedwa ndi chabwino kuposa kusunga kozizira m'njira ziwiri:
- Palibe chifukwa chochotsera zosunga zobwezeretsera zonse kuchokera pazosungidwa.
- Pali zenera la maola asanu ndi atatu la magawo a WAL omwe ayenera kubwerezedwa.
Timayang'ananso nthawi zonse kuti tiwone ngati n'kotheka kupanga PITR kuchokera ku WAL, ndipo tidzazindikira mwamsanga ziphuphu kapena mavuto ena ndi WAL archive poyang'anira kusanja kwa replica yomwe yachedwetsedwa.
Muchitsanzo ichi, zidatitengera mphindi 50 kuti tibwezeretse, kutanthauza kuti liwiro linali 110 GB ya data ya WAL pa ola (zosungirako zikadalipobe.
Zotsatira: pomwe chofananira chochedwetsedwa chili chothandiza (ndi pomwe sichili)
Gwiritsani ntchito kubwereza mochedwa ngati chithandizo choyamba ngati mwataya data mwangozi ndikuwona vutoli pakuchedwa komwe mwakonza.
Koma kumbukirani: kubwerezabwereza sikusungitsa.
Kusunga ndi kubwereza kuli ndi zolinga zosiyana. Kusunga kozizira kudzakuthandizani ngati mwapanga mwangozi DELETE
kapena DROP TABLE
. Timapanga zosunga zobwezeretsera kuchokera kumalo ozizira ndikubwezeretsa momwe zidakhalira patebulo kapena nkhokwe yonse. Koma pa nthawi yomweyo pempho DROP TABLE
imapangidwanso nthawi yomweyo muzofananira zonse pagulu logwira ntchito, kotero kubwereza wamba sikungathandize pano. Kubwereza komweko kumapangitsa kuti nkhokweyo ipezeke pomwe ma seva amodzi abwerekedwa ndikugawa katunduyo.
Ngakhale ndi chithunzi chochedwetsedwa, nthawi zina timafunikira zosunga zoziziritsa kukhosi pamalo otetezeka ngati kulephera kwa data center, kuwonongeka kobisika, kapena zochitika zina zomwe sizikuwoneka nthawi yomweyo. Kubwereza kokha sikuthandiza pano.
ndemanga. pa
Source: www.habr.com