এই পর্বে যা শিখবেন
- কখন cloud-এ যাওয়া উচিত, আর কখন না যাওয়াই ভালো সিদ্ধান্ত
- Flow data থেকে dependency বের করা, আর discovery-র জানালা কত বড় হবে তা ঠিক করা
- প্রতিটি app-এর জন্য 6R বা 7R থেকে একটি পথ বেছে নেওয়া
- Dependency মেনে migration wave সাজানো
- ডেটা সরানোর সময় ও খরচ হিসাব করা, আর কখন ট্রাক ইন্টারনেটকে হারায় তা বলা
- প্রায় শূন্য downtime-এর database cutover, আর ব্যর্থ cutover থেকে নিরাপদে ফেরা
১ · বাসা বদল — কেন যাবেন, আর কেন যাবেন না
ঢাকায় যাঁরা ভাড়া বাসায় থাকেন, তাঁরা জানেন ১ তারিখের বাসা বদল কেমন কাজ। সব জিনিস এক ট্রাকে তোলা যায় না। ভাঙা চেয়ার ফেলে দিতে হয়। পুরোনো ফ্রিজ বিক্রি করে নতুন কিনতে হয়। আলমারি খুলে আবার জোড়া লাগাতে হয়। আর যে রাতে বদল করছেন, সেই রাতেও রান্না চাই। Cloud migration ঠিক এই কাজ: চলতি সিস্টেমকে on-premises থেকে cloud-এ সরানো, ব্যবসা না থামিয়ে।
আগের পর্বগুলোতে আপনি cloud-এ নতুন সিস্টেম বানাতে শিখেছেন। বাস্তবে অনেক প্রকৌশলীর প্রথম কাজ হয় উল্টো: দশ বছরের পুরোনো সিস্টেম, যার নকশার কাগজ নেই, যিনি বানিয়েছিলেন তিনি চাকরি ছেড়েছেন, আর দিনে লাখ টাকার লেনদেন চলছে। সেই সিস্টেম সরানো নতুন বানানোর চেয়ে আলাদা দক্ষতা।
যাওয়ার ভালো কারণ
- Hardware-এর আয়ু বা data centre-এর চুক্তি শেষ হচ্ছে
- ঈদের ভিড়ের মতো চাপ ওঠানামা করে, elasticity দরকার
- Backup আর DR নিজে সামলানো কঠিন
- Managed service-এ দলের সময় বাঁচে
- নতুন দেশে দ্রুত পৌঁছাতে হবে
না যাওয়ার ভালো কারণ
- চাপ স্থির, hardware নতুন, দল দক্ষ
- কারখানার যন্ত্রের সাথে মিলিসেকেন্ডের সম্পর্ক
- আইন বা চুক্তিতে ডেটা দেশের বাইরে নেওয়া মানা
- Licence cloud-এ চলে না বা অনেক দামি
- কারণ একটাই: “সবাই যাচ্ছে”
লক্ষ্যটি সংখ্যায় লিখুন। “আধুনিক হব” কোনো লক্ষ্য নয়। “জুনের মধ্যে data centre খালি”, “DR-এর RTO ৪ ঘণ্টা থেকে ৩০ মিনিট”, “ঈদের চূড়ায় ৩ গুণ চাপ সামলানো” লক্ষ্য। পর্ব ০৪-এর TCO হিসাবও এখানে আসে: পুরো ছবি ধরলে cloud অনেক সময় সস্তা হয় না, দ্রুত আর নমনীয় হয়। আর পুরো সরে যাওয়াও বাধ্যতামূলক নয়। পর্ব ০৩-এর hybrid cloud অনেক প্রতিষ্ঠানের স্থায়ী ঠিকানা।
ছয়টি ধাপের ছবি
Provider-দের কাঠামোয় নাম আলাদা, যেমন AWS বলে assess, mobilize আর migrate. গঠন প্রায় এক। মাঝের তিনটি ধাপ প্রতিটি wave-এ ঘুরে আসে।
Migration-এর ধাপ
Phases of a cloud migration, with the loop repeated for each wave
২ · আগে জানুন কী আছে — discovery আর dependency
বাসা বদলের আগে কেউ আলমারি খুলে দেখেন ভেতরে কী আছে। Migration-এ এই কাজের নাম discovery. Server-এর তালিকা শুধু শুরু। জানতে হয় প্রতিটি app-এর মালিক কে, ব্যবহার কত, CPU আর disk-এর চাপ কেমন, OS আর licence কী, আর সবচেয়ে বড় কথা, কে কার সাথে কথা বলে। এই শেষ তথ্যের ছবির নাম dependency map.
কাগজের diagram প্রায়ই পুরোনো। তাই আসল প্রমাণ নিন network থেকে: firewall log, VPC flow log ধরনের নথি, ss বা netstat-এর নিয়মিত নমুনা (পর্ব ১৩), আর provider-এর discovery agent. নিচের block-এ একটি কাল্পনিক দোকানের নমুনা flow data আছে। প্রতিটি সারিতে উৎস, গন্তব্য, port, দুই সপ্তাহের connection আর MB.
#!/bin/bash
# Who talks to whom? All data below is sample text, built here.
set -euo pipefail
export LC_ALL=C
cat > flows.txt <<'EOF'
web1 shop-app 8080 18000 900
web2 shop-app 8080 17500 880
shop-app shop-db 5432 410000 7400
shop-app search 9200 26000 300
reporting shop-db 5432 1200 5100
devtest shop-db 5432 40 12
wiki shop-db 5432 300 6
mail-relay shop-app 25 900 45
EOF
cat > servers.txt <<'EOF'
attendance
devtest
mail-relay
old-cms
reporting
search
shop-app
shop-db
stock-box
web1
web2
wiki
EOF
echo "== chatty links (connections in the window, most first)"
sort -k4,4nr flows.txt | awk '$4 >= 10000 {printf "%-10s -> %-9s port %-5s %7d conns %5d MB\n",$1,$2,$3,$4,$5}'
echo "== depended on by (number of different callers)"
awk '{print $2, $1}' flows.txt | sort -u | awk '{n[$1]++} END {for (s in n) print n[s], s}' | sort -k1,1nr -k2,2
echo "== silent servers (no flow seen, ask before you decide)"
awk '{print $1; print $2}' flows.txt | sort -u > seen.txt
comm -23 servers.txt seen.txtআউটপুট:
== chatty links (connections in the window, most first)
shop-app -> shop-db port 5432 410000 conns 7400 MB
shop-app -> search port 9200 26000 conns 300 MB
web1 -> shop-app port 8080 18000 conns 900 MB
web2 -> shop-app port 8080 17500 conns 880 MB
== depended on by (number of different callers)
4 shop-db
3 shop-app
1 search
== silent servers (no flow seen, ask before you decide)
attendance
old-cms
stock-box
তিনটি পড়া এখানে। shop-app -> shop-db-এর 410000 connection মানে এরা খুব ঘনিষ্ঠ, আলাদা wave-এ সরালে বিপদ (অংশ ৯)। 4 shop-db বলছে চারটি আলাদা সিস্টেম এই database-এ নির্ভর, তাই এটি আগে সরালে চারজনই ভুগবে। আর শেষের তিনটি নীরব server. comm -23 তালিকার সেই নাম দেখায়, যা flow-তে একবারও আসেনি।
নীরব মানে অব্যবহৃত নয়। attendance হয়তো একটি আঙুলের ছাপের যন্ত্রের সাথে আলাদা network-এ আছে। stock-box হয়তো মাসে একদিন চলে। দুই সপ্তাহের জানালায় সেটি ধরা পড়বে না, আর এই ভুলের ফল অংশ ৭-এ দেখবেন।
Discovery-র জানালা অন্তত একটি পূর্ণ ব্যবসায়িক চক্র ঢেকে রাখবে। মাসের শেষ, বেতনের দিন, বছর শেষের হিসাব, ঈদের চূড়া, এগুলো সাধারণ সপ্তাহে দেখা যায় না। আর flow data-র প্রতিটি নীরব server নিয়ে একজন মানুষের সাথে কথা বলুন।
৩ · 5R থেকে 7R — প্রতিটি app-এর জন্য একটি পথ
২০১০-এর দিকে Gartner migration-এর পাঁচটি পথের একটি কাঠামো প্রকাশ করে, যা “5R” নামে পরিচিত: rehost, refactor, revise, rebuild আর replace. ২০১৬ সালের দিকে AWS-এর Stephen Orban-এর একটি লেখায় এই ধারণা ছয়টি পথে সাজানো হয়, যা “6R” নামে ছড়ায়। পরে AWS-এর ভাষায় relocate যোগ হয়ে “7R” হয়। একই শব্দের অর্থ কাঠামো-ভেদে আলাদা হতে পারে। যেমন Gartner-এর refactor অনেকটা আজকের replatform-এর কাছাকাছি বলা যায়। Azure-এর কাঠামোতে আবার rearchitect আর rebuild আলাদা নাম। তাই নামের চেয়ে কাজটি বুঝুন, আর সংজ্ঞা নিয়ে তর্ক এড়িয়ে আগে দলের মধ্যে অর্থ মিলিয়ে নিন।
| পথ | কী বদলায় | বাসা বদলের ভাষায় | কখন ভালো |
|---|---|---|---|
| Rehost | শুধু ঠিকানা। VM যেমন আছে তেমন | আলমারি যেমন আছে তেমন ট্রাকে | সময় কম, বড় সংখ্যা, পরে উন্নতি |
| Replatform | একটি স্তর, যেমন নিজের DB থেকে managed DB. Code প্রায় একই | গ্যাসের চুলা বদলে নতুন বাসার লাইনে চুলা | কম ঝুঁকিতে বড় লাভ |
| Repurchase | নিজের software ছেড়ে SaaS | পুরোনো ফ্রিজ বিক্রি, নতুন কেনা | Mail, HR, CRM-এর মতো সাধারণ কাজ |
| Refactor | গঠন: container, serverless, ভাগ করা service | নতুন বাসার মাপে আসবাব বানানো | ব্যবসার মূল অংশ, দল প্রস্তুত |
| Retire | বন্ধ করা | ভাঙা চেয়ার ফেলে দেওয়া | কেউ ব্যবহার করে না |
| Retain | কিছুই না, এখনকার মতো | দাদির সিন্দুক পুরোনো বাসাতেই | আইন, যন্ত্র বা সময়ের বাধা |
| Relocate | Hypervisor স্তরে পুরো VM গুচ্ছ, যেমন VMware-ভিত্তিক cloud সেবায় | পুরো ঘর কন্টেইনারে তুলে নেওয়া | VMware-নির্ভর বড় পরিবেশ, সময় কম |
একটি app-এর পথ ঠিক করতে কয়েকটি প্রশ্ন ক্রমে করুন। কেউ ব্যবহার করে? আইন বা যন্ত্র কি আটকে রেখেছে? বাজারে কি একই জিনিস কেনা যায়? এটি কি ব্যবসার মূল অংশ, আর দল কি প্রস্তুত? নিচের simulator ঠিক এই ক্রমে চলে: প্রথম যে নিয়ম মেলে, সেটিই ফল। apps-এর flag বদলে আবার চালিয়ে দেখুন। effort-এর সংখ্যাগুলো আপেক্ষিক অনুমান, কোনো মাপা মান নয়।
// 6R recommender: the first rule that matches wins. Change the flags and run again.
const apps = {
old_cms: "unused",
attendance: "hardware", // tied to a fingerprint device in the office
mail: "commodity", // ordinary need, a SaaS already does it
wiki: "",
devtest: "",
search: "managed", // a managed service can replace the server
reporting: "managed",
shop_db: "managed core",
shop_app: "core", // core app, team not ready to redesign yet
stock_batch: "core",
demo_ready: "core scale team", // same app, if growth and skills were there
demo_vmware: "vmware deadline", // hypervisor estate, data-centre lease ending
};
const rules = [ // [all flags needed, or any one if split by "|"], strategy, reason
["unused", "retire", "nobody uses it, stop paying for it"],
["hardware|legal", "retain", "it cannot leave now, review later"],
["commodity", "repurchase", "buy the same function as SaaS"],
["vmware deadline", "relocate", "move the hypervisor as it is, fast"],
["core scale team", "refactor", "the value justifies a redesign"],
["managed", "replatform", "swap one layer, keep the code"],
["", "rehost", "move as it is, improve later"],
];
const effort = { retire: 0, retain: 0, repurchase: 2, relocate: 1, rehost: 1, replatform: 3, refactor: 13 };
const hit = (need, flags) => need.includes("|")
? need.split("|").some(n => flags.includes(n))
: need.split(" ").filter(Boolean).every(n => flags.includes(n));
let total = 0;
for (const [name, f] of Object.entries(apps)) {
const [, s, why] = rules.find(([need]) => hit(need, f.split(" ")));
total += effort[s];
console.log(name.padEnd(12), s.padEnd(11), String(effort[s]).padStart(2), why);
}
console.log("total effort, in rough relative points:", total);আউটপুট:
old_cms retire 0 nobody uses it, stop paying for it
attendance retain 0 it cannot leave now, review later
mail repurchase 2 buy the same function as SaaS
wiki rehost 1 move as it is, improve later
devtest rehost 1 move as it is, improve later
search replatform 3 swap one layer, keep the code
reporting replatform 3 swap one layer, keep the code
shop_db replatform 3 swap one layer, keep the code
shop_app rehost 1 move as it is, improve later
stock_batch rehost 1 move as it is, improve later
demo_ready refactor 13 the value justifies a redesign
demo_vmware relocate 1 move the hypervisor as it is, fast
total effort, in rough relative points: 29
shop_app আর demo_ready একই ধরনের মূল app, কিন্তু ফল আলাদা: rehost বনাম refactor. পার্থক্য দুটি flag, scale আর team. মূল্য আছে, কিন্তু দল প্রস্তুত নয়, তাই এখন rehost, পরে উন্নতি। আর দেখুন, মোট 29-এর মধ্যে ঐ একটি refactor-এরই 13, যা বাকি ১১টি app-এর মোট ১৬-এর কাছাকাছি। সব app-এ refactor চাইলে migration শেষই হয় না। বাস্তবে একটি app-এ দুই ধাপও হয়: আজ rehost, এক বছর পরে replatform.
Lift and shift কথাটি rehost-এরই আরেক নাম। Retire প্রায় সবসময় সবচেয়ে সস্তা পথ, তাই তালিকায় এটি আগে খুঁজুন। যে জিনিস ফেলে দেবেন, তা ট্রাকে তোলার ভাড়া কেন দেবেন?
| কাজ | AWS | Azure | Google Cloud |
|---|---|---|---|
| Discovery | Application Discovery Service | Azure Migrate | Migration Center |
| Server সরানো | Application Migration Service | Azure Migrate | Migrate to Virtual Machines |
| Database | Database Migration Service | Azure Database Migration Service | Database Migration Service |
| ফাইল অনলাইনে | DataSync | AzCopy, Storage Mover | Storage Transfer Service |
| ভৌত যন্ত্র | Snow-পরিবার | Data Box | Transfer Appliance |
লেখার সময়ের নাম এগুলো। পণ্যের নাম, দেশভেদে প্রাপ্যতা আর নতুন গ্রাহকের সুযোগ বদলায়, তাই ব্যবহারের আগে provider-এর docs দেখুন। পছন্দটি শেষে vendor lock-in-এও প্রভাব ফেলে: পর্ব ৭৪-এ দেখেছেন, managed service যত গভীর, সরে যাওয়া তত কঠিন।
৪ · Migration wave — এক ট্রাকে সব নয়
ঈদের আগে সদরঘাটে যেমন যাত্রীরা ক্রম মেনে লঞ্চে ওঠেন, তেমনি app-গুলো দল বেঁধে সরে। প্রতিটি দলের নাম migration wave. প্রথম wave ছোট আর কম ঝুঁকির, যাতে দল পথটি শিখে নেয়। মূল সিস্টেম আসে পরে। দুটি নিয়ম এখানে কাজ করে।
- ঘনিষ্ঠরা একসাথে: যারা খুব বেশি কথা বলে, তারা একটি move group. আলাদা করলে network-এর দেরি ঢুকে পড়ে।
- ক্রম মানা: ভিত্তি আগে। Landing zone, network, IAM, DNS আর পর্যবেক্ষণের ব্যবস্থা প্রথম app-এর আগেই তৈরি থাকে (পর্ব ৩৫)।
আরেকটি বাস্তব সীমা আছে: এক রাতে দল কতগুলো server সামলাতে পারে। নিচের planner এই তিনটি নিয়ম মানে। chatty জোড়াগুলো জুড়ে move group বানায়, তারপর প্রতি wave-এ প্রস্তুত দলগুলো সীমার মধ্যে তোলে।
// Wave planner. Rule 1: a chatty pair moves together. Rule 2: "after" goes in an earlier wave.
const apps = { // servers, and what must already be in the cloud
wiki: { srv: 1, after: [] }, devtest: { srv: 1, after: [] }, mail: { srv: 1, after: [] },
search: { srv: 1, after: ["devtest"] }, reporting: { srv: 1, after: ["devtest"] },
shop_app: { srv: 3, after: ["search", "reporting"] },
shop_db: { srv: 2, after: [] }, stock: { srv: 1, after: [] },
};
const chatty = [["shop_app", "shop_db"], ["stock", "shop_db"]];
// Merge chatty pairs into move groups (a small union-find).
const boss = {};
for (const a in apps) boss[a] = a;
const find = a => boss[a] === a ? a : (boss[a] = find(boss[a]));
for (const [a, b] of chatty) boss[find(a)] = find(b);
const groups = {};
for (const a in apps) (groups[find(a)] ??= []).push(a);
function plan(maxServers) {
const moved = new Set();
let left = Object.values(groups), wave = 0;
console.log(`--- at most ${maxServers} servers per wave`);
while (left.length) {
let used = 0; const now = []; wave++;
for (const g of left) {
const size = g.reduce((s, a) => s + apps[a].srv, 0);
const ready = g.every(a => apps[a].after.every(d => moved.has(d) || g.includes(d)));
if (ready && used + size <= maxServers) { now.push(g); used += size; }
}
if (!now.length) return console.log(`BLOCKED: ${left.map(g => g.join("+")).join(", ")}`);
now.flat().forEach(a => moved.add(a));
left = left.filter(g => !now.includes(g));
console.log(`wave ${wave}: ${now.map(g => g.join("+")).join(", ")} (${used} servers)`);
}
}
plan(6); plan(4);আউটপুট:
--- at most 6 servers per wave
wave 1: wiki, devtest, mail (3 servers)
wave 2: search, reporting (2 servers)
wave 3: shop_app+shop_db+stock (6 servers)
--- at most 4 servers per wave
wave 1: wiki, devtest, mail (3 servers)
wave 2: search, reporting (2 servers)
BLOCKED: shop_app+shop_db+stock
shop_app+shop_db+stock একটি অবিভাজ্য দল, মোট ৬টি server. সীমা ৬ হলে wave 3-এ জায়গা হয়। সীমা ৪ হলে BLOCKED, কারণ দলটি কোনো wave-এই ধরে না। তখন তিনটি পথ: দল বড় করে এক রাতে বেশি লোক রাখা, chatty সম্পর্ক কমানো (অংশ ৯), অথবা দলটি ভাগ করার ঝুঁকি মেনে নেওয়া। এই simulator-এ cycle-ও একই BLOCKED দেখাবে।
ক্যালেন্ডারও দেখুন। ঈদের আগের সপ্তাহ, বেতনের দিন, বছর শেষের হিসাবের সময় মূল সিস্টেম সরানো হয় না। একে অনেক প্রতিষ্ঠানে change freeze বলে।
৫ · ডেটা সরানো — online, offline আর সময়ের হিসাব
Server নতুন করে বানানো যায়, ডেটা যায় না। ডেটা সরানোর দুটি পথ।
Online replication
Network দিয়ে, site-to-site VPN বা dedicated link ধরে। আগে পুরো কপি, তারপর চলতি পরিবর্তন। সোর্স চলতেই থাকে।
পাইপে পানিOffline transfer
Provider-এর transfer appliance এনে ডেটা ভরে ফেরত পাঠানো। মাঝের পরিবর্তন পরে network-এ যায়।
ট্রাকে পানির ট্যাংকসময়ের হিসাব
পরীক্ষার সবচেয়ে সাধারণ ভুল: Byte আর bit গুলিয়ে ফেলা। ডেটা মাপা হয় byte-এ, লিংক bit-এ। ১ byte = ৮ bit. আর লিংকের পুরো ক্ষমতা কখনো ডেটা পায় না: protocol, অন্য traffic আর দূরত্ব কিছু খায়। একে এখানে কার্যকারিতা e বলি।
উদাহরণ ১. ১০ TB, ১০০ Mbps, e = ০.৮.
10 × 10^12 B × 8 = 8 × 10^13 bit
usable = 100 × 10^6 × 0.8 = 8 × 10^7 bit/s
time = 8 × 10^13 ÷ (8 × 10^7) = 10^6 s = 11.57 days
উদাহরণ ২, ডেটা বদলাচ্ছে। কপি চলতেই সোর্সে দিনে ২% বদলাচ্ছে, মানে ২০০ GB. এই পরিবর্তনের গতি r = 200 × 10^9 × 8 ÷ 86400 = 18.52 Mbps. লিংকের b = 80 Mbps. কপি করতে করতে নতুন পরিবর্তন জমে, তাদের পাঠাতে আরও সময়, তাতে আরও জমে। এই ধারার যোগফল সহজ:
এখানে 11.57 ÷ (1 − 18.52/80) = 11.57 ÷ 0.7685 = 15.06 দিন। সাড়ে তিন দিন বেশি। আর r ≥ b হলে হরটি শূন্য বা ঋণাত্মক: কপি কখনো ধরতেই পারবে না। ১০ TB-র ক্ষেত্রে দিনে ৮৬৪ GB বদলালে ৮০ Mbps-এর লিংক এই সীমায় পৌঁছায়।
এবার অন্য পথটি ধরুন। ধরে নিই একটি appliance-এ ৮০ TB ধরে, আনা-নেওয়া মিলিয়ে ১৪ দিন, প্রতি যন্ত্রে $৫০০, আর এক সাথে ৪টি চালানো যায়। এগুলো শেখার জন্য ধরে নেওয়া গোল সংখ্যা। আসল দাম, ধারণক্ষমতা আর বাংলাদেশে পৌঁছানোর সুযোগ provider-এর পাতায় মিলিয়ে নিন।
// Network or truck? ASSUMED numbers, not real prices. Change them and run again.
const EFF = 0.8; // share of the link that really carries data
const CHANGE = 0.02; // share of the data that changes per day during the copy
const BOX_TB = 80; // usable TB in one transfer appliance
const BOX_DAYS = 14; // shipping both ways, copying, import
const BOX_COST = 500; // $ per appliance, including courier
const LINK_DAY = 40; // $ per day for the extra link during the copy
const days = (tb, mbps) => tb * 1e12 * 8 / (mbps * 1e6 * EFF) / 86400;
function sync(tb, mbps) { // bulk copy, then catch up with changes
const rate = tb * CHANGE * 1e12 * 8 / 86400; // change rate in bits per second
const usable = mbps * 1e6 * EFF;
return rate >= usable ? Infinity : days(tb, mbps) / (1 - rate / usable);
}
console.log(" TB Mbps bulk_d sync_d link$ | box_d boxes box$ winner");
for (const tb of [1, 10, 100, 500]) for (const mbps of [100, 1000, 10000]) {
const total = sync(tb, mbps), never = total === Infinity;
const boxes = Math.ceil(tb / BOX_TB), boxDays = BOX_DAYS * Math.ceil(boxes / 4);
const win = never ? "box*" : total <= boxDays ? "network" : "box";
console.log(String(tb).padStart(4), String(mbps).padStart(6), days(tb, mbps).toFixed(2).padStart(7),
(never ? "never" : total.toFixed(2)).padStart(7),
(never ? "-" : (total * LINK_DAY).toFixed(0)).padStart(6), "|", String(boxDays).padStart(4),
String(boxes).padStart(5), String(boxes * BOX_COST).padStart(5), "", win);
}
console.log("* the link is slower than the changes: a box moves the bulk, but plan a freeze");
for (const mbps of [100, 1000, 10000]) { // break-even for the bulk copy alone
const tb = mbps * 1e6 * EFF * BOX_DAYS * 86400 / 8 / 1e12;
console.log(`at ${mbps} Mbps the bulk copy takes ${BOX_DAYS} days at ${tb.toFixed(1)} TB`);
}আউটপুট:
TB Mbps bulk_d sync_d link$ | box_d boxes box$ winner
1 100 1.16 1.18 47 | 14 1 500 network
1 1000 0.12 0.12 5 | 14 1 500 network
1 10000 0.01 0.01 0 | 14 1 500 network
10 100 11.57 15.06 602 | 14 1 500 box
10 1000 1.16 1.18 47 | 14 1 500 network
10 10000 0.12 0.12 5 | 14 1 500 network
100 100 115.74 never - | 14 2 1000 box*
100 1000 11.57 15.06 602 | 14 2 1000 box
100 10000 1.16 1.18 47 | 14 2 1000 network
500 100 578.70 never - | 28 7 3500 box*
500 1000 57.87 never - | 28 7 3500 box*
500 10000 5.79 6.54 262 | 28 7 3500 network
* the link is slower than the changes: a box moves the bulk, but plan a freeze
at 100 Mbps the bulk copy takes 14 days at 12.1 TB
at 1000 Mbps the bulk copy takes 14 days at 121.0 TB
at 10000 Mbps the bulk copy takes 14 days at 1209.6 TB
10 TB, 100 Mbps-এর সারিতে আমাদের হাতের হিসাব দুটিই আছে: 11.57 আর 15.06. শুধু বড় কপি ধরলে network জিতত, পরিবর্তন ধরলে box. তবে box-এর ১৪ দিনে যে পরিবর্তন জমে, তা-ও পরে link দিয়ে পাঠাতে হয়; সেটি ধরলে এই সারিতে network এগিয়ে থাকতে পারে, তাই সারণির “box” একটি মোটা ইঙ্গিত, শেষ কথা নয়। 100 TB, 1000 Mbps-এর সংখ্যাও একই, কারণ আকার আর গতি দুটোই ১০ গুণ।
শেষের তিন লাইন মনে রাখার মতো: ১৪ দিনের যন্ত্রের সমান হতে ১০০ Mbps-এ মাত্র 12.1 TB, ১ Gbps-এ 121 TB, ১০ Gbps-এ প্রায় ১.২ PB লাগে। box* সারিগুলো সতর্কতা। যন্ত্র বড় ভাগটি নিয়ে যায়, কিন্তু মাঝের পরিবর্তন তো সেই ধীর লিংকেই যাবে। তখন লিংক বাড়ানো, পরিবর্তন কমানো, অথবা একটি বড় freeze ছাড়া পথ নেই।
খরচেরও দুটি দিক। Cloud-এ ঢোকা ডেটায় provider সাধারণত টাকা নেন না, কিন্তু বেরোনো ডেটায় egress নেন (পর্ব ৭২)। অন্য cloud থেকে সরলে তাই বিল আসে সোর্সের দিকে। এছাড়া লিংকের ভাড়া আর সমান্তরালে নতুন storage-এর বিল কপি শুরুর দিন থেকেই চলে। যন্ত্রে পাঠানো ডেটা encrypted থাকে কি না, আর চাবি কার হাতে, সেটিও দেখে নিন।
৬ · Cutover — চলন্ত গাড়ির চাকা বদল
Cutover হলো সেই মুহূর্ত, যখন আসল traffic পুরোনো জায়গা ছেড়ে নতুন জায়গায় যায়। Stateless app-এ এটি সহজ, কারণ দুই পাশে একই জিনিস চলে। Database-এ কঠিন, কারণ একই মুহূর্তে দুই জায়গায় সত্য থাকা চলে না। হাতে চারটি কৌশল।
| কৌশল | লেখা বন্ধ থাকে | ঝুঁকি | কখন |
|---|---|---|---|
| Backup আর restore | পুরো কপির সময়, ঘণ্টা বা দিন | কম, সহজ | ছোট ডেটা, রাতের বিরতি চলে |
| CDC + read-only window | কয়েক মিনিট | মাঝারি, চর্চা লাগে | বেশিরভাগ production DB |
| Dual write | প্রায় শূন্য | বেশি, দুই পাশ আলাদা হতে পারে | মিলিয়ে দেখার ব্যবস্থা থাকলে |
| Strangler fig | প্রতি অংশে প্রায় শূন্য | দীর্ঘ সময়, দুই সিস্টেম একসাথে | বড় পুরোনো app ভেঙে সরানো |
DNS-এর কথা মনে করুন (পর্ব ২৯)। Propagation কোনো push নয়। পুরোনো উত্তর cache-এ TTL শেষ না হওয়া পর্যন্ত থাকে। তাই TTL কমাতে হয় cutover-এর অন্তত এক পুরোনো TTL আগে। আর TTL কমালেও সবাই সাথে সাথে ঘোরে না: কিছু client নিজের মতো cache করে, আর connection pool পুরোনো connection ধরে রাখে। সেজন্য পুরোনো DB-তে লেখা বন্ধই থাকে। ভুল ঠিকানায় যাওয়া client তখন ব্যর্থ হয়, চুপচাপ ভুল জায়গায় লেখে না।
এবার একটি পুরো cutover দেখুন। সোর্স অফিসের PostgreSQL, লক্ষ্য cloud-এর managed PostgreSQL (পর্ব ২২), মাঝে logical replication, যা CDC-র একটি রূপ। “পরে” চাপুন, আর সারির সংখ্যা খেয়াল করুন। ঘড়ির সংখ্যা আর সব মান কাল্পনিক।
| সময় | |
| Source-এর সারি | |
| Target-এর সারি | |
| বাকি সারি | |
| লেখা যায় | |
| DNS: TTL, উত্তর | |
| লেখা-বিরতি |
- TTL আগে, কপিও শুরু। TTL ৩৬০০ থেকে ৬০ সেকেন্ডে নামল, তিন দিন আগেই, যাতে পুরোনো ১ ঘণ্টার cache মিলিয়ে যায়। একই সাথে initial load শুরু: ৮,২৪০,০০০ সারির snapshot. সোর্স বন্ধ হয়নি।
- Snapshot শেষ। Target-এ ৮,২৪০,০০০ সারি। কিন্তু এই সময়ে সোর্সে ২০,০০০ নতুন সারি জমেছে। Snapshot যে LSN-এ নেওয়া, CDC ঠিক সেখান থেকে পরিবর্তন চালাতে শুরু করে। তাই কিছু বাদও যায় না, দুবারও আসে না।
- CDC ধরে ফেলেছে। বাকি মাত্র ৫০ সারি, মানে replication lag এক সেকেন্ডের কম। সিস্টেম এই অবস্থায় যত দিন খুশি থাকতে পারে। এর মধ্যে মহড়া আর read-only পরীক্ষা হয়।
- Go বা no-go. রাত ০১:৫৫. চেকলিস্ট মিলছে, runbook হাতে, ফেরার পথ প্রস্তুত। সবাই “go” বললে তবেই পরের ধাপ।
- সোর্স read-only. ০২:০০:০০-তে লেখা বন্ধ, চূড়ান্ত সংখ্যা ৮,৩১২,৪০০. গ্রাহক পণ্য দেখতে পাচ্ছেন, কিন্তু অর্ডার দিলে “একটু পরে চেষ্টা করুন” পাচ্ছেন। Target-এ এখনো ৫ সারি বাকি।
- লাইন মিলল। ৪০ সেকেন্ডে বাকি শূন্য। দুই পাশের সারির সংখ্যা ৮,৩১২,৪০০ আর checksum মিলেছে। মিল না হলে এখানেই থেমে read-only তুলে ফিরে যাওয়া যায়, কোনো ক্ষতি ছাড়াই।
- Sequence আর উল্টো পথ। ৯০ সেকেন্ডে সামনের দিকের replication বন্ধ, target-এর sequence এগিয়ে নেওয়া হলো, কারণ logical replication এটি আনে না। এরপর reverse replication চালু হলো: এখন target থেকে source-এ।
- দিক বদল। ১২০ সেকেন্ডে
db.shop.exampletarget দেখায়। TTL ৬০ বলে প্রায় এক মিনিটে পুরোনো উত্তর মিলিয়ে যায়। App-এর connection pool নতুন করে খোলা হলো। পুরোনো ঠিকানায় যাওয়া লেখা ব্যর্থ হয়, হারায় না। - কাজ শেষ। ১৮০ সেকেন্ডে target-এ লেখা চলছে: ৮,৩১২,৪৬০. মোট লেখা-বিরতি ৩ মিনিট, আর পড়া একবারও থামেনি। উল্টো পথে সোর্সও ৮,৩১২,৪৬০, তাই ফেরার পথ খোলা।
মূল কাজগুলো PostgreSQL-এ দেখতে এমন। নিচের লেখা একটি উদাহরণ, যা এই পাতায় চলে না। Publisher-এ wal_level = logical লাগে, schema আগে থেকে target-এ থাকতে হয়, আর managed DB-তে অনুমতির ধরন provider-ভেদে আলাদা।
-- Source: publish the tables
CREATE PUBLICATION shop_pub FOR ALL TABLES;
-- Target: copies existing rows, then streams changes
CREATE SUBSCRIPTION shop_sub
CONNECTION 'host=old-db.example dbname=shop user=repl_user'
PUBLICATION shop_pub;
-- Source: how far behind is the target, in bytes?
SELECT application_name,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes
FROM pg_stat_replication;
-- Target, at cutover: sequences are not replicated, so move them on
SELECT setval('orders_id_seq', (SELECT max(id) FROM orders) + 1000);Dual write শুনতে সহজ: app দুই জায়গাতেই লেখে। কিন্তু দ্বিতীয় লেখা ব্যর্থ হলে? দুই লেখার ক্রম উল্টে গেলে? দুই পাশ চুপচাপ আলাদা হয়ে যায়। তাই ব্যবহার করলে একটিকে সত্যের উৎস ধরুন, আর নিয়মিত মিলিয়ে দেখুন। সাধারণত CDC বেশি নিরাপদ, কারণ সত্য থাকে একটি জায়গায়, database-এর নিজের log-এ।
Strangler fig বড় পুরোনো app-এর পথ। বট-পরিবারের একধরনের গাছ অন্য গাছকে ঘিরে ধীরে বড় হয়, আর শেষে আসল গাছটি আর থাকে না। ঠিক তেমনি সামনে একটি proxy বসে, একটি একটি path নতুন service-এ যায়, আর শেষে পুরোনো monolith বন্ধ হয়। Martin Fowler ২০০৪ সালে এই নামটি দেন। বিস্তারিত আছে System Design-এর microservices পর্বে। Traffic-এর ভাগ বাড়ানোর কৌশল পর্ব ৫৯-এর canary-র মতোই।
৭ · Rollback আর testing — ফেরার পথ আগে আঁকুন
পাহাড়ে ওঠার আগে নামার পথ দেখে নিতে হয়। Migration-এ দুটি জিনিস আগে লেখা থাকে: কোন সংখ্যা দেখলে ফিরব, আর কীভাবে ফিরব। মাঝরাতে ক্লান্ত দল “আরেকটু চেষ্টা করি” বলতে চাইবে। আগে লেখা শর্ত সেই তর্ক থামায়। আর জেনে রাখুন point of no return: যে মুহূর্তের পরে নতুন লেখা পুরোনো জায়গায় নেই। Reverse replication না থাকলে সেটি cutover-এর ঠিক পরের প্রথম লেখা।
যা পরীক্ষা করতে হয়
- ডেটা: সারির সংখ্যা, টেবিল-ভিত্তিক checksum, আর ব্যবসার যোগফল, যেমন মোট বিক্রি।
- চাপ: আগের latency-কে ভিত্তি ধরে চূড়ার চাপে পরীক্ষা (পর্ব ৬৮)। Shadow traffic থাকলে আরও ভালো।
- কাজ: Smoke test, লগইন, অর্ডার, পেমেন্ট, রিপোর্ট।
- মহড়া: পুরো cutover অন্তত একবার ঘড়ি ধরে। একে dress rehearsal বলে। Rollback-ও মহড়ায় চালান।
- পুনরুদ্ধার: নতুন জায়গার backup থেকে restore করে দেখা (পর্ব ২৪)।
এবার একটি ব্যর্থ দিন দেখুন। ওপরের cutover রাত ০২:০৩-এ শেষ হয়েছিল। দিনটি মাসের ১ তারিখ। সকাল ৯টায় অফিসে রয়ে যাওয়া stock-box জেগে ওঠে। ফেরার শর্ত আগেই লেখা: error ≥ ২% টানা ৫ মিনিট।
| সময় | |
| Error | |
| p95 | |
| Target-এর সারি | |
| Source-এর সারি | |
| লেখা যায় |
- লুকানো batch জাগল।
stock-boxমাসে একবার একের পর এক transaction চালায়, প্রতিটিতে ৩০০টি সারি বদলায়। আগে প্রতি বদলে ১.৫ ms লাগত, এক transaction-এ মোট ০.৪৫ s. এখন প্রতি বদলে ৪১ ms, কারণ DB cloud-এ। প্রতিটি transaction-এ lock ধরা থাকে ১২.৩ s. - শর্তের ঘড়ি চালু। Checkout সেই সারির lock-এর জন্য অপেক্ষা করছে। Error ২.৬%, p95 ১,৯০০ ms. শর্তের প্রথম অংশ পূরণ, ৫ মিনিটের গোনা শুরু।
- আগে লেখা শর্তই সিদ্ধান্ত। ০৯:১০-এ error ৩.১%, টানা ৫ মিনিট ২%-এর ওপরে। Incident commander rollback ঘোষণা করলেন। কেউ production-এ বসে কারণ খুঁজতে শুরু করেননি। Source তখন ৫ সারি পিছিয়ে।
- Target থামল। এবার target read-only. চূড়ান্ত সংখ্যা ৮,৩৩১,০০০. Source-এ ৮,৩৩০,৯৯৫, ৫ সারি বাকি, reverse replication চলছে।
- আবার লাইন মিলল। ৪০ সেকেন্ডে দুই পাশই ৮,৩৩১,০০০. Cutover-এর পরের ১৮,৬০০টি অর্ডারের একটিও হারায়নি। Reverse replication না থাকলে এই অর্ডারগুলো হাতে মেলাতে হতো।
- দিক ফেরানো। Source-এ লেখা খুলল, sequence এগিয়ে নেওয়া হলো, DNS আবার source দেখায়। TTL ৬০ এখনো কম, এটিই তার আরেক লাভ। Connection pool নতুন করে খোলা হলো।
- সেবা স্বাভাবিক। ০৯:১৪-তে source-এ লেখা চলছে, ৮,৩৩১,০৪০. Error ০.১%, p95 ২০০ ms. দ্বিতীয়বারের লেখা-বিরতি ৩ মিনিট। মোট ক্ষতি প্রায় ৬ মিনিটের ধীর সেবা আর এই ৩ মিনিট, ডেটার ক্ষতি শূন্য।
- শিক্ষা নিয়ে আবার। Postmortem-এর সিদ্ধান্ত:
stockDB-র সাথে একই move group-এ, discovery-র জানালা পুরো মাস। Target-এ নতুন করে sync হলো। এক সপ্তাহ পরে দ্বিতীয় চেষ্টা সফল, আর দিনটি মাসের ১ তারিখ নয়।
Rollback-এর একটি শেষ সীমা ঠিক করে নিন। কয়েক সপ্তাহ পরে নতুন schema বা নতুন feature এসে গেলে উল্টো পথ আর কাজ করবে না। তখন “সামনে এগিয়ে ঠিক করা” ছাড়া পথ থাকে না। পুরোনো সিস্টেম কবে বন্ধ হবে, সেই তারিখ আর শর্তও runbook-এ রাখুন। বন্ধ করার আগে শেষ backup নিন, আর disk নিরাপদে মুছুন।
৮ · পৌঁছে যা করবেন — নিরাপত্তা, compliance আর দল
নতুন বাসায় উঠে প্রথমে তালা বদলাতে হয়। Migration-এর সময় তাড়াহুড়োয় অনেক “সাময়িক” দরজা খোলা হয়, আর সেগুলো পরে আর বন্ধ হয় না। Shared responsibility-র সীমাও এখন আলাদা: পুরোনো firewall আর ঘরের তালা নেই, দায়িত্বের ভাগ নতুন।
Compliance যাওয়ার আগেই দেখুন, পৌঁছে নয়। ডেটা কোন দেশে থাকবে, সেটি data residency-র প্রশ্ন (পর্ব ০৫)। ব্যাংক, আর্থিক সেবা, স্বাস্থ্য বা সরকারি ডেটা নিয়ে বাংলাদেশে আলাদা নিয়ম থাকতে পারে, আর নিয়ম বদলায়ও। তাই আজকের অবস্থা নিয়ন্ত্রক সংস্থা, চুক্তি আর আইনজীবীর সাথে মিলিয়ে নিন। Provider-এর certificate থাকলেই আপনার সিস্টেম compliant হয় না।
দল অনেক সময় প্রযুক্তির চেয়ে কঠিন। যিনি দশ বছর server সামলেছেন, তিনিই সিস্টেমের সবচেয়ে বড় জ্ঞানের ভাণ্ডার। তাঁকে বাদ দিয়ে নয়, সাথে নিয়ে এগোন: প্রশিক্ষণ, ছোট দল আগে, যৌথ on-call, আর নতুন runbook. Monitoring আর alert-ও পুরোনো জায়গা থেকে নতুন জায়গায় আনুন। নইলে প্রথম রাতে কেউ জানবেন না কী ঘটছে। দুই সিস্টেম একসাথে চালাতে হবে বলে কিছুদিন দলের কাজও দ্বিগুণ হবে, এটি পরিকল্পনায় রাখুন।
৯ · “কাল্পনিক বাজার”-এর তিন wave আর সাধারণ ব্যর্থতা
পুরো গল্পটি জুড়ি। “কাল্পনিক বাজার” একটি বানানো মাঝারি অনলাইন দোকান, কোনো আসল প্রতিষ্ঠান নয়। ঢাকার একটি ভাড়া করা ঘরে ১৪টি server. চুক্তি শেষ হবে এক বছর পরে, আর গত ঈদে সাইট দুবার বসে গেছে। সব টাকার অঙ্ক শেখার জন্য ধরে নেওয়া গোল সংখ্যা।
| অবস্থা | |
| অফিসের server | |
| Cloud-এর server | |
| অফিসের বিল | |
| Cloud-এর বিল | |
| মোট |
- শুরু। ১৪টি server, মাসে $৩,০০০ (ভাড়া, বিদ্যুৎ, AC, রক্ষণাবেক্ষণ)। লক্ষ্য লেখা হলো: ঈদের চূড়ায় ৩ গুণ চাপ, আর চুক্তি শেষের আগে ঘর খালি।
- প্রস্তুতি। Landing zone, VPN, IAM, log, আর discovery. কোনো app সরেনি, কিন্তু $৩০০ বিল শুরু।
- Wave 1, কম ঝুঁকি। পুরোনো CMS-এর ২টি retire, mail repurchase, wiki আর devtest rehost. অফিসে ৯টি থাকল। অফিসের বিল কমেনি, কারণ ভাড়া ঘর ধরে, server ধরে নয়।
- Wave 2, পড়ার কাজ। Search আর reporting replatform. ৩ TB ছবি object storage আর CDN-এ গেল: ২০০ Mbps-এর ৮০%-এ ১.৭৪ দিন। মূল DB এখনো অফিসে, তাই এই দুটি VPN-এর ওপর দিয়ে পড়ে, যা রিপোর্টের মতো ধীরে চলা কাজে সহনীয়।
- Wave 3, মূল অংশ। App-এর ৩টি, DB-র ২টি আর
stockএকসাথে। প্রথম চেষ্টা ফেরত এলো, এক সপ্তাহ পরে সফল (অংশ ৭)। থাকল শুধুattendance, retain. দুই পাশের বিল মিলে $৫,৫০০, এটিই double running-এর চূড়া। - Optimize. ঘরের চুক্তি শেষ, ছোট একটি জায়গায় attendance. Rightsizing-এ ১০টি থেকে ৮টি, commitment ছাড়। মোট $২,৪০০. শুধু খরচ নয়, লাভটি আরও বড়: ঈদের ভিড়ে এবার autoscaling আছে।
সাধারণ ব্যর্থতা ১ — সমস্যাসহ তুলে আনা
Rehost করলে অগোছালো script, হাতে বদলানো config, ভুল permission, ধীর query, সব সাথে আসে। Cloud কোনো সমস্যা নিজে সারায় না। তাই প্রতিটি rehost-এর সাথে একটি লেখা তালিকা রাখুন: পরে কী ঠিক হবে, কে ঠিক করবেন, কবে।
সাধারণ ব্যর্থতা ২ — আলাদা স্তরের মাঝের দেরি
একই ঘরে app আর DB-র দূরত্ব প্রায় শূন্য। আলাদা করলে প্রতিটি query-তে network-এর পুরো round trip যোগ হয়। যে app-এ এক পাতার জন্য অনেক ছোট query যায়, তাকে chatty app বলে। ধরে নিন একটি পাতায় ১২০টি query পরপর, প্রতিটিতে DB-র কাজ ১ ms, app-এর নিজের কাজ ১০০ ms. RTT-গুলো ধরে নেওয়া: ব্যবহারকারী থেকে অফিস ১০ ms, ব্যবহারকারী থেকে cloud ৫০ ms, অফিস থেকে cloud ৪০ ms, একই region-এর ভেতরে ১ ms. নিজের পথে ping বা mtr দিয়ে মেপে নিন।
- ব্যবহারকারীঢাকা
- App
- DB
| User RTT | |
| App–DB RTT | |
| Query (N) | |
| DB অংশ | |
| পাতার সময় |
- সব অফিসে। 10 + 100 + 120 × 1.5 = ২৯০ ms. কেউ অভিযোগ করেন না।
- আগে App সরালাম। 50 + 100 + 120 × 41 = ৫,০৭০ ms. প্রায় ১৭ গুণ। Code একটুও বদলায়নি। বদলেছে শুধু দূরত্ব।
- উল্টো, আগে DB সরালাম। 10 + 100 + 120 × 41 = ৫,০৩০ ms. সমস্যা একই, সাথে নতুন বিল: ফল এখন cloud থেকে বেরোয়। প্রতি পাতায় ১২০ × ৪ KB = ৪৮০ KB, মাসে ২০ লাখ পাতায় ৯৬০ GB, পর্ব ৭২-এর ধরে নেওয়া $০.১০/GB-তে $৯৬ egress.
- আলাদা রেখেই query কমালাম। Batch আর join দিয়ে ১৫টি query. 50 + 100 + 15 × 41 = ৭৬৫ ms. অনেক ভালো, কিন্তু code বদলাতে হলো। আলাদা থাকার সময় লম্বা হলে এই কাজ লাগে।
- দুটোই একসাথে সরালাম। 50 + 100 + 120 × 2 = ৩৯০ ms. Code বদলায়নি। এটিই move group-এর যুক্তি। ২৯০-এর চেয়ে ১০০ ms বেশি, যার ৪০ ms ব্যবহারকারীর দূরত্ব বাড়ার ফল।
- একসাথে, আর পরে উন্নতি। 50 + 100 + 15 × 2 = ১৮০ ms. পুরোনোর চেয়েও দ্রুত। আগে rehost, পরে উন্নতি, সঠিক ক্রমে।
সাধারণ ব্যর্থতা ৩ — খরচের চমক
ওপরের গল্পে চূড়ার মাসে বিল প্রায় দ্বিগুণ। আরও কয়েকটি চমক পরিচিত: on-premises-এর মাপেই VM বানানো, যদিও অর্ধেক অলস; ২৪ ঘণ্টা চালু dev server; replication আর log-এর data transfer; ভুলে থাকা disk আর snapshot; আর বাতিল হওয়া migration-এর “সাময়িক” bucket. Budget alert শুরুতেই রাখুন, আর পর্ব ৭৩-এর FinOps অভ্যাস wave-এর সাথে চালান।
আরও গভীরে: Online migration-এর মূল কৌশল একটি: এমন snapshot নেওয়া, যার সাথে log-এর একটি নির্দিষ্ট অবস্থান (PostgreSQL-এ WAL-এর LSN) বাঁধা, আর সেখান থেকেই পরিবর্তন চালানো। Debezium-এর মতো CDC টুল আর provider-এর migration সেবা এই ধারণার ওপরই দাঁড়িয়ে। PostgreSQL-এর logical replication DDL আর sequence-এর মান আনে না, তবে version-ভেদে নতুন সুবিধা যুক্ত হচ্ছে, তাই আপনার version-এর docs দেখুন।
পরীক্ষা ও ইন্টারভিউতে:
- Rehost আর replatform-এর পার্থক্য? Rehost-এ শুধু ঠিকানা বদলায়, replatform-এ একটি স্তর, যেমন managed DB, কিন্তু code-এর মূল গঠন একই থাকে।
- ১০ TB, ১০০ Mbps, ৮০% কার্যকারিতায় কত দিন? ১০^৬ সেকেন্ড, প্রায় ১১.৫৭ দিন।
- TTL কখন কমাবেন? Cutover-এর অন্তত এক পুরোনো TTL আগে।
- Downtime কমাতে DB কীভাবে সরাবেন? Snapshot, তারপর CDC, সংক্ষিপ্ত read-only, যাচাই, sequence ঠিক করা, reverse replication, তারপর দিক বদল।
- Chatty app ভাগ করলে সমস্যা কী? প্রতি query-তে RTT যোগ হয়। N × RTT পাতার সময়কে কয়েক গুণ করে।
১০ · AI-এর যুগে migration
AI একটি migration পরিকল্পনা কয়েক সেকেন্ডে লিখে দেয়, আর সেটি পড়তে দারুণ লাগে। কিন্তু সে আপনার flow data, মাসের শেষের batch বা দলের দক্ষতা দেখেনি। সে সাধারণত যে ভুলগুলো করে:
| AI-এর ভুল | বিপদ | যাচাই |
|---|---|---|
Replication-এর জন্য DB-তে 0.0.0.0/0 খোলা | পুরো ইন্টারনেটের সামনে DB | শুধু নির্দিষ্ট CIDR, VPN-এর ভেতরে |
Transfer bucket public বা * অনুমতি | ডেটা ফাঁস | Least privilege, policy নিজে পড়া |
| Connection string-এ password | Secret log আর Git-এ | Secret manager, পরে rotate |
Sync-এ --delete, বা terraform destroy দিয়ে পুরোনোটি সরানো | ফেরার পথ মুছে যায় | --dryrun, terraform plan, আগে backup |
| “Zero downtime” দাবি, rollback নেই | ব্যর্থ হলে ডেটা হারানো | ফেরার শর্ত আর মহড়া চাওয়া |
| ভুল bit-byte হিসাব, পরিবর্তন বাদ | সময়সূচি ভেঙে পড়ে | হাতে হিসাব মেলানো |
| নেই এমন flag বা সেবার নাম | Runbook মাঝপথে আটকে যায় | Official docs, throwaway পরিবেশে test |
| খরচ বাদ, পুরোনো দাম | Double running-এর চমক | Pricing পাতা, budget alert |
নিচের prompt-এ আসল host, IP বা secret দেবেন না। নাম পাল্টে দিন। শেষের প্রশ্নগুলো AI-কে অনুমান প্রকাশ করতে বাধ্য করে।
AI-এর পরিকল্পনা হাতে পেলে
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১Fiber-এর যুগে ডেটা ট্রাকে পাঠানো হয় কেন? গতি আর দেরি কি একই জিনিস?
Andrew Tanenbaum তাঁর Computer Networks বইয়ে একটি বিখ্যাত কথা লিখেছিলেন: tape-ভরা station wagon-এর bandwidth-কে কখনো ছোট করে দেখবেন না। কথাটি রসিকতা মনে হলেও পদার্থবিদ্যা ঠিক। Bandwidth হলো প্রতি সেকেন্ডে কত ডেটা যায়, latency হলো প্রথম bit পৌঁছাতে কত সময় লাগে। ট্রাকের latency কয়েক দিন, কিন্তু bandwidth বিশাল।
আমাদের ধরে নেওয়া সংখ্যায় হিসাব করুন। ৮০ TB-র একটি যন্ত্র ১৪ দিনে পৌঁছালে গড় গতি 80 × 10^12 × 8 ÷ (14 × 86400) ≈ 529 Mbps. চারটি যন্ত্র একসাথে গেলে প্রায় ২.১ Gbps, আর লিংকের মাসিক ভাড়াও লাগে না। এই যুক্তিতেই AWS ২০১৫ সালের দিকে Snowball আনে, আর ২০১৬ সালে Snowmobile নামে একটি কন্টেইনার-ট্রাক ঘোষণা করে, যাতে ১০০ PB ধরত। পরে সেবাটি গুটিয়ে নেওয়া হয়েছে বলে জানা যায়, আর পরিবারের অন্য যন্ত্রের প্রাপ্যতাও বদলেছে। কারণ লিংকের গতি বেড়েছে, ডেটার বড় অংশ এখন আগে থেকেই cloud-এ জন্মায়, আর বড় ট্রাকের চাহিদা খুব কম।
আরও দুটি বাস্তব কথা। যন্ত্র সব দেশে পাঠানো হয় না, আর আমদানি ও শুল্কের ঝামেলাও থাকতে পারে, তাই বাংলাদেশে পরিকল্পনার আগে provider-এর কাছে জেনে নিন। আর যন্ত্র শুধু বড় কপির সমাধান। মাঝের পরিবর্তন সেই লিংকেই যায়, তাই অংশ ৫-এর r < b শর্ত থেকেই যায়। ডেটা নিজের ঘর ছেড়ে কুরিয়ারে যাচ্ছে বলে encryption, চাবির মালিকানা আর হাতবদলের নথিও দরকার। যন্ত্র হারালেও ডেটা যেন পড়া না যায়, এটিই সেখানে মূল শর্ত।
মূল উপলব্ধি: প্রশ্নটি “কোনটি দ্রুত” নয়। প্রশ্ন হলো এই আকার, এই লিংক, এই পরিবর্তনের হারে কোনটি আগে শেষ হয়, আর সেটি আপনি হিসাব করে বলতে পারেন কি না।
প্র ০২“Lift and shift” কি অলসতা? Rehost-কে অনেকে ভুল বলেন কেন, আর অনেকে সেরা শুরু কেন বলেন?
দুই পক্ষই আংশিক ঠিক। সমালোচকরা বলেন, rehost করলে cloud-এর মূল সুবিধা পাওয়া যায় না। ধরুন ১০টি VM ২৪ ঘণ্টা চলছে, ধরে নেওয়া $০.১০ ঘণ্টায়: 10 × 0.10 × 720 = $720 মাসে। রাতে ব্যবহার না হলেও এই বিল আসছে। Elasticity নেই, managed service নেই, অগোছালো config-ও আগের মতো। এতে পুরোনো data centre শুধু অন্যের বাড়িতে উঠে আসে।
পক্ষের যুক্তিও শক্ত। ২০১৬ সালের দিকে AWS-এর Stephen Orban-এর লেখায় দেখানো হয়, বড় প্রতিষ্ঠান সময়ের চাপে rehost-কে শুরুর পথ হিসেবে নেয়, আর cloud-এ চলতে থাকা সিস্টেমকে উন্নত করা অনেক সময় সহজ হয়। কারণ একসাথে দুটি কঠিন কাজ করলে ঝুঁকি বহু গুণ। “ঠিকানা বদল” আর “গঠন বদল” এক রাতে করলে কিছু ভাঙলে কারণ বোঝাও কঠিন। ঠিক একই কারণে software engineering-এ একটি commit-এ এক কাজ করার পরামর্শ দেওয়া হয়। আর data centre-এর চুক্তি শেষের তারিখ থাকলে দুই বছরের refactor অসম্ভব। ধাপ আলাদা থাকলে প্রতিটি ধাপ শেষে মেপে দেখা যায়, কোথায় কতটা লাভ হলো, আর সমস্যা এলে কোন বদলটি দায়ী, সেটিও সহজে ধরা পড়ে।
আসল বিপদ rehost নয়, “পরে” শব্দটি। “পরে ঠিক করব” বেশিরভাগ সময় “কখনো না” হয়ে যায়, কারণ চলতি সিস্টেম কাজ করছে, আর নতুন feature-এর চাপ আসে। তাই পরের ধাপের মালিক, বাজেট আর তারিখ migration-এর সময়েই ঠিক করুন। এই শেষ কাজটিই পর্ব ৭৩-এর rightsizing আর উন্নতির চক্র।
মূল উপলব্ধি: Rehost একটি কৌশল, গন্তব্য নয়। ঝুঁকি ভাগ করে নেওয়ার জন্য এটি দারুণ, যদি পরের ধাপটি কাগজে নয়, ক্যালেন্ডারে লেখা থাকে।
প্র ০৩কিছু প্রতিষ্ঠান cloud ছেড়ে নিজের hardware-এ ফিরছে। তাহলে migration কি ভুল ছিল?
একে অনেকে cloud repatriation বলেন। দুটি বহুল আলোচিত প্রকাশ্য উদাহরণ আছে। Dropbox ২০১৬ সালের দিকে জানায় যে তারা ব্যবহারকারীর ডেটার বড় অংশ AWS থেকে নিজের storage ব্যবস্থায় এনেছে। আর ২০২২ সালে 37signals জানায় তারা cloud ছাড়ছে, পরে তারা নিজেদের ব্লগে খরচ কমার কথাও লেখে। এগুলো প্রতিষ্ঠানগুলোর নিজের দাবি, স্বাধীনভাবে যাচাই করা হিসাব নয়।
লক্ষ করার বিষয় হলো এদের ধরন। Dropbox-এর মূল ব্যবসাই storage, আর চাপ বিপুল ও অনুমানযোগ্য। স্থির, বড় চাপ cloud-এর সবচেয়ে দামি ব্যবহার। কারণ elasticity-র দাম দিচ্ছেন, কিন্তু ব্যবহার করছেন না। অন্যদিকে দু-চারজনের দলের জন্য নিজের hardware, on-call আর ডিস্ক বদলের খরচ অনেক বেশি। উত্তরটি তাই আকার আর চাপের ধরনের ওপর নির্ভর করে, যা পর্ব ০৪-এর TCO হিসাব বলে। হিসাবে মানুষের বেতন, বিদ্যুৎ, জায়গা, hardware-এর আয়ু আর ব্যর্থতার ঝুঁকি, সব রাখতে হবে। শুধু cloud-এর বিল আর একটি server-এর দাম পাশাপাশি রাখলে তুলনাটি ভুল হয়।
এই বিতর্ক migration-এর আরেকটি শিক্ষাও দেয়: ফেরার পথও ভাবুন। Egress ফি বড় ডেটা নিয়ে বেরোনোকে দামি করে। ২০২৪ সালের দিকে বড় provider-রা সব ডেটা নিয়ে চলে যাওয়ার ক্ষেত্রে শর্তসাপেক্ষে egress ছাড় দেওয়ার ঘোষণা দেন, যার পেছনে ইউরোপের নিয়ন্ত্রক চাপের ভূমিকা ছিল বলে ধরা হয়। শর্ত বদলায়, তাই আজকের নিয়ম মিলিয়ে নিন। Portable প্রযুক্তি, যেমন container, Terraform আর PostgreSQL, ফেরার খরচ কমায়, যদিও তাতে কিছু managed সুবিধা ছাড়তে হতে পারে।
মূল উপলব্ধি: Cloud কোনো ধর্ম নয়, একটি কেনাকাটা। আজকের ঠিক সিদ্ধান্ত পাঁচ বছর পরে ভুল হতে পারে। তাই লক্ষ্য মাপুন, আর সিদ্ধান্ত নিয়মিত আবার দেখুন।
প্র ০৪এক রাতে সব সরানো (big bang) নাকি ধীরে ধীরে? ইতিহাস কী বলে?
Big bang লোভনীয়: দুই সিস্টেম একসাথে চালাতে হয় না, খরচ কম মনে হয়, তারিখ পরিষ্কার। কিন্তু একবারে সব বদলালে একবারে সব ভাঙতে পারে। সবচেয়ে আলোচিত উদাহরণ যুক্তরাজ্যের TSB ব্যাংক, যদিও সেটি cloud নয়, ব্যাংকিং platform-এর migration ছিল। ২০১৮ সালের এপ্রিলে গ্রাহকদের ডেটা নতুন platform-এ সরানো হয়, আর বহু গ্রাহক দীর্ঘ সময় নিজের account-এ ঢুকতে সমস্যায় পড়েন। পরে স্বাধীন পর্যালোচনায় পরীক্ষার ঘাটতি আর প্রধানত এক ধাক্কায় সরানোর সিদ্ধান্ত নিয়ে প্রশ্ন ওঠে, আর ২০২২ সালে যুক্তরাজ্যের নিয়ন্ত্রকরা জরিমানা করেন। পুরোনো platform-এ ফেরা কার্যত কঠিন ছিল বলেও জানা যায়।
অন্য দিকে Netflix ২০০৮-এর পরে AWS-এ যাওয়া শুরু করে, আর ২০১৬ সালের শুরুতে জানায় তাদের streaming সিস্টেমের সরানো শেষ হয়েছে: প্রায় সাত বছরের ধীর পথ। তারা শুধু সরায়নি, অনেক কিছু নতুন করে বানিয়েছে। সব প্রতিষ্ঠানের এত সময় থাকে না, কিন্তু পথটি শিক্ষণীয়। ধীর পথে প্রতিটি ছোট ধাপ থেকে দল শেখে, আর পরের ধাপ আগের চেয়ে নিরাপদ হয়।
Rewrite-এর ক্ষেত্রেও একই কথা। Joel Spolsky ২০০০ সালের “Things You Should Never Do” লেখায় Netscape-এর উদাহরণ দিয়ে পুরো code নতুন করে লেখার বিপদ দেখান। Martin Fowler-এর strangler fig (২০০৪) তারই একটি উত্তর: অংশ ধরে অংশ, প্রতিটি ধাপ চলমান। কিন্তু ধীর পথের নিজের দাম আছে: দুই সিস্টেম একসাথে, double running, আর ক্লান্তি। অসমাপ্ত migration, যেখানে শেষ ২০% বছরের পর বছর পড়ে থাকে, নিজেই একটি রোগ।
মূল উপলব্ধি: ছোট ধাপ মানে ছোট blast radius আর দ্রুত শেখা। কিন্তু ধীর পথেরও একটি শেষের তারিখ থাকা চাই। ছোট app-এ এক রাতের সরানো পুরোপুরি যুক্তিসঙ্গত, যদি ফেরার পথ থাকে।
প্র ০৫Dual write এত সহজ হলেও CDC-কে নিরাপদ বলা হয় কেন? সমস্যাটি আসলে কোথায়?
ধরুন app অর্ডারটি প্রথমে পুরোনো DB-তে, তারপর নতুন DB-তে লেখে। প্রথমটি সফল, দ্বিতীয়টির আগেই app crash করল। এখন দুই পাশ আলাদা, আর কেউ জানে না। উল্টো ক্রমেও একই। দুই DB-র মধ্যে কোনো সাধারণ transaction নেই। Two-phase commit আছে বটে, কিন্তু আলাদা সিস্টেমের মধ্যে সেটি ধীর আর ভঙ্গুর, আর অনেক managed সেবায় বাস্তবসম্মত নয়।
আরেকটি সূক্ষ্ম ভুল ক্রমের। দুটি request একই সারি বদলাচ্ছে: A আর B. পুরোনো DB-তে A আগে, B পরে। Network-এর দেরিতে নতুন DB-তে B আগে, A পরে। দুই লেখাই সফল, কোনো error নেই, তবু শেষ মান আলাদা। ২০১৫ সালের দিকে Martin Kleppmann-এর একটি জনপ্রিয় লেখা এই সমস্যাকে স্পষ্ট করে, আর log-কে ব্যবস্থার কেন্দ্রে রাখার পরামর্শ দেয়।
CDC সমস্যাটি অন্যভাবে সরিয়ে দেয়। লেখা হয় একটিই জায়গায়, আর database-এর নিজের log-এ ক্রম আগে থেকেই ঠিক করা আছে। নকল সেই log পড়ে একই ক্রমে চালায়। পিছিয়ে পড়তে পারে, কিন্তু ভুল ক্রমে নয়। Crash হলে শেষ পড়া LSN থেকে আবার শুরু হয়। সবচেয়ে বড় পার্থক্য: পিছিয়ে থাকা মাপা যায়, আর শূন্য হলে দুই পাশ সমান বলে জানা যায়। Dual write-এ এমন কোনো মাপ নেই।
CDC-র নিজের দাম আছে: log-এর চাপ, DDL সামলানো, আর পিছিয়ে পড়লে সোর্সের disk ভরে যাওয়ার ঝুঁকি। PostgreSQL-এ পরিত্যক্ত replication slot WAL জমিয়ে রাখতে পারে, তাই নজর রাখতে হয়। আর দুই দিক থেকেই লেখা চালাতে চাইলে সংঘাতের নিয়ম লাগবে, যা এই পর্বের সীমার বাইরে।
মূল উপলব্ধি: দুই জায়গায় সত্য রাখা কঠিন। তাই এক জায়গায় সত্য রাখুন, আর বাকিগুলোকে সেই সত্যের ক্রম মেনে চলতে দিন।
অনুশীলন
প্রথমে নিজে করুন, তারপর উত্তর মেলান। কোনো cloud account লাগবে না।
-
হিসাব করুন: ৪০ TB ডেটা, ৫০০ Mbps লিংক, কার্যকারিতা ৭৫%, দিনে ১০০ GB বদলায়। Appliance-এ ১২ দিন লাগে (ধরে নেওয়া)। কোন পথ আগে শেষ হবে?
b = 500 × 0.75 = 375 Mbps T = 40 × 10^12 × 8 ÷ (375 × 10^6) = 853,333 s = 9.88 days r = 100 × 10^9 × 8 ÷ 86400 = 9.26 Mbps total = 9.88 ÷ (1 − 9.26/375) = 9.88 ÷ 0.9753 = 10.13 daysNetwork ১০.১৩ দিনে শেষ, appliance-এর ১২ দিনের আগে। আর পরিবর্তন যেহেতু একই লিংকেই যাবে, এখানে network-ই সহজ। তবে লিংকে অন্য কাজ থাকলে কার্যকারিতা ৭৫%-এর নিচে নামবে। প্রায় ৬৪%-এর নিচে নামলে ফল উল্টে যাবে, তাই একটি ছোট কপি চালিয়ে আসল গতি মেপে নিন।
-
আউটপুট অনুমান করুন: অংশ ৪-এর wave planner-এ
const chatty = [];করে দিয়েplan(6)চালালে কী ছাপা হবে? এই পরিকল্পনায় বিপদ কোথায়?--- at most 6 servers per wave wave 1: wiki, devtest, mail, shop_db, stock (6 servers) wave 2: search, reporting (2 servers) wave 3: shop_app (3 servers)এখন প্রতিটি app আলাদা দল।
shop_dbআরstock-এর কোনোafterনেই, তাই তারা wave 1-এই চলে যায়।shop_appঅপেক্ষা করে search আর reporting-এর জন্য, তাই wave 3-এ। ফলে দুই wave ধরে app অফিসে, DB cloud-এ। Code নিয়মের দিক থেকে পরিকল্পনাটি বৈধ, কিন্তু পাতার সময় প্রায় ৫ সেকেন্ড। Planner শুধু সেই নিয়ম মানে, যা আপনি তাকে দেন। -
পরিকল্পনা সমালোচনা করুন: একটি দলের পরিকল্পনা: “এক সপ্তাহের discovery. বৃহস্পতিবার রাতে, ঈদের দুই দিন আগে, সব server আর DB একসাথে সরাব। সেই রাতেই TTL কমাব। সব app-এ নতুন container-ও চালু করব। সমস্যা হলে backup থেকে ফিরব। পুরোনো server পরদিন সকালে বন্ধ।” কী কী বদলাবেন?
- Discovery: এক সপ্তাহে মাসিক কাজ ধরা পড়ে না। অন্তত এক পূর্ণ চক্র।
- তারিখ: ঈদের আগে চূড়ার চাপ। Change freeze মেনে শান্ত সময়।
- এক ধাক্কা: Wave-এ ভাগ, কম ঝুঁকির app আগে।
- TTL: সেই রাতে কমালে পুরোনো TTL-এর cache থেকেই যায়। অন্তত এক পুরোনো TTL আগে।
- দুই বদল একসাথে: ঠিকানা আর গঠন আলাদা করুন।
- Rollback: Backup থেকে ফিরলে cutover-এর পরের লেখা হারায়। Reverse replication আর সংখ্যায় লেখা ফেরার শর্ত।
- পুরোনো server: পরদিনই বন্ধ করলে ফেরার পথ শেষ। স্থিতিশীল সময়ের পরে, শেষ backup নিয়ে।
-
শেষ অবস্থা অনুমান করুন: Source থেকে logical replication-এ
ordersটেবিল target-এ এসেছে, সবচেয়ে বড়id৮,৩১২,৪০০. Target-এরorders_id_seqএখনো ১ থেকে শুরু, কারণ কেউ সেটি ছোঁয়নি। Cutover-এর পরে appidনা দিয়ে একটিINSERTপাঠাল। কী হবে? সমাধান কী?Sequence ছোট সংখ্যা দেবে, যেমন
1. সেইidআগে থেকেই আছে, তাইduplicate key value violates unique constrainterror আসবে। পরের বারে2, আবারও একই error. প্রতিটি নতুন অর্ডার ব্যর্থ। সারি নকল হয়েছিল, কিন্তু sequence-এর মান logical replication আনে না।সমাধান: লেখা খোলার আগে
setvalদিয়ে sequence এগিয়ে নেওয়া, সাধারণত সবচেয়ে বড়id-এর ওপরে কিছু ফাঁক রেখে। সব sequence-এর জন্য আগে থেকে script রাখুন, আর মহড়ায় একটি পরীক্ষামূলকINSERTচালান।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমএকটি database cutover-এর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- DNS-এর TTL কমানো, আর snapshot শুরু করা
- CDC দিয়ে target-কে ধরিয়ে ফেলা
- Source-এ লেখা বন্ধ করা (read-only)
- Lag শূন্য হলে সংখ্যা ও checksum মেলানো
- Sequence ঠিক করে reverse replication চালু করা
- Traffic target-এ ঘোরানো
একটি কোম্পানি নিজের PostgreSQL server ছেড়ে cloud-এর managed PostgreSQL-এ যাচ্ছে। App-এর code প্রায় একই থাকছে। এটি কোন migration পথ?
- Rehost
- Replatform
- Repurchase
- Refactor
১০ TB ডেটা ১০০ Mbps লিংকে ৮০% কার্যকারিতায় পাঠাতে কত সময় লাগবে (1 TB = 1012 B)?
- প্রায় ১.৪৫ দিন
- প্রায় ৯.২৬ দিন
- প্রায় ১১.৫৭ দিন
- প্রায় ১১৫ দিন
একটি record-এর TTL এখন 3600 সেকেন্ড। ১২:০০-তে cutover. TTL কমানোর সবচেয়ে দেরির নিরাপদ সময় কোনটি?
- ১১:০০-এর মধ্যে
- ১১:৩০-এ
- ১১:৫৯-এ
- ১২:০০-এ, record বদলানোর সাথেই
দুই সপ্তাহের flow data-তে একটি server একবারও দেখা যায়নি। পরের সঠিক কাজ কোনটি?
- সাথে সাথে retire করা
- প্রথম wave-এ rehost করা
- ঝুঁকি নেই ধরে তালিকা থেকে বাদ দেওয়া
- মালিকের সাথে কথা বলা, আর পুরো ব্যবসায়িক চক্র ধরে নজর রাখা
Database migration-এ logical replication-এর পরে cutover করা হলো, আর নতুন INSERT duplicate key error দিচ্ছে। সবচেয়ে সম্ভাব্য কারণ কী?
- Target-এ index নেই
- Sequence-এর মান এগিয়ে নেওয়া হয়নি
- DNS-এর TTL বেশি
- Target-এর disk encrypted
একটি পাতায় ১২০টি query পরপর চলে। App অফিসে আর DB cloud-এ রাখায় App–DB RTT ০.৫ ms থেকে ৪০ ms হলো। অন্য কিছু না বদলালে পাতার সময় প্রায় কত বাড়বে?
- প্রায় ৪০ ms
- প্রায় ৪০০ ms
- প্রায় ৪.৭ সেকেন্ড
- প্রায় ৪৮ সেকেন্ড
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- লক্ষ্য সংখ্যায় লিখুন। না যাওয়া বা hybrid থাকাও সঠিক সিদ্ধান্ত হতে পারে।
- Discovery একটি পূর্ণ ব্যবসায়িক চক্র ধরে। নীরব মানে অব্যবহৃত নয়।
- প্রতি app-এ একটি পথ: rehost, replatform, repurchase, refactor, retire, retain, relocate. আগে retire খুঁজুন।
সময় = আকার × 8 ÷ (গতি × e), আর পরিবর্তন ধরলেT ÷ (1 − r/b). Chatty দল একসাথে সরে।- Cutover: TTL আগে, CDC, read-only, যাচাই, sequence, reverse replication, দিক বদল। ফেরার শর্ত আগে লেখা।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ৭৬ · ক্যাপস্টোন — code থেকে productionপরবর্তী পর্বContainer, Kubernetes, Terraform, pipeline আর observability একসাথে।
- ক্লাউড কম্পিউটিং ও DevOps · কোর্স হোম৮১টি পর্বপুরো কোর্সের রোডম্যাপ।
- System Design · Microservicesগভীরে যানStrangler fig আর monolith থেকে ধীরে ধীরে সরার নকশা।
- DBMS · Backup, replication আর high availabilityপাশের ট্র্যাকWAL, replication আর PITR-এর ভেতরের কথা।
- Software Engineering · Technical debt আর legacy codeপাশের ট্র্যাকপুরোনো সিস্টেমে নিরাপদে বদল আনার পথ।