Categories
Database Backup

**

প্রোডাকশনে PostgreSQL পরিচালনা করা ডেটাবেস অ্যাডমিনিস্ট্রেটর (DBAs) এবং ডেভঅপস (DevOps) ইঞ্জিনিয়ারদের জন্য, নিয়ার-জিরো রিকভারি পয়েন্ট অবজেক্টিভ (RPO) অর্জন করা একটি প্রধান লক্ষ্য। PostgreSQL-এর ডিজাস্টার রিকভারি এবং পয়েন্ট-ইন-টাইম রিকভারি (PITR) সক্ষমতার মূলে রয়েছে রাইট-অহেড লগিং (WAL)। যদিও WAL ডেটা ফাইলে লেখার আগে ট্রানজ্যাকশনগুলো লগ করে ACID কমপ্লায়েন্স নিশ্চিত করে, WAL আর্কাইভিং হলো সেই প্রক্রিয়া যা দীর্ঘমেয়াদী ব্যাকআপ এবং রেপ্লিকেশনের জন্য এই লগগুলোকে সংরক্ষণ করে।

যাইহোক, WAL আর্কাইভিং কনফিগার করা মানেই “একবার সেট করে ভুলে যাওয়া” নয়। ভুল কনফিগারেশন, নীরবে ব্যর্থতা এবং আর্কিটেকচারাল ভুল বোঝাবুঝির কারণে বিপর্যয়কর ডেটা লস, স্প্লিট-ব্রেইন পরিস্থিতি বা সম্পূর্ণ ডেটাবেস বিভ্রাট ঘটতে পারে।

এই বিস্তারিত নির্দেশিকায়, আমরা PostgreSQL WAL আর্কাইভিংয়ের আর্কিটেকচার অন্বেষণ করব, ডেটা লসের দিকে নিয়ে যাওয়া সবচেয়ে সাধারণ ভুলগুলো চিহ্নিত করব এবং আপনার ডেটাবেসকে সুরক্ষিত রাখতে প্রোডাকশন-গ্রেড সর্বোত্তম অনুশীলনগুলো তুলে ধরব।

PostgreSQL WAL আর্কিটেকচার বোঝা

ভুলগুলো নিয়ে আলোচনা করার আগে, PostgreSQL কীভাবে ট্রানজ্যাকশন লগ পরিচালনা করে তা বোঝা অত্যন্ত গুরুত্বপূর্ণ।

PostgreSQL সমস্ত পরিবর্তন WAL সেগমেন্টে (ডিফল্টভাবে 16MB ফাইল) লেখে, যা pg_wal ডিরেক্টরিতে (সংস্করণ 10-এর আগে pg_xlog নামে পরিচিত) থাকে। প্রতিটি ট্রানজ্যাকশন ক্রমানুসারে রেকর্ড করা হয় এবং একটি লগ সিকোয়েন্স নম্বর (LSN) দ্বারা চিহ্নিত করা হয়।

যখন একটি WAL সেগমেন্ট পূর্ণ হয়ে যায়, PostgreSQL একটি নতুন সেগমেন্টে সুইচ করে। pg_wal ডিরেক্টরিকে অসীমভাবে বৃদ্ধি পাওয়া থেকে রোধ করতে, ক্র্যাশ রিকভারি বা রেপ্লিকেশনের জন্য আর প্রয়োজন না হলে PostgreSQL পুরনো WAL সেগমেন্টগুলো রিসাইকেল বা মুছে ফেলে।

WAL আর্কাইভিং এই রিসাইক্লিং প্রক্রিয়াটিকে বাধা দেয়। যখন archive_mode সক্রিয় থাকে, তখন PostgreSQL একটি ব্যবহারকারী-সংজ্ঞায়িত archive_command (অথবা PostgreSQL 15+ এ archive_library) কার্যকর করে, যাতে সম্পূর্ণ WAL সেগমেন্টটি মুছে ফেলা বা ওভাররাইট হওয়ার আগে একটি নিরাপদ, সেকেন্ডারি অবস্থানে কপি করা যায়।

