Chan eil ath-riochdachadh mar chùl-taic. No nach eil? Seo mar a chleachd sinn ath-riochdachadh dàil gus faighinn seachad air ath-ghoiridean a chaidh a dhubhadh às gun fhiosta.
Chan eil ath-riochdachadh na dhòigh air cùl-taic a dhèanamh de stòran-dàta (gitlab-ce
Le mac-samhail air a chuir dheth, fhuair sinn air ais dàta ann an dìreach 1,5 uairean. Seall mar a thachair.
Ath-bheothachadh puing ann an ùine le PostgreSQL
Tha gnìomh togte aig PostgreSQL a bheir air ais staid stòr-dàta gu àm sònraichte. Canar
Gus am feart seo a chleachdadh airson cùl-taic fuar, bidh sinn gu cunbhalach a’ dèanamh cùl-taic stòr-dàta bunaiteach agus ga stòradh ann an tasglann (tha tasglann GitLab a’ fuireach ann
Dè a th’ ann an ath-riochdachadh dàil?
Is e ath-riochdachadh leisg cleachdadh atharrachaidhean bho WAL le dàil. Is e sin, thachair an gnothach ann an uair a thìde X
, ach nochdaidh e anns a' mhac-samhail le dàil d
ann an uair X + d
.
Tha dòighean 2 aig PostgreSQL airson mac-samhail stòr-dàta corporra a stèidheachadh: ath-nuadhachadh cùl-taic agus ath-riochdachadh sruthadh.
Mar a shuidhicheas tu dàil air faighinn air ais bho thasglann
recovery.conf
. Eisimpleir:
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'
Leis na crìochan sin, shuidhich sinn mac-samhail dàil le ath-bheothachadh cùl-taic. An seo tha e air a chleachdadh restore_command
) bhon tasglann, agus thèid atharrachaidhean a chuir an sàs an dèidh ochd uairean (recovery_min_apply_delay
). Coimheadaidh am mac-samhail airson atharrachaidhean loidhne-tìm san tasglann, mar eisimpleir ri linn fàilligeadh cnuasachaidh (recovery_target_timeline
).
С recovery_min_apply_delay
Faodaidh tu ath-riochdachadh sruthadh a chuir air dòigh le dàil, ach tha cnap-starra no dhà an seo a tha co-cheangailte ri sliotan ath-riochdachadh, fios air ais teth cùl-taic, agus mar sin air adhart. Leigidh tasglann WAL leat an seachnadh.
Parameter recovery_min_apply_delay
nochdadh ann am PostgreSQL 9.3 a-mhàin. Ann an dreachan roimhe, airson ath-riochdachadh dàil feumaidh tu am measgachadh a rèiteachadh pg_xlog_replay_pause(), pg_xlog_replay_resume()
) no cùm earrannan WAL san tasglann fhad ‘s a bhios an dàil ann.
Ciamar a nì PostgreSQL seo?
Tha e inntinneach fhaicinn mar a bhios PostgreSQL a’ cur an gnìomh ath-bheothachadh leisg. Bheir sinn sùil air 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;
}
Is e an loidhne gu h-ìosal gu bheil an dàil stèidhichte air an ùine fiosaigeach a chaidh a chlàradh ann an clàr-ama gealltanas a’ ghnothaich (xtime
). Mar a chì thu, chan eil an dàil a’ buntainn ach ri geallaidhean agus chan eil e a’ toirt buaidh air inntrigidhean eile - tha a h-uile atharrachadh air a chuir an sàs gu dìreach, agus tha dàil air a’ ghealladh, agus mar sin chan fhaic sinn na h-atharrachaidhean ach às deidh an dàil rèiteachaidh.
Mar a chleachdas tu mac-samhail dàil gus dàta a thoirt air ais
Canaidh sinn gu bheil cruinneachadh stòr-dàta againn agus mac-samhail le dàil ochd uairean a thìde ann an cinneasachadh. Nach faic sinn mar a gheibh sinn air ais dàta a 'cleachdadh eisimpleir
Nuair a dh'ionnsaich sinn mun duilgheadas, rinn sinn
SELECT pg_xlog_replay_pause();
Le stad, cha robh cunnart sam bith againn gun dèanadh am mac-samhail an t-iarrtas a-rithist DELETE
. Rud feumail ma tha feum agad air ùine airson a h-uile càil a thuigsinn.
Is e a’ phuing gum feum am mac-samhail a chaidh a chuir dheth a ruighinn an ìre ron iarrtas DELETE
. Bha fios againn timcheall air àm corporra an toirt air falbh. Tha sinn air a sguabadh às recovery_min_apply_delay
agus air a chur ris recovery_target_time
в recovery.conf
. Seo mar a ruigeas am mac-samhail an àm cheart gun dàil:
recovery_target_time = '2018-10-12 09:25:00+00'
Le stampaichean ùine, tha e nas fheàrr an còrr a lughdachadh gus nach caill thu. Fìor, mar as motha an lùghdachadh, is ann as motha de dhàta a chailleas sinn. A-rithist, ma chailleas sinn an t-iarrtas DELETE
, thèid a h-uile càil a dhubhadh às a-rithist agus feumaidh tu tòiseachadh a-rithist (no eadhon cùl-taic fuar a ghabhail airson PITR).
Ath-thòisich sinn an eisimpleir Postgres a chaidh a chuir dheth agus chaidh na roinnean WAL ath-aithris gus an àm ainmichte. Faodaidh tu adhartas a leantainn aig an ìre seo le bhith a’ faighneachd:
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;
Mura h-atharraich an clàr-ama tuilleadh, tha an ath-bheothachadh deiseil. Faodar gnìomh a ghnàthachadh recovery_target_action
Thill an stòr-dàta chun na stàite aige ron iarrtas mhì-fhortanach sin. A-nis faodaidh tu, mar eisimpleir, às-mhalairt dàta. Chuir sinn a-mach an dàta leubail a chaidh a dhubhadh às agus a h-uile ceangal gu cùisean agus iarrtasan aonaidh agus ghluais sinn iad a-steach don stòr-dàta toraidh. Ma tha na call mòr, faodaidh tu dìreach am mac-samhail adhartachadh agus a chleachdadh mar am prìomh fhear. Ach an uairsin thèid a h-uile atharrachadh às deidh na h-ìre gu bheil sinn air faighinn seachad air a chall.
An àite clàran-ama, tha e nas fheàrr IDan malairt a chleachdadh. Tha e feumail na IDan sin a chlàradh, mar eisimpleir, airson aithrisean DDL (leithid DROP TABLE
), le bhith a’ cleachdadh log_statements = 'ddl'
. Nam biodh ID malairt againn, ghabhadh sinn recovery_target_xid
agus ruith a h-uile càil sìos chun a 'ghnothaich ron iarrtas DELETE
.
Tha e glè shìmplidh faighinn air ais a dh'obair: cuir às do gach atharrachadh recovery.conf
agus ath-thòiseachadh Postgres. Bidh dàil ochd uairean a thìde air a’ mhac-samhail a dh’ aithghearr, agus tha sinn deiseil airson trioblaidean san àm ri teachd.
Sochairean Ath-bheothachaidh
Le mac-samhail dàil an àite cùl-taic fuar, cha leig thu leas uairean a chaitheamh ag ath-nuadhachadh an ìomhaigh gu lèir bhon tasglann. Mar eisimpleir, bheir e còig uairean a thìde dhuinn an cùl-taic bunaiteach 2 TB gu lèir fhaighinn. Agus an uairsin feumaidh tu fhathast an WAL làitheil gu lèir a chuir an sàs gus faighinn air ais chun staid a tha thu ag iarraidh (anns a’ chùis as miosa).
Tha mac-samhail dàil nas fheàrr na cùl-taic fuar ann an dà dhòigh:
- Chan eil feum air an cùl-taic bunaiteach gu lèir a thoirt air falbh bhon tasglann.
- Tha uinneag stèidhichte ochd uairean a thìde de earrannan WAL a dh'fheumar a dhèanamh a-rithist.
Bidh sinn cuideachd an-còmhnaidh a’ sgrùdadh a bheil e comasach PITR a dhèanamh bho WAL, agus mhothaich sinn gu sgiobalta coirbeachd no duilgheadasan eile le tasglann WAL le bhith a’ cumail sùil air dàil a’ mhac-samhail a chaidh a chuir dheth.
San eisimpleir seo, thug e 50 mionaid dhuinn ath-nuadhachadh, a’ ciallachadh gu robh an astar 110 GB de dhàta WAL san uair (bha an tasglann fhathast air adhart
Toraidhean: far a bheil mac-samhail dàil feumail (agus far nach eil)
Cleachd ath-riochdachadh dàil mar chiad chobhair ma chaill thu dàta gun fhiosta agus ma mhothaich thu an duilgheadas seo taobh a-staigh na dàil a chaidh a rèiteachadh.
Ach cumaibh cuimhne: chan e cùl-taic a th’ ann an ath-riochdachadh.
Tha diofar adhbharan aig cùl-taic agus ath-riochdachadh. Bidh cùl-taic fuar feumail ma rinn thu gun fhiosta DELETE
no DROP TABLE
. Bidh sinn a’ dèanamh cùl-taic bho stòradh fuar agus ag ath-nuadhachadh staid a’ bhùird no an stòr-dàta gu lèir. Ach aig an aon àm an t-iarrtas DROP TABLE
cha mhòr sa bhad air ath-riochdachadh anns a h-uile mac-samhail air a’ bhuidheann obrach, agus mar sin cha chuidich ath-riochdachadh àbhaisteach an seo. Bidh ath-riochdachadh fhèin a’ cumail an stòr-dàta ri fhaighinn nuair a bhios frithealaichean fa-leth air am màl a-mach agus a’ cuairteachadh an luchd.
Eadhon le mac-samhail air a chuir dheth, uaireannan bidh feum againn air cùl-taic fuar ann an àite sàbhailte ma thachras fàilligeadh ionad dàta, milleadh falaichte, no tachartasan eile nach fhaicear sa bhad. Chan eil ath-riochdachadh leis fhèin gu feum sam bith an seo.
thuirt. Air adhart
Source: www.habr.com