Categories
Disaster Recovery

**

ডেভঅপস (DevOps) ইঞ্জিনিয়ার, ডেটাবেস অ্যাডমিনিস্ট্রেটর (DBA) এবং আইটি সিস্টেম আর্কিটেক্টদের জন্য, রিকভারি টাইম অবজেক্টিভ (RTO) এবং রিকভারি পয়েন্ট অবজেক্টিভ (RPO) কেবল ব্যবসায়িক ধারাবাহিকতার কিছু শব্দ নয়—এগুলো কঠোর ইঞ্জিনিয়ারিং সীমাবদ্ধতা। মিশন-ক্রিটিক্যাল ডেটাবেস পরিচালনার সময়, এই মেট্রিকগুলো সঠিকভাবে গণনা করতে, সে অনুযায়ী আর্কিটেকচার তৈরি করতে এবং যাচাই করতে ব্যর্থ হলে তা ভয়াবহ ডেটা লস এবং দীর্ঘ সময় সিস্টেম ডাউনটাইমের কারণ হতে পারে।

আধুনিক এন্টারপ্রাইজ পরিবেশে, RTO এবং RPO গণনা করার জন্য ডেটাবেস ইন্টারনাল, স্টোরেজ I/O, নেটওয়ার্ক থ্রুপুট এবং ট্রানজ্যাকশন লগ মেকানিক্স সম্পর্কে গভীর জ্ঞানের প্রয়োজন। এই নির্দেশিকাটি প্রোডাকশন ডেটাবেস সিস্টেমের জন্য RTO এবং RPO গণনা, পরীক্ষা এবং অপ্টিমাইজ করার প্রযুক্তিগত পদ্ধতিগুলো অন্বেষণ করে।

ডেটাবেস সিস্টেমে RPO (রিকভারি পয়েন্ট অবজেক্টিভ) বিশ্লেষণ

RPO হলো সময়ের হিসেবে ডেটা হারানোর সর্বোচ্চ গ্রহণযোগ্য পরিমাণ। যদি আপনার RPO ১৫ মিনিট হয়, তবে দুপুর ১২:০০ টায় কোনো বিপর্যয় ঘটলে, আপনাকে অবশ্যই সকাল ১১:৪৫ পর্যন্ত সমস্ত কমিট করা ট্রানজ্যাকশন পুনরুদ্ধার করতে সক্ষম হতে হবে।

ডেটাবেসের ক্ষেত্রে, RPO আপনার ট্রানজ্যাকশন লগ ম্যানেজমেন্ট কৌশলের (PostgreSQL-এ WAL, Oracle-এ Redo Logs, SQL Server-এ Transaction Logs) ওপর নির্ভর করে।

ডেটা লস এবং লগ জেনারেশনের মেকানিক্স

অর্জনের যোগ্য RPO গণনা করতে, আপনাকে প্রথমে আপনার ডেটাবেসের ট্রানজ্যাকশন লগ জেনারেশনের হার বুঝতে হবে। যদি আপনি প্রতি ১৫ মিনিটে একটি ব্যাকআপ রিপোজিটরিতে লগ পাঠান, কিন্তু আপনার নেটওয়ার্ক যদি সেই সময়ের মধ্যে ১৫ মিনিটের লগ স্থানান্তর করতে না পারে, তবে আপনার প্রকৃত RPO ক্রমাগত খারাপ হতে থাকবে।

আপনি নেটিভ SQL কমান্ড ব্যবহার করে আপনার লগ জেনারেশনের হারের বেসলাইন তৈরি করতে পারেন। উদাহরণস্বরূপ, PostgreSQL (সংস্করণ ১০+) এ, আপনি একটি নির্দিষ্ট সময়ের ব্যবধানে রাইট-অহেড লগ (WAL) জেনারেশনের হার পরিমাপ করতে পারেন:

-- T=0 সময়ে এটি চালান
SELECT pg_current_wal_lsn() AS start_lsn;

