Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी के साथ PostgreSQL विभाजित तालिकाओं का प्रबंधन

हम पुराने डेटा को कुशलतापूर्वक समाप्त करने के लिए अपने प्राथमिक PostgreSQL डेटाबेस में विभाजित तालिकाओं का उपयोग करते हैं, क्योंकि एक विशाल तालिका से डेटा के एक समूह को हटाने से डेटाबेस का प्रदर्शन प्रभावित हो सकता है। संस्करण 10 से पहले, PostgreSQL के पास विभाजित तालिकाओं के लिए मूल समर्थन नहीं था, इसलिए हमने विभाजन को लागू करने के लिए pg_partman एक्सटेंशन का उपयोग किया। यह तालिका के चाइल्ड टेबल बनाने के लिए PostgreSQL की टेबल इनहेरिटेंस का उपयोग करके काम करता है जिसे विभाजित किया जाना है और पैरेंट टेबल के बजाय चाइल्ड टेबल में डेटा डालने के लिए ट्रिगर करता है। उस एक्सटेंशन ने हमारे लिए अच्छा काम किया है, लेकिन इसका एक नकारात्मक पहलू है - जब आप Amazon RDS का उपयोग कर रहे हों तो यह एक विकल्प नहीं है, क्योंकि यह समर्थित नहीं है। अब जबकि PostgreSQL के पास मूल विभाजन के लिए समर्थन है, मुझे लगा कि अब उस एक्सटेंशन को छोड़ने का समय आ गया है, इसलिए हमारे पास RDS का उपयोग करने का विकल्प होगा।

हमारा विभाजन उपयोग-मामला काफी सरल है:हम समय के आधार पर तालिकाओं का विभाजन करते हैं, हर दिन, सप्ताह या महीने के लिए एक नया विभाजन बनाते हैं, यह इस बात पर निर्भर करता है कि हम सभी विभाजनों में कितनी पंक्तियों को संग्रहीत करना चाहते हैं और हम कितने समय तक बनाए रखना चाहते हैं। जानकारी। हमारी सभी विभाजित तालिकाओं में एक created_at है कॉलम जिसका उपयोग यह निर्धारित करने के लिए किया जाएगा कि कौन सा विभाजन प्रत्येक पंक्ति को संग्रहीत करता है। उदाहरण के लिए, हमारे पास इस तरह परिभाषित एक तालिका हो सकती है:

create table events (
  project_id integer,
  data jsonb,
  created_at timestamp
)
partition by range (created_at);

और अगर हम साप्ताहिक विभाजन करना चाहते हैं, तो वे इस तरह दिखेंगे:

('2019-10-28') से ('2019-11-04') तक के मानों के लिए
create table events_p2019_10_28 partition of events for values from ('2019-10-28') to ('2019-11-04');
create table events_p2019_11_04 partition of events for values from ('2019-11-04') to ('2019-11-11');

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

ऊपर वर्णित घटना तालिका और विभाजन योजना को देखते हुए, आइए देखें कि आप इस रत्न का उपयोग कैसे करेंगे। आप एक स्क्रिप्ट या रेक कार्य तैयार करेंगे जो इस तरह दिखता है:

require "pg_partition_manager"

PgPartitionManager::Time.process([{parent_table: "public.events", period: "week", premake: 1, retain: 3}])

parent_table schema.table_name . के रूप में परिभाषित किया गया है (public , डिफ़ॉल्ट स्कीमा, अक्सर केवल एक रेल डेवलपर्स का उपयोग समाप्त होता है)। period दिन, सप्ताह या महीना हो सकता है। premake . के साथ आप चुन सकते हैं कि आप पहले से कितनी टेबल बनाना चाहते हैं (वर्तमान अवधि के बाद) , और retain . के साथ आप कितनी टेबल (वर्तमान अवधि से पहले) रखना चाहते हैं . यदि आप premake . निर्दिष्ट नहीं करते हैं, तो मणि 4 तालिकाओं को पूर्व-निर्मित करने के लिए डिफ़ॉल्ट है , और यदि आप retain निर्दिष्ट नहीं करते हैं, तो यह डिफ़ॉल्ट रूप से 7 दिन, 4 सप्ताह और 6 महीने के लिए डेटा बनाए रखता है ।

दैनिक क्रॉन जॉब के साथ उस स्क्रिप्ट/कार्य को आमंत्रित करें, और आप पूरी तरह तैयार हैं - यह आवश्यकतानुसार टेबल बनाएगा और छोड़ देगा।

सभी ActiveRecord प्रश्न ठीक वैसे ही कार्य करते हैं जैसे वे एक गैर-विभाजित तालिका के साथ करते हैं, इसलिए आपको अपने कोड में कुछ भी बदलने की आवश्यकता नहीं है। यानी Event.create , Event.where , आदि, हमेशा की तरह काम करेंगे, जब आप इसे सम्मिलित करते हैं तो PostgreSQL डेटा को आपके लिए सही विभाजन में रखता है। यदि आपके पास बहुत अधिक डेटा है, तो आप एक बदलाव देख सकते हैं, हालांकि... जब आप created_at शामिल करते हैं आपके प्रश्नों में, PostgreSQL को सभी विभाजनों को स्कैन नहीं करना होगा -- केवल वे विभाजन जो आपके द्वारा अपने खंड में निर्दिष्ट सीमा को कवर करते हैं।

संक्षेप में, यदि आपके पास बहुत अधिक समय-आधारित डेटा है जिसे आप समाप्त होने पर हटाना चाहते हैं, तो अपने ऐप को खुश करने के लिए PostgreSQL विभाजन तालिका और pg_partition_manager रत्न का उपयोग करें। :)

  1. रूबी के साथ गणित:मोडुलो ऑपरेटर, बाइनरी और अधिक

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

  1. टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी को मेमोरी टुकड़ों में मिलती है, जिन्हें पेज कहा जाता है, यहां नई वस्तुएं सहेजी जाती हैं। फिर… जब ये पृष्ठ भर जाते हैं, तो अधिक स्मृति की आवश्यकता होती है। रूबी ऑपरेटिंग सिस्टम से malloc . के साथ अधिक मेमोरी का अनुरोध करती है समारोह। यह malloc फ़ंक्श

  1. रूबी के साथ एक पार्सर कैसे बनाएं

    पार्सिंग स्ट्रिंग्स के एक गुच्छा को समझने और उन्हें किसी ऐसी चीज़ में बदलने की कला है जिसे हम समझ सकते हैं। आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं, लेकिन वे हमेशा कार्य के लिए उपयुक्त नहीं होते हैं। उदाहरण के लिए, यह सामान्य ज्ञान है कि नियमित अभिव्यक्तियों के साथ HTML को पार्स करना शायद एक अच्छ