نقل بیک اپ نہیں ہے۔ یا نہیں؟ یہ ہے کہ ہم نے غلطی سے حذف ہونے والے شارٹ کٹس سے بازیافت کرنے کے لیے موخر شدہ نقل کا استعمال کیسے کیا۔
نقل ڈیٹا بیس کو بیک اپ کرنے کا ذریعہ نہیں ہے (gitlab-ce
ایک موخر شدہ نقل کے ساتھ، ہم نے صرف 1,5 گھنٹے میں ڈیٹا بازیافت کیا۔ دیکھو کیسے ہوا؟
PostgreSQL کے ساتھ وقت کی وصولی میں پوائنٹ
PostgreSQL میں ایک بلٹ ان فنکشن ہے جو ڈیٹا بیس کی حالت کو وقت کے ایک خاص مقام پر بحال کرتا ہے۔ یہ کہا جاتا ہے
اس خصوصیت کو کولڈ بیک اپ کے لیے استعمال کرنے کے لیے، ہم باقاعدگی سے ایک بنیادی ڈیٹا بیس کا بیک اپ بناتے ہیں اور اسے ایک آرکائیو میں محفوظ کرتے ہیں (گٹ لیب آرکائیوز
موخر نقل کیا ہے؟
سست نقل ایک تاخیر کے ساتھ WAL سے تبدیلیوں کا اطلاق ہے۔ یعنی لین دین ایک گھنٹے میں ہوا۔ X
، لیکن یہ تاخیر کے ساتھ نقل میں ظاہر ہوگا۔ d
گھنٹے میں X + d
.
پوسٹگری ایس کیو ایل کے پاس فزیکل ڈیٹا بیس ریپلیکا سیٹ اپ کرنے کے 2 طریقے ہیں: بیک اپ ریکوری اور اسٹریمنگ ریپلیکا۔
آرکائیو سے تاخیری بازیابی کو کیسے ترتیب دیا جائے۔
recovery.conf
. ایک مثال:
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'
ان پیرامیٹرز کے ساتھ، ہم نے بیک اپ ریکوری کے ساتھ ایک موخر شدہ نقل ترتیب دی۔ یہاں یہ استعمال ہوتا ہے۔ restore_command
آرکائیو سے، اور تبدیلیاں آٹھ گھنٹے کے بعد لاگو ہوں گی (recovery_min_apply_delay
)۔ نقل آرکائیو میں ٹائم لائن کی تبدیلیوں کو دیکھے گی، مثال کے طور پر کلسٹر فیل اوور کی وجہ سے (recovery_target_timeline
).
С recovery_min_apply_delay
آپ تاخیر کے ساتھ سٹریمنگ ریپلیکیشن ترتیب دے سکتے ہیں، لیکن یہاں کچھ نقصانات ہیں جن کا تعلق نقل کے سلاٹس، ہاٹ اسٹینڈ بائی فیڈ بیک وغیرہ سے ہے۔ WAL آرکائیو آپ کو ان سے بچنے کی اجازت دیتا ہے۔
پیرامیٹر recovery_min_apply_delay
صرف PostgreSQL 9.3 میں ظاہر ہوا۔ پچھلے ورژن میں، موخر نقل کے لیے آپ کو مجموعہ ترتیب دینے کی ضرورت ہے۔ pg_xlog_replay_pause(), pg_xlog_replay_resume()
) یا تاخیر کی مدت کے لیے آرکائیو میں WAL حصوں کو ہولڈ کریں۔
PostgreSQL یہ کیسے کرتا ہے؟
یہ دیکھنا دلچسپ ہے کہ PostgreSQL کس طرح سست ریکوری کو لاگو کرتا ہے۔ آئیے دیکھتے ہیں۔ 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;
}
سب سے اہم بات یہ ہے کہ تاخیر ٹرانزیکشن کمٹ ٹائم اسٹیمپ میں درج طبعی وقت پر مبنی ہے (xtime
)۔ جیسا کہ آپ دیکھ سکتے ہیں، تاخیر صرف کمٹ پر لاگو ہوتی ہے اور دیگر اندراجات کو متاثر نہیں کرتی ہے - تمام تبدیلیاں براہ راست لاگو ہوتی ہیں، اور کمٹ میں تاخیر ہوتی ہے، لہذا ہم تبدیلیاں صرف ترتیب شدہ تاخیر کے بعد دیکھیں گے۔
ڈیٹا کو بحال کرنے کے لیے تاخیری نقل کا استعمال کیسے کریں۔
ہم کہتے ہیں کہ ہمارے پاس ایک ڈیٹا بیس کلسٹر اور ایک نقل ہے جس کی پیداوار میں آٹھ گھنٹے کی تاخیر ہے۔ آئیے دیکھتے ہیں کہ ایک مثال کا استعمال کرتے ہوئے ڈیٹا کو کیسے بازیافت کیا جائے۔
جب ہمیں اس مسئلے کے بارے میں معلوم ہوا، تو ہم
SELECT pg_xlog_replay_pause();
ایک وقفے کے ساتھ، ہمیں کوئی خطرہ نہیں تھا کہ نقل درخواست کو دہرائے گی۔ DELETE
. ایک مفید چیز اگر آپ کو ہر چیز کا پتہ لگانے کے لیے وقت درکار ہو۔
نقطہ یہ ہے کہ موخر شدہ نقل کو درخواست سے پہلے لمحے تک پہنچنا چاہئے۔ DELETE
. ہمیں ہٹانے کے جسمانی وقت کا تقریباً علم تھا۔ ہم نے حذف کر دیا ہے۔ recovery_min_apply_delay
اور شامل کیا recovery_target_time
в recovery.conf
. اس طرح نقل بغیر کسی تاخیر کے صحیح وقت پر پہنچ جاتی ہے:
recovery_target_time = '2018-10-12 09:25:00+00'
ٹائم اسٹامپ کے ساتھ، بہتر ہے کہ اضافی کو کم کیا جائے تاکہ ضائع نہ ہو۔ سچ ہے، جتنی زیادہ کمی ہوگی، اتنا ہی زیادہ ڈیٹا ہم کھو دیتے ہیں۔ ایک بار پھر، اگر ہم درخواست کو یاد کرتے ہیں DELETE
، سب کچھ دوبارہ حذف کر دیا جائے گا اور آپ کو دوبارہ شروع کرنا پڑے گا (یا یہاں تک کہ PITR کے لئے کولڈ بیک اپ لینا پڑے گا)۔
ہم نے ملتوی پوسٹگریس مثال کو دوبارہ شروع کیا اور WAL حصوں کو مقررہ وقت تک دہرایا گیا۔ آپ اس مرحلے پر یہ پوچھ کر پیشرفت کو ٹریک کر سکتے ہیں:
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;
اگر ٹائم اسٹیمپ مزید تبدیل نہیں ہوتا ہے، تو بازیابی مکمل ہو جاتی ہے۔ کارروائی اپنی مرضی کے مطابق کیا جا سکتا ہے recovery_target_action
اس بدقسمتی کی درخواست سے پہلے ڈیٹا بیس اپنی حالت میں واپس آگیا۔ اب آپ مثال کے طور پر ڈیٹا ایکسپورٹ کر سکتے ہیں۔ ہم نے حذف شدہ لیبل ڈیٹا اور مسائل کے تمام لنکس اور ضم کرنے کی درخواستوں کو برآمد کیا اور انہیں پروڈکشن ڈیٹا بیس میں منتقل کر دیا۔ اگر نقصانات بڑے پیمانے پر ہیں، تو آپ آسانی سے نقل کو فروغ دے سکتے ہیں اور اسے بنیادی کے طور پر استعمال کر سکتے ہیں۔ لیکن پھر اس مقام کے بعد تمام تبدیلیاں ختم ہو جائیں گی جہاں سے ہم بحال ہو چکے ہیں۔
ٹائم اسٹیمپ کے بجائے، ٹرانزیکشن آئی ڈی استعمال کرنا بہتر ہے۔ ان IDs کو ریکارڈ کرنا مفید ہے، مثال کے طور پر، DDL اسٹیٹمنٹس (جیسے DROP TABLE
)، کا استعمال کرتے ہوئے log_statements = 'ddl'
. اگر ہمارے پاس ٹرانزیکشن آئی ڈی ہوتی تو ہم لے لیتے recovery_target_xid
اور درخواست سے پہلے ہر چیز کو لین دین تک پہنچا دیا۔ DELETE
.
کام پر واپس جانا بہت آسان ہے: سے تمام تبدیلیاں ہٹا دیں۔ recovery.conf
اور پوسٹگریس کو دوبارہ شروع کریں۔ نقل میں جلد ہی دوبارہ آٹھ گھنٹے کی تاخیر ہوگی، اور ہم مستقبل کی پریشانیوں کے لیے تیار ہیں۔
بازیابی کے فوائد
کولڈ بیک اپ کے بجائے موخر شدہ نقل کے ساتھ، آپ کو آرکائیو سے پوری تصویر کو بحال کرنے میں گھنٹے نہیں گزارنے پڑتے۔ مثال کے طور پر، پورا بنیادی 2 ٹی بی بیک اپ حاصل کرنے میں ہمیں پانچ گھنٹے لگتے ہیں۔ اور پھر آپ کو مطلوبہ حالت میں واپس آنے کے لیے پوری روزانہ WAL کو لاگو کرنا ہوگا (بدترین صورت میں)۔
ایک موخر شدہ نقل کولڈ بیک اپ سے دو طریقوں سے بہتر ہے:
- آرکائیو سے پورے بنیادی بیک اپ کو ہٹانے کی ضرورت نہیں ہے۔
- WAL حصوں کی ایک مقررہ آٹھ گھنٹے کی کھڑکی ہے جسے دہرانا ضروری ہے۔
ہم یہ دیکھنے کے لیے بھی مسلسل جانچتے رہتے ہیں کہ آیا WAL سے PITR بنانا ممکن ہے، اور ہم WAL آرکائیو میں بدعنوانی یا دیگر مسائل کو فوری طور پر التوا کی نقل کے وقفے کی نگرانی کرتے ہوئے دیکھیں گے۔
اس مثال میں، ہمیں بحال کرنے میں 50 منٹ لگے، یعنی رفتار 110 GB WAL ڈیٹا فی گھنٹہ تھی (آرکائیو ابھی بھی آن تھا۔
نتائج: جہاں موخر شدہ نقل مفید ہے (اور کہاں نہیں ہے)
اگر آپ نے غلطی سے ڈیٹا کھو دیا ہے اور ترتیب شدہ تاخیر کے اندر اس مسئلے کو محسوس کیا ہے تو تاخیری نقل کو ابتدائی طبی امداد کے طور پر استعمال کریں۔
لیکن ذہن میں رکھیں: نقل بیک اپ نہیں ہے۔
بیک اپ اور نقل کے مختلف مقاصد ہوتے ہیں۔ اگر آپ نے غلطی سے بنایا تو کولڈ بیک اپ کام آئے گا۔ DELETE
یا DROP TABLE
. ہم کولڈ اسٹوریج سے بیک اپ بناتے ہیں اور ٹیبل یا پورے ڈیٹا بیس کی سابقہ حالت کو بحال کرتے ہیں۔ لیکن ایک ہی وقت میں درخواست DROP TABLE
ورکنگ کلسٹر پر تمام نقلوں میں تقریبا فوری طور پر دوبارہ تیار کیا جاتا ہے، لہذا عام نقل یہاں مدد نہیں کرے گی۔ جب انفرادی سرورز ڈاؤن ہوتے ہیں اور بوجھ تقسیم کرتے ہیں تو نقل خود ڈیٹا بیس کو دستیاب رکھتی ہے۔
یہاں تک کہ ایک موخر شدہ نقل کے ساتھ، ہمیں بعض اوقات واقعی کسی محفوظ جگہ پر کولڈ بیک اپ کی ضرورت ہوتی ہے اگر ڈیٹا سینٹر کی ناکامی، پوشیدہ نقصان، یا دیگر واقعات جو فوری طور پر قابل توجہ نہیں ہوتے ہیں۔ یہاں صرف نقل کا کوئی فائدہ نہیں۔
نوٹ. پر
ماخذ: www.habr.com