পয়েন্ট-ইন-টাইম রিকভারি (PITR) সম্পাদন করতে আপনার দুটি উপাদানের প্রয়োজন:
১. একটি বৈধ বেস ব্যাকআপ।
২. বেস ব্যাকআপের সময় থেকে আপনার কাঙ্ক্ষিত রিকভারি সময় পর্যন্ত আর্কাইভ করা WAL ফাইলগুলোর একটি অবিচ্ছিন্ন চেইন।

যদি সেই WAL চেইনটি ভেঙে যায়, তবে আপনার PITR ব্যর্থ হবে।

প্রোডাকশনের জন্য WAL আর্কাইভিং কনফিগার করা

WAL আর্কাইভিং সক্রিয় করতে, আপনাকে অবশ্যই আপনার postgresql.conf ফাইলটি পরিবর্তন করতে হবে। একটি মৌলিক কনফিগারেশনের জন্য wal_level সেট করা, archive_mode সক্রিয় করা এবং archive_command সংজ্ঞায়িত করা প্রয়োজন।

# postgresql.conf
wal_level = replica             # আর্কাইভিংয়ের জন্য 'replica' বা 'logical' প্রয়োজন
archive_mode = on               # আর্কাইভার প্রক্রিয়া সক্রিয় করে
archive_command = 'test ! -f /mnt/nfs/archive/%f && cp %p /mnt/nfs/archive/%f'
archive_timeout = 600           # প্রতি 10 মিনিটে একটি WAL সুইচ জোরপূর্বক কার্যকর করে

archive_command-এ:
* %p হলো আর্কাইভ করার জন্য WAL ফাইলের সম্পূর্ণ পাথ।
* %f হলো WAL ফাইলের নাম।

যদিও উপরের কনফিগারেশনটি সহজ মনে হয়, এন্টারপ্রাইজ পরিবেশে সাধারণ শেল কমান্ডের ওপর নির্ভর করা উল্লেখযোগ্য ঝুঁকি তৈরি করে।

WAL আর্কাইভিংয়ের সাধারণ ভুলসমূহ

ভুল ১: archive_command-এর “নীরব সাফল্য”

PostgreSQL সম্পূর্ণভাবে archive_command-এর এক্সিট কোডের ওপর নির্ভর করে। যদি কমান্ডটি 0 রিটার্ন করে, তবে PostgreSQL ধরে নেয় যে WAL ফাইলটি নিরাপদে আর্কাইভ করা হয়েছে এবং মূল ফাইলটি রিসাইকেল করার প্রক্রিয়া শুরু করে।

একটি সাধারণ ভুল হলো এমন একটি কমান্ড ব্যবহার করা যা ডেটা স্থায়ী স্টোরেজে ফ্ল্যাশ না হলেও 0 রিটার্ন করে। উদাহরণস্বরূপ, একটি সাধারণ cp কমান্ড ডেটা গন্তব্য সার্ভারের ওএস পেজ ক্যাশে পৌঁছানোর সাথে সাথেই সাফল্য দেখাতে পারে। যদি ডিস্কে ক্যাশ ফ্ল্যাশ হওয়ার আগেই গন্তব্য সার্ভারের বিদ্যুৎ চলে যায়, তবে WAL ফাইলটি হারিয়ে যাবে, কিন্তু PostgreSQL ইতিমধ্যে তার স্থানীয় কপি মুছে ফেলেছে।

ঝুঁকি: একটি ভাঙা WAL চেইন এবং PITR সম্পাদন করতে অক্ষমতা, যা কেবল ডিজাস্টার রিকভারির সময় ধরা পড়ে।

প্রতিকার: আপনার আর্কাইভিং স্ক্রিপ্ট যেন সিঙ্ক্রোনাস রাইট নিশ্চিত করে তা দেখুন। যদি স্ট্যান্ডার্ড শেল কমান্ড ব্যবহার করেন, তবে এমন টুল ব্যবহার করুন যা ডেটা ফ্ল্যাশ হওয়া নিশ্চিত করে, অথবা একটি র‍্যাপার স্ক্রিপ্ট লিখুন যা ট্রান্সফারের পরে ফাইলের আকার এবং চেকসাম যাচাই করে।