-- ঠিক ৫ মিনিট (৩০০ সেকেন্ড) অপেক্ষা করুন, তারপর চালান:
SELECT pg_current_wal_lsn() AS end_lsn,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), 'START_LSN_VALUE')) AS wal_generated_size,
       pg_wal_lsn_diff(pg_current_wal_lsn(), 'START_LSN_VALUE') / 300 AS bytes_per_second;

যদি এই কুয়েরিটি দেখায় যে পিক লোডের সময় আপনি ৫০ MB/s WAL ডেটা তৈরি করছেন, তবে ১৫ মিনিটের RPO বজায় রাখতে আপনার ব্যাকআপ স্টোরেজে ৪৫ GB লগ ডেটা স্থানান্তর করতে হবে। এই RPO বজায় রাখার জন্য আপনার নেটওয়ার্ক এবং স্টোরেজ টার্গেটগুলোকে অবশ্যই ৫০ MB/s এর বেশি স্থায়ী রাইট স্পিড সমর্থন করতে হবে।

সিনক্রোনাস বনাম অ্যাসিনক্রোনাস রেপ্লিকেশনের প্রভাব

অনেক DBA RPO পূরণের জন্য হাই অ্যাভেইল্যাবিলিটি (HA) রেপ্লিকেশনের ওপর নির্ভর করেন। তবে, রেপ্লিকেশন কোনো ব্যাকআপ নয়। একটি ড্রপ করা টেবিল (DROP TABLE users;) তাৎক্ষণিকভাবে রেপ্লিকেট হয়ে যায়।

ডিজাস্টার রিকভারি (DR) এর জন্য রেপ্লিকেশন ব্যবহার করার সময়, রেপ্লিকেশন মোড সরাসরি RPO-কে প্রভাবিত করে:
* সিনক্রোনাস রেপ্লিকেশন: শূন্য RPO (RPO=0) নিশ্চিত করে। প্রাইমারি ডেটাবেস ততক্ষণ পর্যন্ত কোনো ট্রানজ্যাকশন কমিট করবে না যতক্ষণ না স্ট্যান্ডবাই তা পাওয়ার বিষয়টি নিশ্চিত করে। এর বিনিময়ে প্রাইমারি রাইট অপারেশনে ল্যাটেন্সি বৃদ্ধি পায়।
* অ্যাসিনক্রোনাস রেপ্লিকেশন: রেপ্লিকেশন ল্যাগ তৈরি করে। আপনার RPO কার্যকরভাবে আপনার বর্তমান রেপ্লিকেশন ল্যাগের সমান।

PostgreSQL-এ অ্যাসিনক্রোনাস রেপ্লিকেশন ল্যাগ মনিটর করতে, এটি ব্যবহার করুন:

SELECT application_name,
       client_addr,
       state,
       sync_state,
       pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replication_lag_bytes
FROM pg_stat_replication;

বৃহৎ আকারের ডেটাবেসের জন্য RTO (রিকভারি টাইম অবজেক্টিভ) বিশ্লেষণ

RTO হলো ডাউনটাইমের সর্বোচ্চ সহনশীল সময়কাল। ডেটাবেস RTO গণনা করা অত্যন্ত জটিল কারণ এটি কেবল সার্ভারে ফাইল কপি করার সময় নয়।

RTO গণনার গাণিতিক মডেল

একটি বাস্তবসম্মত ডেটাবেস RTO গণনায় চারটি ভিন্ন পর্যায় বিবেচনা করতে হবে:

RTO = T(infra) + T(transfer) + T(restore) + T(recovery)

  1. T(infra) – ইনফ্রাস্ট্রাকচার প্রভিশনিং: রিপ্লেসমেন্ট কম্পিউট এবং স্টোরেজ চালু করার সময়। (প্রি-প্রভিশনড DR সাইট বা ইনফ্রাস্ট্রাকচার-অ্যাজ-কোড পাইপলাইনের মাধ্যমে এটি প্রায় শূন্য হতে পারে)।
  2. T(transfer) – ডেটা স্থানান্তর: রিপোজিটরি থেকে ডেটাবেস সার্ভারে ব্যাকআপ পেলোড সরানোর সময়।
  3. T(restore) – ফিজিক্যাল রিস্টোর: টার্গেট ডিস্কে ডেটা ফাইলগুলো লেখার সময়।
  4. T(recovery) – ডেটাবেস ক্র্যাশ রিকভারি: ডেটাবেস ইঞ্জিনের ট্রানজ্যাকশন লগ রিপ্লে করা, কমিট করা ট্রানজ্যাকশনগুলো রোল ফরোয়ার্ড করা এবং আনকমিট করা ট্রানজ্যাকশনগুলো রোল ব্যাক করার সময়।

