সেশন ০৩

Database কে SPOF থেকে মুক্ত করা

এই সেশনের লক্ষ্যঃ Database এর SPOF problem solve করা। সাথে যেসব trade-off আসে, সেগুলো বোঝা।
Database কে SPOF থেকে মুক্ত করা
Database কে SPOF থেকে মুক্ত করা
সতর্কতা

এই প্রথম সেশন, যেখানে প্রতিটা solution একটা নতুন সমস্যা তৈরি করে। Real distributed system এ স্বাগতম।

০০ যে প্রশ্নগুলোর উত্তর খুঁজবো

প্রতিটা প্রশ্নের উত্তর জানার পর আপনি বুঝবেন replication, replication এর cost, আর source of truth এর মতো critical concept।

  • এখনো একটাই database। আমি আসলে দুটো জিনিস protect করতে চাইছি, সেগুলো কী?
  • একাধিক copy রাখার basic idea টা কী?
  • Read আর Write আলাদা করব কেন? শুধু safety এর জন্য copy রাখলে হয় না?
  • Replica যদি read serve করতে পারে, তাহলে সবকিছু replica থেকেই কেন না?
  • Primary তো এখনো down হয়ে যেতে পারে, তখন কী হবে?
  • ৫টা replica থাকলেও কি backup দরকার?
  • User write করার পরের মুহূর্তেই read করল, কী হবে?
  • System এখন কেমন? এখনো কোনো single point of failure আছে?

০১ এখনো database একটাই। আসলে আমরা কী protect করছি?

সেশন ০২ শেষ। আমরা যা পেয়েছি, তাতে database এখনো SPOF। Database down হলে পুরো system down। আরো ভয়ংকর: disk crash করলে data চিরতরে হারিয়ে যায়

আমরা আসলে দুটো জিনিস achieve করতে চাচ্ছি:

  1. Durability: মেশিন crash করলেও data ঠিকঠাক থাকে (information হারায় না)।
  2. Availability: মেশিন down হলেও service চালু থাকে (user serve হতে থাকে)।

এই দুটো একই শোনালেও আসলে আলাদা।

দুটোই দরকার। দুটো আলাদা আলাদা সমস্যার সমাধান দেয়।

০২ একাধিক copy রাখার basic idea?

লাইব্রেরির গল্প

ধরুন একটা লাইব্রেরিতে প্রতিটা বইয়ের একটা করেই কপি আছে

এই সমস্যা সমাধানে ২টা কাজ করা যায়:

  1. ফটোকপি বানানো (Replica): বেশি reader এর জন্য বেশি কপি, শুধু original কপি নয়।
  2. আলাদা building এ master কপি রাখা (Backup): এক building পুড়লেও অন্যটায় বই safe থাকে।

Database এর জন্য ঠিক এটাই করব।

Database Replication: Primary-Replica মডেল

Replication কী?

Multiple machine এ database এর একাধিক copy রাখা। একটা down হলেও অন্যগুলোতে data থাকে।

পুরোনো নাম: Master-Slave। আধুনিক নাম: Primary-Replica

APPLICATION PRIMARY REPLICA Web Servers read + write writes Primary DB replication Replica read-only
Primary সব write handle করে। Replica continuously primary থেকে copy হয় - read-only।

০৩ Read আর write আলাদা করব কেন?

বেশিরভাগ application এ write এর চেয়ে read হয় অনেক বেশি:

সাধারণ read:write ratio থাকে 80:20 বা 95:5। তাই এক Primary আর অনেক Replica মিলে বিপুল read traffic সামলাতে পারে।

APPLICATION DATA Web 1 Web 2 Web 3 writes reads reads Primary DB replication replication Replica 1 Replica 2
সলিড অ্যারো = write (Primary তে)। হাইলাইট অ্যারো = read (Replica থেকে)। ডটেড = replication।

এতে যা পাই:

