PostgreSQL: क्या मैं एक लाइव पर pg_start_backup () कर सकता हूँ, लोडिंग के तहत db चल रहा है?


19

हमारी स्थापित प्रतिकृति टूट गई है ("अनुरोध किए गए वाल सेगमेंट को पहले ही हटा दिया गया है" डाउनटाइम के दौरान) हम आसानी से मास्टर को फिर से रोक नहीं सकते हैं।

क्या हम कर सकते हैं

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ दास के स्वामी,
  3. pg_stop_backup()

... जबकि मास्टर पोस्टग्रेजल अभी भी पूर्ण भार के अधीन है? (या pg_start_backup()करने के लिए नेतृत्व करेंगे

  • टेबल ताले,
  • मैं / हे ब्लॉक,
  • विसंगतियों,
  • फायर अलार्म,
  • धीमी db प्रतिक्रिया

दूसरे शब्दों में, pg_start_backup()हमारे आवेदन को प्रभावित करेगा?


क्या आपने डॉक्स की जाँच की है ? यह कहता है "डिफ़ॉल्ट रूप से, pg_start_backup को समाप्त होने में लंबा समय लग सकता है। यह इसलिए है क्योंकि यह एक चेकपॉइंट करता है, और चेकपॉइंट के लिए आवश्यक I / O एक महत्वपूर्ण समय अवधि में फैल जाएगा, डिफ़ॉल्ट रूप से आधा अंतर-चेकपॉइंट द्वारा। अंतराल (कॉन्फ़िगरेशन पैरामीटर checkpoint_completion_target देखें)। यह आमतौर पर आप क्या चाहते हैं, क्योंकि यह क्वेरी प्रसंस्करण पर प्रभाव को कम करता है। " हालांकि व्यवहार में इसका मतलब (और आपके मामले में) काफी स्पष्ट नहीं है।
डेज़ो

जवाबों:


11

pg_start_backupचेकपोस्ट प्रदर्शन करेगा, डीज़ो नोट्स के रूप में। इसका प्रभाव पड़ता है, लेकिन आपका डेटाबेस वैसे भी नियमित रूप से चौकियों का प्रदर्शन करता है, और कार्य करने के लिए ऐसा करना चाहिए, इसलिए वे स्पष्ट रूप से आपके लिए कोई समस्या नहीं हैं। एक प्रारंभिक चेकपॉइंट का मतलब है कि कम डेटा जमा हुआ है, जिसका अर्थ है कि अगर कुछ भी चेकप्वाइंट pg_start_backupसामान्य से कम प्रभाव होगा।

जहाँ आपको चिंता करने की आवश्यकता है वह है rsync या समकक्ष pg_basebackupचरण। इससे पढ़ा गया I / O बहुत ज्यादा खराब नहीं होगा क्योंकि यह अनुक्रमिक है, लेकिन यह अभी भी संभवतः आपके डेटाबेस के I / O प्रदर्शन को काफी नुकसान पहुंचाएगा, और यह रैम कैश के गर्म डेटा को कम के पक्ष में धकेल देगा। -उपयोग किया गया डेटा, जिसके कारण कैश को अधिक आवश्यक डेटा के रूप में पिरोया जाता है, फिर वापस पढ़ा जाता है।

आप I / O प्रभाव (लेकिन कैश प्रभाव नहीं) को सीमित करने के लिए उपयोग कर सकते हैं niceऔर कर सकते हैं ionice; हालाँकि, इसके लिए एक लागत है। बैकअप अधिक समय लेगा, और जब तक आप बैकअप को पूरा नहीं करते हैं और pg_stop_backupआपका सिस्टम चलता है - जैसा कि मैं इसे समझता हूं - वॉल्यू को संचित करना, इसे डिलीट नहीं कर सकता, बैकअप रन के अंत में BIG चेकपॉइंट के लिए चेकपॉइंट ऋण जमा करना और तालिका और इंडेक्स जमा करना है ब्लोट क्योंकि यह मृत पंक्तियों को साफ नहीं कर सकता है। तो आप वास्तव में हमेशा के लिए बैकअप लेने का जोखिम नहीं उठा सकते हैं, खासकर यदि आपके पास बहुत अधिक मंथन टेबल हैं।

अंत में, यह कहना मुश्किल है कि क्या आप अपने वातावरण में सुरक्षित रूप से pg_start_backupऔर pg_stop_backupहॉट बैकअप के लिए उपयोग कर सकते हैं । अधिकांश लोग कर सकते हैं, लेकिन यदि आप अपने हार्डवेयर के किनारे के करीब हैं, तो समय की आवश्यकताओं को पूरा कर सकते हैं, स्टाल के जोखिम को बर्दाश्त नहीं कर सकते हैं, और बहुत उच्च तालिकाओं के साथ-साथ बहुत बड़ी तालिकाओं को भी परेशान कर सकते हैं, यह परेशानी हो सकती है। ।

दुर्भाग्य से, आपको इसका परीक्षण करने और देखने की बहुत आवश्यकता है।

यदि आप कर सकते हैं, तो यह CHECKPOINTआपके डेटाबेस के एलवीएम, आपके सैन के टूल्स, ईबीएस, या जो भी आप कर रहे हैं, का उपयोग करने के बजाय वॉल्यूम का परमाणु स्नैपशॉट जारी करने के लायक हो सकता है । यदि आप ऐसा कर सकते हैं, तो आप स्नैपशॉट को अपने अवकाश पर कॉपी कर सकते हैं। यह दृष्टिकोण पीआईटीआर / वार्म स्टैंडबाय / हॉट स्टैंडबाय के लिए आधार बैकअप लेने के लिए उपयुक्त नहीं है, लेकिन यह एक स्थिर बैकअप कॉपी के लिए पूरी तरह से अच्छा है, और सिस्टम पर बहुत कम प्रभाव डालता है। आप इसे केवल तभी कर सकते हैं जब आपका स्नैपशॉट परमाणु हो और वाल सहित आपका पूरा डेटाबेस एकल वॉल्यूम पर हो।

एक संभावना है कि मैंने अभी तक जांच नहीं की है दो दृष्टिकोणों का संयोजन है। यह मेरे लिए होता है कि एक संभवतः (सकता है अपरीक्षित और संभवतः गलत और असुरक्षित , मैं अभी तक पता नहीं है):

  • pg_start_backup
  • सभी तालिकाओं के ट्रिगर स्नैपशॉट, मुख्य डेटाडियर और ज़्लॉग वॉल्यूम
  • pg_stop_backup
  • से अंतिम संग्रह तक वाल कॉपी करें pg_stop_backup
  • स्नैपशॉट किए गए वॉल्यूम से डेटा की प्रतिलिपि बनाएँ

अनिवार्य रूप से, यह विचार करना कम करना है कि कब तक DB को प्रत्येक वॉल्यूम के पॉइंट-इन-टाइम लेने से अपनी चौकियों को विलंबित करना पड़ता है जिसे आप अपने अवकाश पर कॉपी कर सकते हैं।


यह समझने के बाद कि pg_start_backup () ज्यादातर "नियंत्रित चेकपॉइंटिंग की चीज है", हमने बस कोशिश करने और देखने के लिए आत्मविश्वास अर्जित किया। ऐसा लगता है कि चल रहे आवेदन पर प्रभाव नगण्य था। (SSD पर मास्टर मुख्य डेटादिर) :-) आपके द्वारा प्रस्तावित "अप्रयुक्त और संभवतः असुरक्षित" विचार हमारी क्षमता के स्तर से थोड़ा ऊपर है, और रोमांच की लालसा है।
डैनियल