ট্রান্সফার এবং রিস্টোর সময় গণনা

T(transfer) এবং T(restore) গণনা করতে, আপনাকে আপনার নেটওয়ার্ক ব্যান্ডউইথ এবং ডিস্ক IOPS/থ্রুপুটের বেসলাইন তৈরি করতে হবে। তাত্ত্বিক সর্বোচ্চ সীমার ওপর নির্ভর করবেন না; আপনার প্রকৃত ইনফ্রাস্ট্রাকচার পরীক্ষা করুন।

আপনার ব্যাকআপ রিপোজিটরি এবং ডেটাবেস সার্ভারের মধ্যে নেটওয়ার্ক থ্রুপুট পরীক্ষা করতে iperf3 ব্যবহার করুন:

# ব্যাকআপ রিপোজিটরিতে (সার্ভার)
iperf3 -s

# ডেটাবেস সার্ভারে (ক্লায়েন্ট)
iperf3 -c <backup_repo_ip> -t 60 -P 4

আপনার ডেটাবেস স্টোরেজ ভলিউমের সিকোয়েন্সিয়াল রাইট পারফরম্যান্স পরীক্ষা করতে fio ব্যবহার করুন, যা একটি ডেটাবেস রিস্টোর অপারেশন সিমুলেট করবে:

fio --name=restore_sim --ioengine=libaio --rw=write --bs=1M --size=10G --numjobs=4 --iodepth=32 --direct=1 --filename=/var/lib/postgresql/data/testfile

যদি আপনার ডেটাবেস ৫ TB হয় এবং আপনার fio পরীক্ষাগুলো ৫০০ MB/s এর সর্বোচ্চ স্থায়ী রাইট স্পিড দেখায়, তবে আপনার সর্বনিম্ন T(restore) হবে প্রায় ২.৮ ঘণ্টা। যদি আপনার ব্যবসায়িক SLA ১ ঘণ্টার RTO দাবি করে, তবে প্রচলিত স্ট্রিমিং রিস্টোর ব্যর্থ হবে। আপনাকে আপনার আর্কিটেকচারকে স্টোরেজ-লেভেল স্ন্যাপশট বা ব্লক-লেভেল রেপ্লিকেশনে পরিবর্তন করতে হবে।

লুকানো ফাঁদ: T(recovery)

সবচেয়ে বেশি অবমূল্যায়িত ভেরিয়েবল হলো T(recovery)। যদি আপনি একটি সাপ্তাহিক ফুল ব্যাকআপ রিস্টোর করেন এবং আপনার RPO-তে পৌঁছানোর জন্য ৬ দিনের ট্রানজ্যাকশন লগ প্রয়োগ করতে হয়, তবে ডেটাবেস ইঞ্জিনকে প্রতিটি ট্রানজ্যাকশন ক্রমানুসারে রিপ্লে করতে হবে।

৫০০ GB ট্রানজ্যাকশন লগ রিপ্লে করতে কয়েক ঘণ্টা সময় লাগতে পারে, যা সিঙ্গেল-থ্রেডেড CPU পারফরম্যান্স এবং স্টোরেজ IOPS দ্বারা ব্যাপকভাবে বাধাগ্রস্ত হয়। T(recovery) কমাতে, আপনার ফুল বা ডিফারেনশিয়াল ব্যাকআপের ফ্রিকোয়েন্সি বাড়ান।

ব্যবধান কমানো: RTO এবং RPO যাচাই করার ব্যবহারিক পদক্ষেপ

তাত্ত্বিক RTO এবং RPO গণনা করা কেবল প্রথম ধাপ। মিশন-ক্রিটিক্যাল এনভায়রনমেন্টের জন্য ক্রমাগত যাচাইকরণ প্রয়োজন।