০৪ Replica যদি read serve করতে পারে, সব কিছু কেন replica থেকে না?

এটাই হলো catch: Replication Lag

Replication Lag কী?

Primary থেকে Replica তে data copy হতে কিছু সময় লাগে। এই delay কেই বলে Replication Lag

সাধারণত কয়েক millisecond, কখনো কয়েক second, network খারাপ হলে minute পর্যন্ত।

উদাহরণ:

Step 1: আপনি Facebook প্রোফাইল পিকচার বদলালেন।
Update গেল Primary DB তে। Primary তে নতুন ছবি।

Step 2: Primary শুরু করল changes কে replica তে copy করতে।

Step 3: replica তে Copy শেষের আগেই আপনি page refresh মারলেন।
Read গেল Replica তে (এখনো পুরোনো ছবি)।

Step 4: পুরোনো ছবি দেখে ভাবলেন update fail।
আবার "update" click করলেন। ডাবল আপডেট অপারেশন চললো।

Eventual Consistency vs Strong Consistency

Eventual Consistency

Primary DB এর changes গুলো replica তে copy শেষ হয়ে গেলে replica গুলো eventually same data পায়। কিন্তু replication চলাকালীন মধ্যবর্তী কোনো একটা moment এ আলাদা আলাদা replica আলাদা data দেখাতে পারে।

Strong Consistency

প্রতিটা read সর্বশেষ write থেকেই data পায়, যে replica থেকেই read করা হোক না কেন। Synchronous Replication এর মাধ্যমে এটা achieve করা যায়। সবগুলো replica তে write confirm হওয়ার পরেই user কে done বলা হয়। তাই write operation slow, কিন্তু safer।

Eventual ConsistencyStrong Consistency
FastSlower
Scale করা সহজScale করা কঠিন
Stale read হতে পারেসবসময় fresh
Like, view count, comments এর জন্য উপযোগীBank, inventory, payment এর জন্য বাধ্যতামূলক

এই concept টা পরে আরো গভীরে explore করব (CAP Theorem এর সময়)। এখনকার জন্য মনে রাখুন: replication এর cost আছে, এটা free নয়।

০৫ Primary তো এখনো ডাউন হয়ে যেতে পারে, তখন কী হবে?

Primary down হয়ে গেলে write operation বন্ধ হয়ে যায়। এর fix হলো Failover: কোনো একটা replica কে promote করে নতুন primary বানানো।

আগে Primary ডাউন হয়ে গেলো Failover এর পর Primary Replica 1 Replica 2 Primary Replica 1 → promoting Replica 2 New Primary Replica 2
Primary ডাউন - Replica 1 কে নতুন Primary বানানো হলো। Replica 2 নতুন primary থেকে replicate করে।

Failover কঠিন কেন?

  1. Primary সত্যিই down হয়েছে, এটা কীভাবে বুঝবেন? হয়তো slow চলছে। হয়তো network connection broken। Primary alive থাকতেই replica কে promote করলে Split Brain হয়: দুই primary, দুটোই write নিচ্ছে, data corruption।
  2. হারিয়ে যাওয়া write (Lost writes): Primary যে write accept করেছিল কিন্তু replica তে copy হয়নি, সেই replica কে primary তে promote করলে ওই write গুলো হারিয়ে যায়।
  3. Failover এ সময় লাগে: কয়েক second থেকে minute পর্যন্ত। এই সময় application write accept করতে পারে না।

আধুনিক system এ Raft, Paxos, Zookeeper এই সমস্যার সমাধান দেয়। নামগুলো জানা থাকুক, বিস্তারিত পরে।

০৬ ৫টা Replica থাকলেও কি Backup দরকার?

হ্যাঁ। এই জায়গাটা অনেক engineer কেই confusion এ ফেলে দেয়।