ओह, और हमने पहली कोशिश में rsync को आयनित नहीं किया। क्योंकि हम वास्तव में मास्टर पर अतिरिक्त भार देखना चाहते थे। चूँकि हमें दूसरे rsync रन की कभी आवश्यकता नहीं थी, इसलिए सब ठीक है। हमने उससे कुछ सीखा।
डैनियल

7

यह एक गंभीर खुदाई है लेकिन मुझे यहां कुछ सुधारना होगा।

पिछला उत्तर बता रहा है:

I / O प्रभाव (लेकिन कैश प्रभाव नहीं) को सीमित करने में मदद करने के लिए आप अच्छा और आयनी का उपयोग कर सकते हैं; हालाँकि, इसके लिए एक लागत है। बैकअप अधिक समय लेगा, और जब तक आप बैकअप पूरा नहीं करते हैं और pg_stop_backup चलाते हैं, तब तक आपका सिस्टम है - जैसा कि मैं इसे समझता हूं - वाल को संचित करना, इसे डिलीट नहीं कर सकता, बैकअप रन के अंत में BIG चेकपॉइंट के लिए चेकपॉइंट ऋण जमा करना, और तालिका संचय कर रहा है और इंडेक्स ब्लोट क्योंकि यह मृत पंक्तियों को साफ नहीं कर सकता है। तो आप वास्तव में हमेशा के लिए बैकअप लेने का जोखिम नहीं उठा सकते हैं, खासकर यदि आपके पास बहुत अधिक मंथन टेबल हैं।