ভুল ২: pg_wal পার্টিশন পূর্ণ হয়ে যাওয়া (WAL Bloat)

যদি archive_command ব্যর্থ হয় (নন-জিরো এক্সিট কোড রিটার্ন করে)—নেটওয়ার্ক বিভ্রাট, ভুল পারমিশন বা গন্তব্য ডিস্ক পূর্ণ হওয়ার কারণে—তবে PostgreSQL WAL ফাইলটিকে pg_wal ডিরেক্টরিতে রেখে দেবে এবং অনির্দিষ্টকালের জন্য কমান্ডটি পুনরায় চেষ্টা করবে।

যদিও এটি আর্কাইভ না হওয়া WAL ফাইলগুলো মুছে না ফেলে ডেটা লস প্রতিরোধ করে, এটি একটি গুরুতর প্রাপ্যতা ঝুঁকি তৈরি করে। যদি pg_wal ডিরেক্টরি এমন একটি পার্টিশনে থাকে যা 100% পূর্ণ হয়ে যায়, তবে PostgreSQL একটি PANIC ইস্যু করবে এবং ক্র্যাশ করবে। জায়গা খালি না করা পর্যন্ত ডেটাবেস আর চালু হবে না।

ঝুঁকি: pg_wal পার্টিশন পূর্ণ হওয়ার কারণে সম্পূর্ণ ডেটাবেস ডাউনটাইম।

প্রতিকার:
১. সর্বদা pg_wal-কে একটি ডেডিকেটেড ডিস্ক পার্টিশনে রাখুন।
২. pg_wal ডিরেক্টরির আকারের ওপর কঠোর মনিটরিং প্রয়োগ করুন।
৩. ব্যর্থ আর্কাইভ কমান্ডগুলো অবিলম্বে শনাক্ত করতে pg_stat_archiver ভিউ মনিটর করুন।

ভুল ৩: অসম্পূর্ণ বেস ব্যাকআপ

ব্যাকআপ প্রক্রিয়া চলাকালীন তৈরি হওয়া WAL ফাইলগুলো ছাড়া একটি বেস ব্যাকআপ অকেজো। যদি আপনি ফাইলসিস্টেম-লেভেল স্ন্যাপশট নেন বা WAL স্ট্রিম না করে (-X stream ছাড়া) pg_basebackup ব্যবহার করেন, তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে ব্যাকআপের শুরু এবং শেষের মধ্যে তৈরি হওয়া WAL ফাইলগুলো সফলভাবে আর্কাইভ হয়েছে।

যদি আপনার আর্কাইভার ধীরগতির হয় বা ব্যর্থ হয় এবং সেই নির্দিষ্ট WAL ফাইলগুলো হারিয়ে যায়, তবে বেস ব্যাকআপটিকে একটি সামঞ্জস্যপূর্ণ অবস্থায় আনা সম্ভব নয়।

ঝুঁকি: ক্ষতিগ্রস্ত বা পুনরুদ্ধার অযোগ্য বেস ব্যাকআপ।

প্রতিকার: ব্যাকআপ পেলোডের মধ্যেই প্রয়োজনীয় WAL ফাইলগুলো অন্তর্ভুক্ত করতে pg_basebackup -X stream ব্যবহার করুন, অথবা এমন এন্টারপ্রাইজ ব্যাকআপ সলিউশন ব্যবহার করুন যা স্বয়ংক্রিয়ভাবে বেস ব্যাকআপ এবং WAL সেগমেন্টের মধ্যে নির্ভরতা পরিচালনা করে।

ভুল ৪: টাইমলাইন বিভ্রান্তি এবং স্প্লিট-ব্রেইন পরিস্থিতি

যখন একটি স্ট্যান্ডবাই সার্ভারকে প্রাইমারি হিসেবে প্রমোট করা হয়, তখন PostgreSQL “টাইমলাইন আইডি” (WAL ফাইলের নামের প্রথম অংশ, যেমন 0000000200000001000000A4) বৃদ্ধি করে। এটি নতুন প্রাইমারিকে পুরনো প্রাইমারির WAL ইতিহাস ওভাররাইট করা থেকে বিরত রাখে।