Replication ≠ Backup
ReplicationBackup
Real-time copyPoint-in-time snapshot
Machine failure থেকে রক্ষাHuman mistake, corruption, malware থেকে রক্ষা
Live, active machine এ থাকেCold storage এ stored (S3, tape)
Recovery দ্রুত (seconds/minutes)Recovery ধীর (ঘণ্টা পর্যন্ত)

একটা ভয়ংকর গল্প

একজন developer ভুল করে primary তে এটা type করল:

DELETE FROM users;

কী হলো?

এখানে backup ই একমাত্র escape gate। গত রাতের snapshot থেকে data restore করুন।

মনে রাখুন

Replication রক্ষা করে hardware failure থেকে। Backup রক্ষা করে software mistake, human error, আর corruption থেকে। দুটোই important।

০৭ User write করার পরের মুহূর্তেই read করল, কী হবে?

User cart এ item add করল (Primary তে write)। তারপর refresh করল (Replica থেকে read, যেখানে lag আছে)।

সমস্যা:

সবাই যেভাবে ভাবে:

“DB এর বদলে cache use করি”, এটা একটা বিপজ্জনক চিন্তা

এটা multiple sources of truth তৈরি করে, যা System Design এর সবচেয়ে বড় ভুলগুলোর একটা।

সমাধান: ৩টা option

সমাধান ১: Read-After-Write Consistency (Sticky Reads)

যে user এইমাত্র write করেছে, তার পরের reads কিছু সময়ের জন্য Primary তে route করুন (যেমন ৩০ second)। বাকি user রা replica থেকেই read করবে।

User A cart এ add → Primary তে write।
পরের ৩০ second User A এর reads → Primary তে।
৩০ second পর Replicas catch up → আবার Replica তে।

এটাই সবচেয়ে common solution।

সমাধান ২: Cache-Aside Pattern

DB এর উপরে cache রাখুন, DB কে replace করবেন না।

Cart এ add:
১. Primary DB তে write (source of truth)
২. Cache এও write (fast read layer)

Cart read:
১. Cache দেখুন আগে (fresh, fast)
২. Miss হলে Replica থেকে
৩. তাও না পেলে Primary থেকে

Cache হলো optimization, source of truth নয়।

সমাধান ৩: Synchronous Replication

User কে “done” বলার আগে অন্তত একটা replica confirm করা পর্যন্ত wait করুন।

  • Write slow হয়।
  • Primary write এর পরেই immediately down হলেও data loss হয় না।
  • তবে মনে রাখুন, বেশিরভাগ database এ default setup থাকে Asynchronous Replication: Primary write এর সাথে সাথেই user কে জানিয়ে দেওয়া হয়, আর replication background এ চলতে থাকে

Source of Truth: critical concept

Source of Truth

Data এর official, authoritative version যেখানে থাকে, সেটাই Source of Truth। বাকি সব (cache, replica, search index) হলো শুধু copy।

System design করার সময় সবসময় একটা প্রশ্ন করুন: এখানে আমার source of truth কোনটা?

Cart problem এ source of truth হলো Database। Cache হলো speed এর জন্য copy। Replica হলো read এর জন্য copy।

“Source of truth কোনটা”, এটা এক বাক্যে answer দিতে না পারলে বুঝে নিন design এ সমস্যা আছে।

০৮ System এখন কেমন? এখনো ব্রোকেন পয়েন্ট আছে?

CLIENT LOAD BALANCER APPLICATION DATA BACKUP (COLD STORAGE) User User User LB-1 Active LB-2 Passive heartbeat Stateless Web 1 App Server Web 2 App Server Web 3 App Server Primary DB writes Replica 1 Replica 2 nightly backup Backup Storage Cold (S3 / Glacier)
সলিড অ্যারো = write (Primary)। হাইলাইট অ্যারো = read (Replica)। ডটেড = replication + nightly backup।