यह सच नहीं है। सिस्टम आपके कॉन्फ़िगरेशन में उल्लिखित वाल की संख्या को रखेगा ( ऑनलाइन प्रलेखन को cf )। तो मूल रूप से, के बीच उच्च मूल्य:

  • (2 + checkpoint_completion_ratio) * चेकपॉइंट_सेक्शन + 1
  • wal_keep_segments

आइए इस मामले की कल्पना करें:

  • आपके बैकअप में लंबा समय लग रहा है, क्योंकि कॉपी करने के लिए सैकड़ों गिग्स हैं
  • आपके पास एक छोटा सा वाल्ट रिटेंशन है (उदाहरण के लिए चेकपॉइंट_से 3 पर,)
  • आपके पास वाल संग्रह नहीं है

फिर "pg_start_backup ()" आरंभ करने के बाद, आपकी वाल फाइलें आपके बैकअप के दौरान घूमेंगी। जब आपका बैकअप समाप्त हो जाएगा, तब आप इसे किसी अन्य डेटाबेस इंजन पर पुनर्स्थापित करने का प्रयास करेंगे। लॉन्च पर इंजन "pg_start_backup ()" जारी करने पर कम से कम वाल फ़ाइल उत्पन्न करेगा।

pg_start_backup 
-----------------
B/D0020F18
(1 row)

जब तक आप वाल फाइल "0000000x0000000B000000D0" (जहाँ x आपकी टाइमलाइन है ) तक डेटाबेस बूट नहीं करेगा । यह वाल फाइल सिस्टम के बूट करने के लिए नंगे न्यूनतम है। बेशक, केवल इस फ़ाइल के साथ, आप डेटा खो देंगे, क्योंकि बाकी डेटा वाल फ़ाइलों में आपके पास नहीं हैं, लेकिन कम से कम, आपके पास एक काम करने वाला डेटाबेस इंजन होगा।

तो या तो आप वाल आर्काइविंग जरूर करें, या आपको ज़रूरी वाल फाइल्स को अपने आप से बचाना होगा, लेकिन Postgresql आपके लिए ऐसा नहीं करेगा।


3
बहुत अच्छा अवलोकन। pg_basebackup --xlog-method=streamहालांकि अगर मैं गलत नहीं हूं तो इससे बचा जा सकता है।
tomorrow__

2
हां, पीजी 9.2 के बाद, आप आधार बैकअप के साथ वाल को स्ट्रीम कर सकते हैं। यह दूसरी स्ट्रीम खोलेगा, इसलिए आपको max_wal_sendersकम से कम 2 सेट करने की आवश्यकता है । बैकअप के अंत में "लापता वाल" समस्या से बचने का यह एक अच्छा तरीका है।
Sterfield

4

PostgreSQL के साथ मेरे अनुभव के रूप में यह अपेक्षाकृत सुरक्षित संचालन है जब तक कि आपके पास उस क्षण वास्तव में बड़ा प्रदर्शन प्रभाव न हो। यदि आपके पास यह है तो अपने सभी क्लाइंट से अस्थायी ठहराव लेखन के लिए बेहतर है।

मेरे पास केवल एक महत्वपूर्ण मामला था जब मैं अपने स्वामी को लोड के तहत गुलाम बना रहा था और यह ओओएम किलर के कारण था (हाँ, आपको वास्तव में डेटाबेस नोड्स पर ओओएम किलर को अक्षम करना चाहिए, मुझे उस दिन यह नहीं पता था)।

इसलिए मैंने रात के बैकअप से डेटाबेस को पुनर्स्थापित किया है और फिर से खेलना के लिए pg_archive निर्देशिका से सभी वाल सेगमेंट को पोस्टग्रेट करने के लिए दिया है (बस उन्हें pg_xlog फ़ोल्डर में कॉपी किया गया है)। सबकुछ ठीक हो गया लेकिन डाउनटाइम अवश्यम्भावी था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.