যাইহোক, যদি পুরনো প্রাইমারিটিকে সঠিকভাবে ফেন্সিং না করেই দুর্ঘটনাক্রমে চালু করা হয় (একটি স্প্লিট-ব্রেইন পরিস্থিতি), তবে এটি পুরনো টাইমলাইন ব্যবহার করে একই আর্কাইভ অবস্থানে WAL ফাইল পাঠানোর চেষ্টা করতে পারে। যদি আপনার archive_command অন্ধভাবে ফাইল ওভাররাইট করে, তবে আপনি আপনার আর্কাইভ রিপোজিটরি নষ্ট করে ফেলতে পারেন।

ঝুঁকি: ওভাররাইট হওয়া WAL ফাইল, ক্ষতিগ্রস্ত আর্কাইভ এবং পুনরুদ্ধার অযোগ্য ডেটাবেস।

প্রতিকার: আপনার archive_command কখনোই বিদ্যমান ফাইল ওভাররাইট করবে না। আগের মৌলিক কনফিগারেশনে লক্ষ্য করুন, আমরা ফাইলটি ইতিমধ্যে বিদ্যমান থাকলে স্পষ্টভাবে ব্যর্থ হওয়ার জন্য test ! -f /mnt/nfs/archive/%f ব্যবহার করেছি।

ডেটা লসের ঝুঁকি কমানো: প্রোডাকশন সর্বোত্তম অনুশীলন

আপনার PostgreSQL আর্কাইভিং কৌশলকে শক্তিশালী করতে, নিম্নলিখিত সর্বোত্তম অনুশীলনগুলো প্রয়োগ করুন।

১. নেটিভভাবে আর্কাইভার প্রক্রিয়া মনিটর করুন

PostgreSQL-এ একটি বিল্ট-ইন ভিউ আছে, pg_stat_archiver, যা আপনার আর্কাইভিং প্রক্রিয়ার সাফল্য এবং ব্যর্থতা ট্র্যাক করে। আপনার অবজারভেবিলিটি স্ট্যাকে (যেমন Prometheus, Datadog, বা Zabbix) এই ভিউটিকে ইন্টিগ্রেট করা উচিত।

SELECT 
    archived_count,
    last_archived_wal,
    last_archived_time,
    failed_count,
    last_failed_wal,
    last_failed_time,
    stats_reset
FROM pg_stat_archiver;

কনফিগার করার জন্য অ্যালার্টিং থ্রেশহোল্ড:
* যদি failed_count বৃদ্ধি পায় তবে অ্যালার্ট দিন।
* যদি now() এবং last_archived_time-এর মধ্যে সময়ের পার্থক্য আপনার RPO থ্রেশহোল্ড (যেমন ১৫ মিনিট) অতিক্রম করে তবে অ্যালার্ট দিন, মনে রাখবেন যে কম ট্র্যাফিকের ডেটাবেসগুলোতে archive_timeout সেট না থাকলে স্বাভাবিকভাবেই বিলম্ব হতে পারে।

২. archive_timeout ব্যবহার করুন

কম রাইট ভলিউমযুক্ত ডেটাবেসগুলোতে, একটি 16MB WAL ফাইল পূর্ণ হতে কয়েক ঘণ্টা সময় লাগতে পারে। যতক্ষণ না এটি পূর্ণ হয়, ততক্ষণ এটি আর্কাইভ হয় না। যদি সার্ভার ক্র্যাশ করে এবং স্থানীয় ডিস্ক হারিয়ে যায়, তবে আপনি কয়েক ঘণ্টার ট্রানজ্যাকশন হারাবেন।