এখন পর্যন্ত কি কি ঠিক করা হলো?

  • Database availability - Replicas রিড হ্যান্ডেল করে। Primary ডাউন হলেই failover।
  • Data durability - Permanent Backup, data loss থেকে রক্ষা।
  • Read scaling - বেশি replica যোগ করলে massive read traffic replica database থেকেই handle হয়ে যায়।

নতুন যেসব সমস্যা (Trade-offs)

  • Replication Lag - eventual consistency, stale read এর সম্ভাবনা।
  • Failover Complexity - split brain, lost writes, detection problem (primary আসলেই ডাউন হয়েছে কিনা)।
  • Cost - বেশি মেশিন, বেশি মনিটরিং।

যা এখনো বাকি

  • দূরের user এখনো হাই লেটেন্সি পাবে। Database যত fast ই হোক, ভৌগোলিকভাবে দূরের user হাই লেটেন্সি ফেস করবে।
  • Write এখনো এক মেশিন থেকে। Write traffic বাড়লে bottleneck তৈরি হবে।
  • প্রতি request ডাটা লোড করছে database থেকে। Cache layer নেই।

০৯ মগজে প্রেশার দিন

আগে নিজে ভাবুন। তারপর দেখুন সবাই যেভাবে ভাবে, কেন সেটা ভুল, আর সঠিক চিন্তা কী।

প্রশ্ন ১: Replica থেকে stale data পাওয়ার সম্ভাবনা থাকে, তাহলে replica use করি কেন?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“Main goal হলো read আর write load balance করা। একাধিক read node নিজের resource দিয়ে load handle করে।”

এই চিন্তা ঠিক direction এ, কিন্তু সব কারণ cover করছে না

সঠিক উত্তর: ৫টা কারণ

  1. Read আর write load আলাদা: Primary শুধু write handle করবে।
  2. Reads horizontally scale: বেশি replica অ্যাড করার কারণে read load scale হবে।
  3. Geographic distribution: replica একাধিক হওয়ায় আমরা user এর location এর উপর base করে আলাদা আলাদা location এ replica server বসাতে পারি। এতে user নিজের কাছাকাছি replica use করে, latency কমে।
  4. Heavy query isolate: Analytics, report এর মতো heavy কিন্তু non-urgent query গুলো replica তে পাঠান। Primary কে শুধু time-sensitive request handle এর জন্য ব্যবহার করুন। (এটা industry pattern, কিন্তু প্রায়ই miss হয়ে যায়।)
  5. Failover candidate: primary down হলে replica নতুন primary হতে পারে।

Stale data এর cost: বাস্তবে বেশিরভাগ read এর জন্য কিছুটা staleness acceptable। কিন্তু কোন read staleness tolerate করতে পারে আর কোনটায় fresh data must, এটা ধরতে পারাটাও একটা skill

প্রশ্ন ২: এক company বলল "আমাদের ৩টা replica আছে, তাই backup দরকার নেই।" তারা ভুল কেন?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“Replica আর backup এক জিনিস নয়। Backup হলো নির্দিষ্ট সময়ের snapshot, human mistake recover করার জন্য সেটা helpful। Replica সবসময় database এর সাথে sync থাকে।”

মূল idea ঠিক, কিন্তু একটা শব্দ বিপজ্জনক

“সবসময় sync”: এই কথাটায় সার্প নজর দিন

Replica সবসময় sync নয়। Replica eventually sync হয়, instantly না; কারণ replication lag আছে। System design এ শব্দ precise হতে হবে।

Replication কেন backup এর substitute নয়?

Developer যদি ভুল করে primary তে DELETE FROM users চালায়, replication faithfully সেই delete সব replica তে copy করবে। কয়েক second এর মধ্যেই সবগুলো replica থেকে data হারিয়ে যাবে। Replication ভুলটাকে carry করবে, prevent করবে না।

Backup আলাদা জায়গায় stored, frozen in time, live operation এর উপর এর কোনো effect নেই। এই বৈশিষ্ট্যটাই backup কে escape gate বানায়।