ধাপ ১: কন্টিনিউয়াস আর্কাইভিং বাস্তবায়ন করুন

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

SQL Server-এ, আপনি ঘন ঘন ট্রানজ্যাকশন লগ ব্যাকআপ অটোমেট করতে পারেন:

BACKUP LOG [MissionCriticalDB] 
TO DISK = N'\BackupRepoSQLMissionCriticalDB_Log.trn' 
WITH NOFORMAT, NOINIT, 
NAME = N'MissionCriticalDB-Transaction Log Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;

সেরা অনুশীলন: আপনার RPO প্রয়োজনীয়তার ওপর ভিত্তি করে প্রতি ১-৫ মিনিটে এই জবটি চালানোর সময় নির্ধারণ করুন।

ধাপ ২: রিস্টোর টেস্টিং অটোমেট করুন

একটি পরীক্ষিত নয় এমন ব্যাকআপ কেবল একটি তাত্ত্বিক ধারণা। আপনার গণনা করা RTO নিশ্চিত করতে, আপনাকে অবশ্যই অটোমেটেড রিস্টোর টেস্টিং করতে হবে।

CloudSave-এর মতো এন্টারপ্রাইজ ব্যাকআপ প্ল্যাটফর্মগুলো অটোমেটেড, আইসোলেটেড রিকভারি টেস্টিং প্রদান করে এটি সহজ করে তোলে। CloudSave স্বয়ংক্রিয়ভাবে একটি স্যান্ডবক্স এনভায়রনমেন্ট চালু করতে পারে, সর্বশেষ ব্যাকআপ মাউন্ট করতে পারে, একটি সম্পূর্ণ ডেটাবেস রিকভারি করতে পারে এবং কাস্টম ভ্যালিডেশন স্ক্রিপ্ট (যেমন SQL Server-এর জন্য DBCC CHECKDB) চালাতে পারে যাতে সঠিক RTO পরিমাপ করা যায় এবং ডেটার অখণ্ডতা নিশ্চিত করা যায়। এটি RTO-কে একটি অনুমান থেকে প্রমাণিত এবং রিপোর্টযোগ্য মেট্রিক্সে রূপান্তরিত করে।

ধাপ ৩: SLA লঙ্ঘনের বিষয়ে মনিটর এবং অ্যালার্ট করুন

আপনার মনিটরিং স্ট্যাকের (Prometheus, Datadog, Zabbix) সক্রিয়ভাবে সেই মেট্রিকগুলো ট্র্যাক করা উচিত যা আপনার RTO/RPO SLA-কে হুমকির মুখে ফেলে। অ্যালার্ট রুলগুলো নিচের বিষয়গুলোর জন্য কনফিগার করা উচিত:
* ব্যাকআপ জব ফেইলুর: RPO-এর জন্য তাৎক্ষণিক হুমকি।
* লগ শিপিং ল্যাটেন্সি: যদি লগ স্থানান্তর জেনারেশন ইন্টারভ্যালের চেয়ে বেশি সময় নেয়।
* স্টোরেজ IOPS থ্রটলিং: ক্লাউড প্রোভাইডাররা (যেমন AWS EBS) যদি বার্স্ট ক্রেডিট শেষ হয়ে যায় তবে IOPS থ্রটল করে, যা প্রকৃত জরুরি অবস্থার সময় আপনার RTO-কে নীরবে ধ্বংস করে দেবে।

কঠোর SLA পূরণের জন্য ডেটাবেস ব্যাকআপ আর্কিটেকচার অপ্টিমাইজ করা

যখন গাণিতিক গণনা প্রকাশ করে যে আপনার বর্তমান আর্কিটেকচার ব্যবসায়িক SLA পূরণ করতে পারে না, তখন আপনাকে আপনার ব্যাকআপ কৌশল অপ্টিমাইজ করতে হবে।

১. ব্লক-লেভেল ইনক্রিমেন্টাল ব্যাকআপের সুবিধা নিন

