কম্পিউটার

রুবি দিয়ে PostgreSQL পার্টিশন করা টেবিল পরিচালনা করা

আমরা আমাদের প্রাথমিক PostgreSQL ডাটাবেসে বিভাজিত টেবিল ব্যবহার করি কার্যকরীভাবে পুরানো ডেটার মেয়াদ শেষ করার জন্য, কারণ একটি বিশাল টেবিল থেকে একগুচ্ছ ডেটা মুছে ফেলার ফলে ডাটাবেসের কর্মক্ষমতা ক্ষতিগ্রস্ত হতে পারে। সংস্করণ 10-এর আগে, PostgreSQL-এর পার্টিশন করা টেবিলের জন্য স্থানীয় সমর্থন ছিল না, তাই আমরা পার্টিশন বাস্তবায়ন করতে pg_partman এক্সটেনশন ব্যবহার করতাম। এটি PostgreSQL এর টেবিলের উত্তরাধিকার ব্যবহার করে কাজ করে টেবিলের চাইল্ড টেবিল তৈরি করতে যা পার্টিশন করা হবে এবং প্যারেন্ট টেবিলের পরিবর্তে চাইল্ড টেবিলে ডেটা সন্নিবেশ করতে ট্রিগার করে। এই এক্সটেনশনটি আমাদের জন্য ভাল কাজ করেছে, কিন্তু এর একটি নেতিবাচক দিক রয়েছে -- আপনি যখন Amazon RDS ব্যবহার করছেন তখন এটি একটি বিকল্প নয়, কারণ এটি সমর্থিত নয়৷ এখন যেহেতু পোস্টগ্রেএসকিউএল-এ নেটিভ পার্টিশনের জন্য সমর্থন রয়েছে, আমি ভেবেছিলাম এখন সেই এক্সটেনশনটি বাদ দেওয়ার বিষয়ে দেখার সময় ছিল তাই আমাদের কাছে আরডিএস ব্যবহার করার বিকল্প থাকবে৷

আমাদের পার্টিশনের ব্যবহার-কেস মোটামুটি সহজ:আমরা সময়ের উপর ভিত্তি করে টেবিল বিভাজন করি, প্রতিদিন, সপ্তাহ বা মাসের জন্য একটি নতুন পার্টিশন তৈরি করি, আমরা সমস্ত পার্টিশন জুড়ে কতগুলি সারি সংরক্ষণ করতে চাই এবং কতক্ষণ ধরে রাখতে চাই তার উপর নির্ভর করে। তথ্য আমাদের সমস্ত পার্টিশন করা টেবিলের একটি created_at আছে কলাম যা প্রতিটি সারি কোন পার্টিশন সংরক্ষণ করে তা নির্ধারণ করতে ব্যবহৃত হবে। উদাহরণস্বরূপ, আমাদের এই মত সংজ্ঞায়িত একটি টেবিল থাকতে পারে:

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

এবং যদি আমরা সাপ্তাহিক পার্টিশন পেতে চাই, তাহলে সেগুলি দেখতে এরকম হবে:

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টি টেবিল প্রি-তৈরি করার জন্য রত্ন ডিফল্ট হয় , এবং এটি ডিফল্ট হিসেবে 7 দিন, 4 সপ্তাহ এবং 6 মাসের জন্য ডেটা ধরে রাখতে পারে যদি আপনি retain উল্লেখ না করেন .

একটি দৈনিক ক্রন কাজের সাথে সেই স্ক্রিপ্ট/টাস্কটি চালু করুন এবং আপনি সম্পূর্ণ প্রস্তুত -- এটি প্রয়োজন অনুসারে টেবিলগুলি তৈরি করবে এবং ফেলে দেবে৷

সমস্ত ActiveRecord ক্যোয়ারী ঠিক সেভাবে কাজ করে যেমন একটি অ-বিভাজন করা টেবিলের সাথে হয়, তাই আপনার কোডে পরিবর্তন করার দরকার নেই। অর্থাৎ, Event.create , Event.where , ইত্যাদি, তাদের সবসময়ের মতোই কাজ করবে, PostgreSQL যখন আপনি এটি সন্নিবেশ করবেন তখন আপনার জন্য সঠিক পার্টিশনে ডেটা রাখবে। আপনার কাছে প্রচুর ডেটা থাকলে একটি পরিবর্তন আপনি লক্ষ্য করতে পারেন, যদিও... আপনি যখন created_at অন্তর্ভুক্ত করেন আপনার ক্যোয়ারীতে, PostgreSQL-কে সমস্ত পার্টিশন স্ক্যান করতে হবে না -- শুধুমাত্র সেইগুলিই কভার করে যা আপনি আপনার যেখানে ক্লজে উল্লেখ করেছেন।

রিক্যাপ করার জন্য, যদি আপনার কাছে অনেক সময়-ভিত্তিক ডেটা থাকে যা আপনি এটির মেয়াদ শেষ হওয়ার সাথে সাথে মুছে ফেলতে চান, আপনার অ্যাপকে খুশি করতে PostgreSQL পার্টিশন করা টেবিল এবং pg_partition_manager রত্ন ব্যবহার করুন। :)


  1. রুবি নির্বাচন পদ্ধতি কিভাবে ব্যবহার করবেন (উদাহরণ সহ)

  2. রুবির সাথে গণিত:মডুলো অপারেটর, বাইনারি এবং আরও অনেক কিছু

  3. TCmalloc-এর সাথে রুবির মেমরি বরাদ্দের প্রোফাইলিং

  4. রুবি দিয়ে কীভাবে পার্সার তৈরি করবেন