প্রশ্ন ৩: User cart এ add করল (Primary তে write), refresh করল (Replica থেকে lag সহ read)। কী হবে? Solution?
উত্তর দেখুন আগে নিজে ভাবুন

সবাই যেভাবে ভাবে

“User cart এ add করা item দেখবে না। User আবার cart এ অ্যাড করবে, ফলে duplicate item অ্যাড হয়ে যেতে পারে। DB এর বদলে temporary cache use করি। পরে DB তে sync করব।“

কোথায় ঠিক

  • User cart এ add করা item দেখতে পাবে না। ✓
  • Duplicate item অ্যাড হয়ে যেতে পারে। ✓

কোথায় বিপজ্জনকভাবে ভুল

“DB এর বদলে cache”, এটা একটা dangerous thinking

  • Cache volatile: Redis restart হলে cart data হারিয়ে যায়।
  • “পরে DB তে sync”: কথাটা vague। কখন save করবেন? Checkout আগে হলে? Sync fail করলে?

এটা multiple sources of truth তৈরি করে, যা system design এর সবচেয়ে বড় ভুল।

সঠিক solution: ৩টা option

  1. Read-after-Write Consistency (Sticky Reads): Write এর পর কিছু সময় ওই user এর reads primary তে route করুন।
  2. Cache-Aside Pattern: Cache থাকবে DB এর উপরে, replace হিসেবে নয়। DB থাকবে source of truth।
  3. Synchronous Replication: Critical write এর জন্য; replica confirm করার আগে user কে “done” বলবেন না।
শিক্ষা

প্রতি solution এর একটা cost আছে। Sticky reads এ primary তে বেশি load পড়ে। Cache এ বেশি complexity আসে। Sync replication এ write slow হয়। System design এ free fix বলে কিছু নেই।

১০ যে টার্মগুলো শিখলাম

টার্মমানে
ReplicationMultiple machine এ database এর copy।
Primaryযে database সব write handle করে।
ReplicaPrimary এর read-only copy, continuously sync হয়।
FailoverPrimary down হলে একটা replica কে promote করে নতুন primary বানানো হয়।
Split Brainএকসাথে দুই primary active, এতে data corruption হয়।
Replication LagPrimary write আর Replica তে sync হওয়ার মধ্যবর্তী delay।
Eventual Consistencyসব replica eventually match করবে, instantly না।
Strong Consistencyপ্রতি read সর্বশেষ write দেখে, সবসময়।
Synchronous ReplicationReplica confirm এর জন্য wait। Slower, safer।
Asynchronous ReplicationWrite immediately confirm, replication background এ চলে। Faster, কিন্তু failover এ data loss এর risk।
BackupPoint-in-time snapshot, human বা software mistake recover করে।
Cold StorageCheap, slow storage (S3 Glacier, tape)।
Read-after-Write / Sticky ReadsUser write এর পর immediately ওই user এর reads primary থেকে।
Cache-Aside PatternCache থাকে database এর উপরে; DB ই source of truth।
Source of TruthData এর authoritative version যেখানে থাকে।
Raft / Paxos / Zookeeperকোন মেশিন primary হবে সেটা নিয়ে সবাইকে একমত করানোর algorithm বা tool।

১১ সংক্ষিপ্ত সারাংশ

  1. Replication multiple machine এ database এর copy রাখে। এক primary write handle করে, replica reads handle করে, আর primary down হলে একটা replica কে promote করে primary বানানো হয়।
  2. Replication instant নয়; এই delay কে বলে Replication Lag। এটা Strong Consistency (slow, safe) আর Eventual Consistency (fast, stale) এর মধ্যে একটা trade-off তৈরি করে।
  3. Replication মেশিনের failure recover করতে help করে, আর Backup human mistake recover করতে help করে। দুটোই দরকার, দুটো এক জিনিস নয়।

১২ মনে রাখুন