প্রচলিত ডেটাবেস ডাম্পগুলো (যেমন pg_dump বা mysqldump) মিশন-ক্রিটিক্যাল RTO-এর জন্য খুব ধীর। ফিজিক্যাল, ব্লক-লেভেল ব্যাকআপ ব্যবহার করুন। ব্লক-লেভেল ইনক্রিমেন্টাল ব্যাকআপ শুধুমাত্র সেই ডিস্ক ব্লকগুলো কপি করে যা শেষ ব্যাকআপের পর পরিবর্তিত হয়েছে, যা T(transfer) এবং নেটওয়ার্ক ওভারহেড ব্যাপকভাবে কমিয়ে দেয়।

২. স্টোরেজ স্ন্যাপশট ব্যবহার করুন

১৫ মিনিটের কম RTO প্রয়োজন এমন মাল্টি-টেরাবাইট ডেটাবেসের জন্য, স্ট্যান্ডার্ড নেটওয়ার্কের মাধ্যমে প্রচলিত ফাইল কপি করা শারীরিকভাবে অসম্ভব। SAN বা ক্লাউড-নেটিভ স্টোরেজ স্ন্যাপশটের (যেমন AWS EBS Snapshots, Pure Storage) সাথে ইন্টিগ্রেশন প্রায় তাৎক্ষণিক T(restore) নিশ্চিত করে। এরপর ডেটাবেস ইঞ্জিনকে শুধুমাত্র স্ন্যাপশটের ওপর ক্র্যাশ রিকভারি করতে হয়।

৩. প্যারালালিজম বাস্তবায়ন করুন

নিশ্চিত করুন যে আপনার ব্যাকআপ এবং রিস্টোর টুলগুলো মাল্টি-থ্রেডিং ব্যবহার করে। pgbackrest বা SQL Server ডেটাবেস ব্যবহার করে PostgreSQL ডেটাবেস রিস্টোর করার সময়, আপনার উপলব্ধ নেটওয়ার্ক এবং ডিস্ক ব্যান্ডউইথ স্যাচুরেট করার জন্য স্পষ্টভাবে প্যারালাল ওয়ার্কার থ্রেড নির্ধারণ করুন।

# pgBackRest-এ প্যারালাল রিস্টোরের উদাহরণ
pgbackrest --stanza=prod_db --process-max=8 restore

উপসংহার

মিশন-ক্রিটিক্যাল ডেটাবেসের জন্য RTO এবং RPO গণনা করা সিস্টেম ইঞ্জিনিয়ারিংয়ের একটি কঠোর অনুশীলন। এটি DBA-দের ডিফল্ট ব্যাকআপ কনফিগারেশনের বাইরে গিয়ে তাদের স্টোরেজ I/O, নেটওয়ার্ক ক্ষমতা এবং ডেটাবেস রিকভারি মেকানিক্স গাণিতিকভাবে মডেল করতে বাধ্য করে।

লগ জেনারেশনের হারের বেসলাইন তৈরি করে, ডেটাবেস রিকভারির বিভিন্ন পর্যায় বুঝে এবং CloudSave-এর মতো শক্তিশালী প্ল্যাটফর্মের মাধ্যমে অটোমেটেড টেস্টিং বাস্তবায়ন করে, আইটি টিমগুলো আত্মবিশ্বাসের সাথে তাদের ডিজাস্টার রিকভারি SLA নিশ্চিত করতে পারে। মনে রাখবেন: ডেটাবেস অ্যাডমিনিস্ট্রেশনের ক্ষেত্রে, আশা কোনো কৌশল নয় এবং পরীক্ষিত নয় এমন ব্যাকআপ একটি দায়বদ্ধতা।

ডেভঅপস ইঞ্জিনিয়ার এবং DBA-রা কীভাবে উন্নত রিকভারি মেকানিক্স, CLI টুল এবং অটোমেটেড টেস্টিং ব্যবহার করে মিশন-ক্রিটিক্যাল ডেটাবেসের জন্য RTO এবং RPO সঠিকভাবে গণনা, পরীক্ষা এবং অপ্টিমাইজ করতে পারে তা জানুন।

বিভাগসমূহ