archive_timeout = 600 (10 মিনিট) সেট করা PostgreSQL-কে একটি নতুন WAL ফাইলে সুইচ করতে এবং বর্তমান ফাইলটি আর্কাইভ করতে বাধ্য করে, এমনকি যদি এটি পূর্ণ নাও হয়। এটি নিশ্চিত করে যে আপনার RPO 10 মিনিটের বেশি হবে না, যদিও আংশিক পূর্ণ WAL ফাইলের কারণে স্টোরেজ কিছুটা বেশি ব্যবহৃত হতে পারে।

৩. archive_library-তে রূপান্তর (PostgreSQL 15+)

ঐতিহাসিকভাবে, archive_command প্রতিটি WAL ফাইলের জন্য একটি নতুন শেল প্রক্রিয়া তৈরি করত। উচ্চ-থ্রুপুট পরিবেশে যেখানে প্রতি মিনিটে শত শত WAL ফাইল তৈরি হয়, শেল প্রক্রিয়া তৈরির ওভারহেড একটি পারফরম্যান্স বাধা হয়ে দাঁড়ায়।

PostgreSQL 15-এ archive_library প্যারামিটার যুক্ত করা হয়েছে, যা WAL আর্কাইভিংকে ডায়নামিক্যালি লোড করা C মডিউল দ্বারা পরিচালনা করার অনুমতি দেয়। এটি শেল-ফর্কিং ওভারহেড দূর করে এবং অনেক বেশি শক্তিশালী, উচ্চ-পারফরম্যান্স আর্কাইভিং প্রক্রিয়া প্রদান করে। আপনি যদি PostgreSQL 15 বা তার উচ্চতর সংস্করণে থাকেন, তবে কাস্টম আর্কাইভ মডিউল সমর্থন করে এমন ব্যাকআপ টুলগুলো খুঁজুন।

৪. নিয়মিত পয়েন্ট-ইন-টাইম রিকভারি পরীক্ষা করুন

একটি পরীক্ষিত ব্যাকআপ মানে ব্যাকআপ নয়; এটি একটি ইচ্ছা মাত্র। আপনার WAL আর্কাইভিং সঠিকভাবে কাজ করছে কিনা, আপনার WAL চেইন অবিচ্ছিন্ন কিনা এবং আপনার বেস ব্যাকআপগুলো সামঞ্জস্যপূর্ণ কিনা তা যাচাই করার একমাত্র উপায় হলো নিয়মিত, স্বয়ংক্রিয় PITR পরীক্ষা করা।

একটি অস্থায়ী ইনস্ট্যান্স চালু করুন, বেস ব্যাকআপ পুনরুদ্ধার করুন, আপনার আর্কাইভ থেকে পুল করার জন্য restore_command কনফিগার করুন এবং একটি নির্দিষ্ট টাইমস্ট্যাম্পে রিকভার করুন। যাচাই করুন যে ডেটাবেসটি একটি সামঞ্জস্যপূর্ণ অবস্থায় পৌঁছায় এবং সংযোগের জন্য উন্মুক্ত হয়।

CloudSave-এর সাথে এন্টারপ্রাইজ ব্যাকআপ এবং রিকভারি

archive_command-এর জন্য কাস্টম শেল স্ক্রিপ্ট পরিচালনা করা, WAL ডিডুপ্লিকেশন হ্যান্ডেল করা এবং ট্রানজ্যাকশন লগের জন্য নিরাপদ, অফসাইট স্টোরেজ নিশ্চিত করা আইটি টিমের জন্য দ্রুত একটি অপারেশনাল বোঝা হয়ে উঠতে পারে।

এখানেই CloudSave এন্টারপ্রাইজ PostgreSQL পরিবেশের জন্য উল্লেখযোগ্য মূল্য প্রদান করে। CloudSave সরাসরি PostgreSQL-এর নেটিভ ব্যাকআপ এবং WAL আর্কাইভিং API-এর সাথে ইন্টিগ্রেট হয়, যা উপরে আলোচিত ম্যানুয়াল ভুলগুলো দূর করে।

