Atunse kii ṣe afẹyinti. Bi beko? Eyi ni bii a ṣe lo ẹda ti o da duro lati gba pada lati piparẹ awọn ọna abuja lairotẹlẹ.
Atunṣe kii ṣe ọna ti n ṣe afẹyinti awọn data data (gitlab-ce
Pẹlu ẹda ti o da duro, a gba data pada ni awọn wakati 1,5 nikan. Wo bi o ṣe ṣẹlẹ.
Tọkasi ni imularada akoko pẹlu PostgreSQL
PostgreSQL ni iṣẹ ti a ṣe sinu ti o mu ipo data pada si aaye kan pato ni akoko. O ti wa ni a npe ni
Lati lo ẹya yii fun afẹyinti tutu, a ṣe afẹyinti ipilẹ data nigbagbogbo ati tọju rẹ sinu ile ifi nkan pamosi (Awọn ile-ipamọ GitLab n gbe ni
Kini ẹda ti o da duro?
Atunse ọlẹ jẹ ohun elo ti awọn ayipada lati WAL pẹlu idaduro. Iyẹn ni, idunadura naa waye ni wakati kan X
, ṣugbọn yoo han ninu ẹda pẹlu idaduro d
ni wakati kan X + d
.
PostgreSQL ni awọn ọna 2 lati ṣeto ẹda ẹda data ti ara: imularada afẹyinti ati ẹda ṣiṣanwọle.
Bii o ṣe le ṣeto imularada idaduro lati ile-ipamọ kan
recovery.conf
... Apẹẹrẹ:
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'
Pẹlu awọn paramita wọnyi, a tunto ẹda ti o da duro pẹlu imularada afẹyinti. Nibi ti o ti lo restore_command
) lati ile-ipamọ, ati awọn ayipada yoo ṣee lo lẹhin awọn wakati mẹjọ (recovery_min_apply_delay
). Ẹda naa yoo wo awọn ayipada aago ninu ile-ipamọ, fun apẹẹrẹ nitori ikuna iṣupọ kan (recovery_target_timeline
).
С recovery_min_apply_delay
O le ṣeto atunṣe ṣiṣanwọle pẹlu idaduro, ṣugbọn awọn ọfin meji kan wa nibi ti o ni ibatan si awọn iho ẹda, esi imurasilẹ gbona, ati bẹbẹ lọ. Ile-ipamọ WAL gba ọ laaye lati yago fun wọn.
Apaadi recovery_min_apply_delay
han nikan ni PostgreSQL 9.3. Ni awọn ẹya ti tẹlẹ, fun ẹda ti o da duro o nilo lati tunto apapo naa pg_xlog_replay_pause(), pg_xlog_replay_resume()
) tabi mu awọn apakan WAL duro ni ibi ipamọ fun iye akoko idaduro naa.
Bawo ni PostgreSQL ṣe eyi?
O jẹ ohun ti o nifẹ lati rii bii PostgreSQL ṣe ṣe imupadabọ ọlẹ. Jẹ ki a wo 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;
}
Laini isalẹ ni pe idaduro naa da lori akoko ti ara ti o gbasilẹ ninu idunadura ṣe timestamp (xtime
). Bii o ti le rii, idaduro naa kan si awọn iṣe ati pe ko ni ipa awọn titẹ sii miiran - gbogbo awọn ayipada ni a lo taara, ati pe adehun naa ni idaduro, nitorinaa a yoo rii awọn ayipada nikan lẹhin idaduro tunto.
Bii o ṣe le lo ẹda idaduro lati mu data pada
Jẹ ki a sọ pe a ni iṣupọ data data ati ẹda kan pẹlu idaduro wakati mẹjọ ni iṣelọpọ. Jẹ ká wo bi o lati bọsipọ data nipa lilo ohun apẹẹrẹ
Nigba ti a kẹkọọ nipa iṣoro naa, a
SELECT pg_xlog_replay_pause();
Pẹlu idaduro, a ko ni eewu pe ẹda naa yoo tun ibeere naa ṣe DELETE
. Ohun ti o wulo ti o ba nilo akoko lati ro ero ohun gbogbo.
Ojuami ni pe ẹda ti o da duro gbọdọ de akoko ṣaaju ibeere naa DELETE
. A fẹrẹ mọ akoko ti ara ti yiyọ kuro. A ti paarẹ recovery_min_apply_delay
o si fi kun recovery_target_time
в recovery.conf
. Eyi ni bii ajọra ṣe de akoko to tọ laisi idaduro:
recovery_target_time = '2018-10-12 09:25:00+00'
Pẹlu awọn ontẹ akoko, o dara lati dinku afikun ki o má ba padanu. Otitọ, ti o pọju idinku, diẹ sii data ti a padanu. Lẹẹkansi, ti a ba padanu ibeere naa DELETE
, ohun gbogbo yoo paarẹ lẹẹkansi ati pe iwọ yoo ni lati bẹrẹ lẹẹkansi (tabi paapaa gba afẹyinti tutu fun PITR).
A tun bẹrẹ apẹẹrẹ Postgres ti a da duro ati pe awọn apakan WAL ni a tun ṣe titi di akoko kan pato. O le tọpa ilọsiwaju ni ipele yii nipa bibeere:
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;
Ti timestamp ko ba yipada mọ, imularada ti pari. Iṣe le jẹ adani recovery_target_action
Ipamọ data pada si ipo rẹ ṣaaju ibeere lailoriire yẹn. Bayi o le, fun apẹẹrẹ, okeere data. A ṣe okeere data aami ti o paarẹ ati gbogbo awọn ọna asopọ si awọn ọran ati dapọ awọn ibeere ati gbe wọn lọ si ibi ipamọ data iṣelọpọ. Ti awọn adanu ba jẹ iwọn nla, o le jiroro ni igbega ajọra naa ki o lo bi akọkọ. Ṣugbọn lẹhinna gbogbo awọn ayipada lẹhin aaye ti a ti gba pada yoo sọnu.
Dipo awọn aami igba, o dara lati lo awọn ID idunadura. O wulo lati ṣe igbasilẹ awọn ID wọnyi, fun apẹẹrẹ, fun awọn alaye DDL (bii DROP TABLE
), nipa lilo log_statements = 'ddl'
. Ti a ba ni ID idunadura, a yoo gba recovery_target_xid
ati ki o ran ohun gbogbo si isalẹ lati awọn idunadura ṣaaju ki o to awọn ìbéèrè DELETE
.
Gbigba pada si iṣẹ rọrun pupọ: yọ gbogbo awọn ayipada kuro recovery.conf
ki o tun bẹrẹ Postgres. Ẹda naa yoo ni idaduro wakati mẹjọ lẹẹkansi, ati pe a ti mura silẹ fun awọn wahala iwaju.
Awọn Anfani Imularada
Pẹlu ẹda ti o da duro dipo afẹyinti tutu, o ko ni lati lo awọn wakati mimu-pada sipo gbogbo aworan lati ile-ipamọ. Fun apẹẹrẹ, o gba to wakati marun lati gba gbogbo ipilẹ 2 TB afẹyinti. Ati lẹhinna o tun ni lati lo gbogbo WAL lojoojumọ lati gba pada si ipo ti o fẹ (ninu ọran ti o buru julọ).
Apẹrẹ ti a da duro dara ju afẹyinti tutu ni awọn ọna meji:
- Ko si ye lati yọ gbogbo afẹyinti ipilẹ kuro ni ile-ipamọ.
- Ferese wakati mẹjọ wa ti awọn apakan WAL ti o gbọdọ tun ṣe.
A tun ṣayẹwo nigbagbogbo lati rii boya o ṣee ṣe lati ṣe PITR kan lati WAL, ati pe a yoo yara ṣe akiyesi ibajẹ tabi awọn iṣoro miiran pẹlu ile-ipamọ WAL nipa ṣiṣe abojuto aisun ti ẹda ti a da duro.
Ninu apẹẹrẹ yii, o gba wa ni iṣẹju 50 lati mu pada, afipamo pe iyara naa jẹ 110 GB ti data WAL fun wakati kan (ipamọ naa tun wa ni titan.
Awọn abajade: nibiti ẹda ti o da duro ti wulo (ati nibiti ko ṣe)
Lo atunṣe idaduro bi iranlọwọ akọkọ ti o ba padanu data lairotẹlẹ ati ṣe akiyesi iṣoro yii laarin idaduro iṣeto.
Ṣugbọn ṣe akiyesi: atunkọ kii ṣe afẹyinti.
Afẹyinti ati atunṣe ni awọn idi oriṣiriṣi. Afẹyinti tutu yoo wa ni ọwọ ti o ba ṣe lairotẹlẹ DELETE
tabi DROP TABLE
. A ṣe afẹyinti lati ibi ipamọ tutu ati mu pada ipo iṣaaju ti tabili tabi gbogbo data data. Ṣugbọn ni akoko kanna ibeere naa DROP TABLE
ti fẹrẹ ṣe ẹda lesekese ni gbogbo awọn ẹda lori iṣupọ iṣẹ, nitorinaa ẹda lasan kii yoo ṣe iranlọwọ nibi. Atunse ara rẹ ntọju aaye data wa nigbati awọn olupin kọọkan ti yalo jade ti o pin kaakiri.
Paapaa pẹlu ẹda ti o da duro, nigba miiran a nilo afẹyinti tutu ni aaye ailewu ti ikuna ile-iṣẹ data kan, ibajẹ ti o farapamọ, tabi awọn iṣẹlẹ miiran ti ko ṣe akiyesi lẹsẹkẹsẹ waye. Atunse nikan ni ko si lilo nibi.
Daakọ... Tan
orisun: www.habr.com