ভঙ্গুর ব্যাশ স্ক্রিপ্ট লেখার পরিবর্তে, CloudSave একটি শক্তিশালী, এজেন্ট-ভিত্তিক বা এজেন্টলেস ইন্টিগ্রেশন প্রদান করে যা:
* ডেলিভারি নিশ্চিত করে: স্ট্যান্ডার্ড শেল কমান্ডগুলোকে নিরাপদ অফসাইট বা ক্লাউড স্টোরেজে যাচাইকৃত, চেকসাম-ভ্যালিডেটেড ট্রান্সফার দিয়ে প্রতিস্থাপন করে।
* WAL Bloat প্রতিরোধ করে: সক্রিয়ভাবে pg_wal ডিরেক্টরি মনিটর করে এবং পার্টিশন পূর্ণ হওয়ার অনেক আগেই অ্যাডমিনিস্ট্রেটরদের সতর্ক করে।
* PITR স্বয়ংক্রিয় করে: একটি স্বজ্ঞাত ইন্টারফেসের মাধ্যমে পয়েন্ট-ইন-টাইম রিকভারিকে সহজ করে। আপনি যে মিনিটে রিকভার করতে চান তা নির্বাচন করুন, এবং CloudSave স্বয়ংক্রিয়ভাবে সঠিক বেস ব্যাকআপ পুনরুদ্ধার করে এবং সেই অবস্থায় পৌঁছানোর জন্য প্রয়োজনীয় WAL ফাইলগুলোর সঠিক সিকোয়েন্স স্ট্রিম করে।
* টাইমলাইন পরিচালনা করে: বুদ্ধিমত্তার সাথে PostgreSQL টাইমলাইন ইতিহাস পরিচালনা করে, নিশ্চিত করে যে ফেইলওভার এবং স্প্লিট-ব্রেইন পরিস্থিতি আপনার ব্যাকআপ রিপোজিটরিকে নষ্ট না করে।

WAL ব্যবস্থাপনার ভারী কাজ CloudSave-এর ওপর ছেড়ে দিয়ে, DBA-রা কুয়েরি অপ্টিমাইজেশন এবং ডেটাবেস পারফরম্যান্সের দিকে মনোযোগ দিতে পারেন, এই জেনে যে তাদের RPO এবং RTO SLA একটি এন্টারপ্রাইজ-গ্রেড প্ল্যাটফর্ম দ্বারা সুরক্ষিত।

উপসংহার

PostgreSQL WAL আর্কাইভিং হলো ডেটাবেস ডিজাস্টার রিকভারির মেরুদণ্ড। যদিও একটি ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে ফাইল কপি করার ধারণাটি সহজ মনে হয়, তবে এজ কেসগুলো—নীরব ব্যর্থতা, ডিস্ক নিঃশেষ হওয়া এবং টাইমলাইন ডাইভারজেন্স—ডেটা অখণ্ডতার জন্য গুরুতর ঝুঁকি তৈরি করে।

pg_wal-এর আর্কিটেকচার বুঝে, ধ্বংসাত্মক archive_command কনফিগারেশন কঠোরভাবে এড়িয়ে, pg_stat_archiver মনিটর করে এবং CloudSave-এর মতো এন্টারপ্রাইজ ব্যাকআপ প্ল্যাটফর্ম ব্যবহার করে, আপনি একটি স্থিতিস্থাপক PostgreSQL অবকাঠামো তৈরি করতে পারেন যা হার্ডওয়্যার ব্যর্থতা, মানবিক ত্রুটি এবং বিপর্যয়কর বিভ্রাটের মধ্যেও একটি সিঙ্গেল কমিটেড ট্রানজ্যাকশন না হারিয়ে টিকে থাকতে সক্ষম।

PostgreSQL WAL আর্কাইভিংয়ের সাধারণ ভুলগুলো আবিষ্কার করুন যা ডেটা লসের দিকে নিয়ে যায়। বিশেষজ্ঞ DBA সর্বোত্তম অনুশীলন, কনফিগারেশন টিপস এবং এন্টারপ্রাইজ ডেটাবেসের জন্য নির্ভরযোগ্য পয়েন্ট-ইন-টাইম রিকভারি (PITR) নিশ্চিত করার উপায়গুলো শিখুন।

বিভাগসমূহ