জানুন কেন বিতরণকৃত ডাটাবেসগুলো প্রায়ই ত্রুটির সময় উপলব্ধতা রাখার জন্য সামঞ্জস্যতা শিথিল করে, CAP ও কোয়োরাম কিভাবে কাজ করে, এবং কখন কোন পন্থা বেছে নেবেন।

যখন একটি ডাটাবেস একাধিক মেশিন (প্রতিলিপি) জুড়ে বিভক্ত হয়, আপনি গতি ও প্রতিরোধ ক্ষমতা পান—কিন্তু একই সাথে এমন সময়ও আসে যখন সেই মেশিনগুলো পুরোপুরি একমত না থাকে বা একে অপরের সাথে নির্ভরযোগ্যভাবে যোগাযোগ করতে না পারে।
সামঞ্জস্যতা মানে: একটি সফল লেখার পর, সবাই একই মান পড়ে। যদি আপনি আপনার প্রোফাইল ইমেইল আপডেট করেন, পরের যে কোনো পড়াই—যেই প্রতিলিপি থেকে হোক—নতুন ইমেইল দেখাবে।
বাস্তবে, সামঞ্জস্যতার উপর জোর দেয় এমন সিস্টেমগুলো ত্রুটির সময় কিছু অনুরোধ দিলেই বা প্রত্যাখ্যান করতে পারে যাতে দ্বন্দ্বপূর্ণ উত্তর না ফেরে।
উপলব্ধতা মানে: সিস্টেম প্রতিটি অনুরোধের উত্তর দেয়, এমনকি কিছু সার্ভার বন্ধ বা বিচ্ছিন্ন থাকলেও। আপনাকে হয়তো সর্বশেষ ডেটা নাও মিলতে পারে, কিন্তু উত্তর পাবেন।
বাস্তবে, উপলব্ধতার উপর জোর দেয় এমন সিস্টেমগুলো লেখাগুলো গ্রহণ করে এবং পড়া সার্ভ করে এমনকি প্রতিলিপিগুলো অসামঞ্জস্যপূর্ণ থাকলেও, পরে পার্থক্য মিলিয়ে নেওয়া হয়।
একটি ট্রেড-অফ মানে যে প্রতিটি ব্যর্থতার সময় একই সাথে উভয় লক্ষ্যকে সর্বোচ্চ করা যায় না। যদি প্রতিলিপি সমন্বয় করতে না পারে, ডাটাবেসকে করতে হবে:
সঠিক ভারসাম্য নির্ভর করে আপনি কোন ত্রুটি সহ্য করতে পারেন: সাময়িক আউটেজ, না কি সামান্য পুরানো/ভুল ডেটা। বেশিরভাগ বাস্তব সিস্টেম মাঝামাঝি একটি পয়েন্ট বেছে নেয়—এবং ট্রেড-অফটি স্পষ্টভাবে চিহ্নিত করে।
কখন একটি ডাটাবেস “বিতরণকৃত” বলে ধরা হয়? যখন তা একাধিক মেশিন (নোড) থেকে ডেটা সংরক্ষণ ও সার্ভ করে এবং নেটওয়ার্কের মাধ্যমে সমন্বয় করে। অ্যাপ্লিকেশনের পক্ষে এটা এখনও একটি ডাটাবেসের মতো দেখা দিতে পারে—কিন্তু ভিতরের কাজগুলোতে অনুরোধ বিভিন্ন নোডে ভিন্ন ভিন্ন স্থানে হ্যান্ডেল হতে পারে।
বেশিরভাগ বিতরণকৃত ডাটাবেস ডেটা প্রতিলিপি করে: একই রেকর্ড একাধিক নোডে থাকে। টিমরা এটা করে:
প্রতিলিপি শক্তিশালী, কিন্তু এতে সঙ্গে একটি প্রশ্ন আসে: যদি দুটি নোডে একই ডেটার কপি থাকে, তাদেরকে কিভাবে নিশ্চিত করবেন যে তারা সবসময় একমত থাকবে?
একটিমাত্র সার্ভারে “ডাউন” সাধারণত স্পষ্ট—মেশিন চলছে নাকি নয়। বিতরণকৃত সিস্টেমে ব্যর্থতা প্রায়ই আংশিক: একটি নোড জীবিত কিন্তু ধীর হতে পারে, একটি নেটওয়ার্ক লিংক প্যাকেট হারাতে পারে, একটি পুরো র্যাকে কানেক্টিভিটি হারাতে পারে।
এই ব্যাপারটি গুরুত্বপূর্ণ কারণ নোডগুলো তাৎক্ষণিকভাবে সিদ্ধান্ত নিতে পারে না অন্য নোড সত্যিকারের ডাউন নাকি কেবল বিলম্বিত—এই অস্থির অবস্থায়ও তাদের ইনকামিং পড়া ও লেখাগুলোর সাথে কী করা হবে তা ঠিক করতে হয়।
একই সার্ভারে থাকলে একটি উৎস সত্য থাকে: প্রতিটি পড়াই সর্বশেষ সফল লেখাটি দেখে।
কিন্তু একাধিক নোডে, “সর্বশেষ” সমন্বয়ের ওপর নির্ভর করে। যদি একটি লেখাটি নোড A-তে সফল হয় কিন্তু নোড B পৌঁছায় না, ডাটাবেস কি করবে:
এই টানাপোড়েনই হল কেন বিতরণ নিয়ম বদলে দেয়।
নেটওয়ার্ক পার্টিশন হল নোডগুলোর মধ্যে এমন একটি যোগাযোগের ভাঙন যা এক ডাটাবেসের মতো কাজ করা উচিত। নোডগুলো চালু থাকতে পারে এবং সুস্থ দেখা গেলেও তারা বার্তা নির্ভরযোগ্যভাবে আদানপ্রদান করতে পারবেনা—বিভিন্ন কারণে: ব্যর্থ সুইচ, অতিরিক্ত লোডে থাকা লিংক, ভুল রাউটিং, ভুল কনফিগার্ড ফায়ারওয়াল, বা ক্লাউড নেটওয়ার্কে কোনো প্রতিবেশীর গোলমাল।
যখন সিস্টেম একাধিক মেশিনে (র্যাক, জোন বা রেজিয়ন জুড়ে) ছড়িয়ে পড়ে, আপনি আর প্রতিটি হপ নিয়ন্ত্রণ করেন না। নেটওয়ার্ক প্যাকেট হারায়, বিলম্ব এনে দেয়, এবং কখনও কখনও “দ্বীপ” সৃষ্টি করে। ছোট স্কেলে এসব বিরল; বড় স্কেলে রুটিন। এমনকি অল্প সময়ের বিঘ্নও প্রভাব ফেলে, কারণ ডাটাবেসগুলোকে কি ঘটেছে সেই বিষয়ে একে অপরের সাথে ধারাবাহিক সমন্বয় করতে হয়।
পার্টিশনের সময় উভয় পাশে অনুরোধ পেতে থাকে। যদি ব্যবহারকারীরা উভয় পাশে লিখতে পারে, প্রতিটি পাশ এমন আপডেট গ্রহণ করতে পারে যা অন্য পাশে দেখা যায় না।
উদাহরণ: নোড A-তে একজন ব্যবহারকারীর ঠিকানা “New Street” আপডেট করা হলো। একই সময়ে, নোড B-তে সেটি “Old Street Apt 2” করা হলো। প্রতিটি পাশই নিজের লেখাটিকেই সর্বশেষ মনে করে—কারণ তারা রিয়েল টাইমে নোট নিতে পারে না।
পার্টিশন নিখুঁত ত্রুটি বার্তা হিসেবে প্রকাশ পায় না; এটা বিকৃত আচরণের মাধ্যমে প্রকাশ পায়:
এটাই সেই চাপের বিন্দু যা একটি সিদ্ধান্তকে বাধ্য করে: যখন নেটওয়ার্ক যোগাযোগ নিশ্চিত করতে পারে না, একটি বিতরণকৃত ডাটাবেসকে কি সামঞ্জস্যতা অগ্রাধিকার দেয়া উচিত, না কি উপলব্ধতা।
CAP হচ্ছে একটি সংক্ষিপ্ত উপায় বর্ণনার জন্য যে কি ঘটে যখন ডাটাবেস একাধিক মেশিন জুড়ে ছড়িয়ে পড়ে।
যখন কোনো পার্টিশন নেই, অনেক সিস্টেম একই সময়ে সামঞ্জস্য এবং উপলব্ধতা উভয়ই প্রদর্শন করতে পারে।
যখন পার্টিশন ঘটে, আপনাকে যা অগ্রাধিকার দেয়া দরকার তা বেছে নিতে হবে:
balance = 100 সার্ভার A-তে লিখে।balance = 80।CAP বলে “চিরন্তনভাবে কেবল দুইটি বেছে নাও” না। এর মানে: পার্টিশনের সময় আপনি একই সময়ে Consistency এবং Availability নিশ্চিত করতে পারবেন না। পার্টিশন না থাকলে আপনি প্রায়ই দুইটোকেই কাছাকাছি করতে পারবেন—কিন্তু নেটওয়ার্ক যখন খারাপ কাজ করে তখন সীমাবদ্ধতা সামনে আসে।
সামঞ্জস্যতা বেছে নেওয়ার অর্থ হল ডাটাবেস “সবাই একই সত্য দেখে” এই কথাটিকে প্রতিটি অনুরোধে অগ্রাধিকার দেয়—“সবসময় উত্তর দেওয়া” না। বাস্তবে এটি প্রায়ই স্ট্রং কনসিস্টেন্সি নির্দেশ করে, যেটি অনেক সময় লিনিয়ারাইজেবল আচরণ হিসেবে বর্ণিত হয়: একবার কোনো লেখাটি প্রত্যয়িত হলে, যে কোনো পরে পড়া (যেখানে থেকে থেকেই) সেই মানটাই দেখাবে, যেন একক আপ-টু-ডেট কপি আছে।
নেটওয়ার্ক বিভক্ত হলে এবং প্রতিলিপি একে অপরের সঙ্গে নির্ভরযোগ্যভাবে কথা বলতে না পারলে, স্ট্রং কনসিস্টেন্ট সিস্টেম নিরাপদভাবে দু’পাশেই স্বাধীন আপডেট গ্রহণ করতে পারে না। সঠিকতা রক্ষার জন্য সাধারণত:
ব্যবহারকারীর দৃষ্টিতে এটি দেখতে হতে পারে সার্ভিস আউট—তবু কিছু মেশিন চলছে।
প্রধান সুবিধা হল সহজ মনস্তত্ত্ব। অ্যাপ্লিকেশন কোড এমনভাবে লেখা যায় যেন এটি একক ডাটাবেসের সঙ্গে কথা বলছে—বহু প্রতিলিপি নিয়ে জটিলতা ভাবতে হয় না। এর ফলে কম এমন অদ্ভুত মুহুর্ত হবে যেমন:
অডিটিং, বিলিং ইত্যাদির জন্য পরিষ্কার মানসিক মডেল মেলে—যেখানে প্রথমবারেই সঠিক হওয়া জরুরি।
সামঞ্জস্যতার সত্যিকারের মূল্য আছে:
যদি আপনার পণ্য আংশিক আউটেজের সময় ব্যর্থ অনুরোধ সহ্য করতে না পারে, শক্তিশালী সামঞ্জস্যতা ব্যয়বহুল মনে হতে পারে—তবে সঠিকতার জন্য প্রয়োজনীয়।
উপলব্ধতা বেছে নেওয়ার মানে: সিস্টেম উত্তর দেয় এমন সরল প্রতিশ্রুতি—এবং তা এমনকি অবনতি ঘটলে ও অংশিক অবস্থা থাকলেও। বাস্তবে “উচ্চ উপলব্ধতা” মানে নয় “কখনও ভুল নেই”—এটি মানে অধিকাংশ অনুরোধ তবুও একটি উত্তর পায় নোড ব্যর্থ হলে ও নেটওয়ার্ক ক্ষতিগ্রস্ত হলে।
পার্টিশনের সময় প্রতিলিপি একে অপরের সঙ্গে কথ না বললে, উপলব্ধতানির্ভর সিস্টেম সাধারণত পৌঁছনীয় পাশে ট্র্যাফিক সার্ভ করে:
এটি অ্যাপ্লিকেশনকে চলমান রাখে, কিন্তু বিভিন্ন প্রতিলিপি সাময়িকভাবে বিভিন্ন সত্য গ্রহণ করতে পারে।
আপনি পাবেন ভাল আপটাইম: ব্যবহারকারীরা এখনই ব্রাউজ করতে, কার্টে আইটেম রাখতে, মন্তব্য পোস্ট করতে বা ইভেন্ট রেকর্ড করতে পারে এমনকি একটি রিজিয়ন বিচ্ছিন্ন থাকলেও।
মানুষিক অভিজ্ঞতা চাপের সময় মসৃণ থাকে—টাইমআউটের পরিবর্তে আপনার অ্যাপ বলে পারে “আপডেট সেভ হয়েছে” এবং পরে সিঙ্ক হবে। অনেক কনজিউমার ও অ্যানালিটিক্স ওয়ার্কলোডে এই ট্রেড-অফ গ্রহণযোগ্য।
মূল মূল্য হলো ডেটা স্টেল রিড হতে পারে। ব্যবহারকারী একটি প্রতিলিপিতে প্রোফাইল আপডেট করলে এবং পরের মূহুর্তে অন্য প্রতিলিপি থেকে পড়লে পুরোনো মান দেখতে পারে।
এছাড়া লেখার দ্বন্দ্ব এর ঝুঁকি থাকে: দুটি ব্যবহারকারী (বা একই ব্যবহারকারী দু’জায়গায়) পার্টিশনের ভিন্ন পাশে একই রেকর্ড আপডেট করলে, পার্টিশন নিরাময়ের পরে সিস্টেমকে বিচ্ছিন্ন ইতিহাস মিলিয়ে নিতে হবে। কোনো নিয়ম অনুসারে এক লেখাকে “জয়ী” করা হতে পারে, ক্ষেত্রভিত্তিক মার্জ করা হতে পারে, বা অ্যাপ-লেভেলে ম্যানুয়াল হস্তক্ষেপ লাগতে পারে।
উপলব্ধতা-কেন্দ্রিক ডিজাইন মানে সাময়িক অমিল গ্রহণ করা যাতে প্রোডাক্ট প্রতিক্রিয়াশীল থাকে—পরে সেই অমিল সনাক্ত ও মেরামত করার জন্য তিনিই ইনভেস্ট করে।
কোয়োরাম হল অনেক প্রতিলিপি ডাটাবেসে ব্যবহৃত একটি ব্যবহারিক ভোটিং কৌশল যা সামঞ্জস্যতা ও উপলব্ধতার মধ্যে ভারসাম্য আনে। একটি নির্দিষ্ট প্রতিলিপি বিশ্বাস করার বদলে, সিস্টেমটি যথেষ্ট সংখ্যক প্রতিলিপির সম্মতি চায়।
কোয়োরাম প্রায়শই তিনটি সংখ্যার মাধ্যমে বিবৃত হয়:
একটি সাধারণ অনুমান: যদি R + W > N, তবে প্রতিটি পড়া অন্তত একটি প্রতিলিপি থেকে সর্বশেষ সফল লেখার ওভারল্যাপ পায়—ফলত স্টেল পড়া কমা।
যদি N=3:
কিছু সিস্টেম আরও কঠিন হয় (W=3) যাতে সব প্রতিলিপি লাইনে থাকে—কিন্তু এতে কোনো প্রতিলিপি ধীর বা ডাউন হলে লেখায় ব্যর্থতার সম্ভাবনা বেড়ে যায়।
কোয়োরাম পার্টিশন সমস্যা মুছে না—এটি ঠিক করে কে অগ্রসর হতে পারবে। যদি নেটওয়ার্ক 2–1 এ ভাগ হয়ে যায়, সংখ্যাগরিষ্ঠ পক্ষটি R=2 ও W=2 পূরণ করতে পারে, আর বিচ্ছিন্ন একক প্রতিলিপি তা পারে না। এতে দ্বন্দ্বপূর্ণ আপডেট হ্রাস পায়, কিন্তু কিছু ক্লায়েন্ট এরর বা টাইমআউট পেতে পারে।
কোয়োরাম সাধারণত বেশি ল্যাটেন্সি (আরও নোডে যোগাযোগ), বেশি খরচ (নোড-পর-নোড ট্রাফিক), এবং জটিল ব্যর্থতার আচরণ (টাইমআউটগুলো অনুপলব্ধতার মতো দেখা) নিয়ে আসে। কিন্তু সুবিধা হল একটি সামঞ্জস্যপূর্ণ মধ্যম পথ: আপনি R ও W ডায়াল করে পড়া-তাজা হওয়া বা লেখার সফলতা বাড়াতে পারেন—আপনার কি বেশি জরুরি তার উপর ভিত্তি করে।
ইভেন্টুয়াল সামঞ্জস্যতা মানে প্রতিলিপিগুলো অল্প সময়ের জন্য আলাদা থাকতে পারে, যতক্ষণ না তারা পরে একই মানে মিলিত হয়।
একটি কফি শপ চেইনের উদাহরণ নিন: একটি দোকান "sold out" চিহ্ন দেয়, কিন্তু আপডেটটি কয়েক মিনিট পরে অন্য দোকানে পৌঁছায়। ঐ সময়ে আরেকটি দোকান এখনও "available" দেখিয়ে শেষটি বিক্রি করে দিতে পারে। সিস্টেম খারাপ নয়—আপডেটগুলো কেবল সিঙ্ক করছে।
ডেটা ছড়িয়ে পড়ার সময় ক্লায়েন্টরা এমন আচরণ লক্ষ্য করতে পারে:
ইভেন্টুয়াল সিস্টেমগুলো সাধারণত কিছু ব্যাকগ্রাউন্ড প্রক্রিয়া যোগ করে যাতে অসমঞ্জস্যতা উইন্ডো কমে:
এটি মানানসই যখন উপলব্ধতা বেশি প্রয়োজন এবং সাময়িক আপডেট-মিল মাতানযোগ্য:
যখন ডাটাবেস একাধিক প্রতিলিপিতে লেখাগুলো গ্রহণ করে, তখন দ্বন্দ্ব হতে পারে: একই আইটেমে বিভিন্ন সাইডে স্বাধীনভাবে হওয়া একাধিক আপডেট। উদাহরণ: একজন ব্যবহারকারী এক ডিভাইসে শিপিং ঠিকানা বদলে অন্য ডিভাইসে ফোন নম্বর পরিবর্তন করলে—and—যদি প্রতিটি পরিবর্তন আলাদা প্রতিলিপিতে ল্যান্ড করে পার্টিশনের সময়, সিস্টেমকে পুনরায় সংযুক্ত হলে চূড়ান্ত রেকর্ড কী হবে তা নির্ধারণ করতে হবে।
অনেকে লাস্ট-রাইট-উইন ব্যবহার করে: যে আপডেটটির টাইমস্ট্যাম্প নতুন, সেটিই জয়ী হয়ে অন্যগুলোকে ওভাররাইট করে।
এটি আকর্ষণীয় কারণ এটি সহজ ও দ্রুত। কিন্তু সমস্যাঃ এটি নীরবে ডেটা হারাতে পারে—যদি “নতুন” জয়ী হয়, পুরনো কিন্তু গুরুত্বপূর্ণ পরিবর্তনটি হারিয়ে যায়, এমনকি যদি দুইটি আপডেট আলাদা ফিল্ড স্পর্শ করে।
এছাড়া টাইমস্ট্যাম্পে ভরসা করলে মেশিন/ক্লায়েন্ট ক্লক স্কিউ-এর কারণে ভুল আপডেট জয়ী হতে পারে।
নিরাপদ দ্বন্দ্ব হ্যান্ডলিং সাধারণত কারণগত ইতিহাস ট্র্যাক করে।
কথ্যগতভাবে, ভার্সন ভেক্টর (বা এর সহজ রূপগুলি) প্রতিটি রেকর্ডে ছোট মেটাডেটা জোড়ে দেয় যা সংক্ষেপে বোঝায় “কোন প্রতিলিপি কোন আপডেটগুলো দেখেছে।” প্রতিলিপিগুলো বিনিময় করলে ডাটাবেস বুঝতে পারে একটি ভার্সন অন্যটার অন্তর্ভুক্ত কি না (কোনো দ্বন্দ্ব নেই) না কি তারা বিচ্ছিন্ন হয়েছে (দ্বন্দ্ব)।
কিছু সিস্টেম লজিকাল টাইমস্ট্যাম্প (Lamport clocks) বা হাইব্রিড লজিকাল ক্লক ব্যবহার করে যাতে ওয়াল-ক্লক টাইমে অতিরিক্ত নির্ভরশীলতা কমে।
দ্বন্দ্ব সনাক্ত হলে আপনি বিকল্প বেছে নিতে পারেন:
কোন পদ্ধতি ভাল তা নির্ভর করে “ঠিকভাবে” বলতে আপনার ডেটার জন্য কি অর্থ রয়েছে—কখনও কখনও একটি লেখা হারানো সমস্যা নয়; অন্য সময় সেটা ব্যবসায়িকভাবে গ্রহণযোগ্য নয়।
কনসিস্টেন্সি/উপলব্ধতার পন্থা নির্বাচন একটি দার্শনিক বিতর্ক নয়—এটি একটি প্রোডাক্ট সিদ্ধান্ত। শুরু করুন এই প্রশ্ন দিয়ে: এক মুহুর্তের জন্য ভুল হওয়ার খরচ কত, আর "পরে চেষ্টা করুন" বলার খরচ কত?
কিছু ডোমেইনে লেখার সময় একটি কর্তৃত্বপূর্ণ উত্তর থাকা আবশ্যক কারণ "প্রায় সঠিক" থাকলেই ভুল:
যদি সাময়িক মিল না থাকা কম প্রভাব ফেলে বা ফিরিয়ে আনা যায়, আপনি সাধারণত বেশি উপলব্ধতার দিকে ঝুঁকতে পারেন।
অনেক ইউএক্স সামান্য পুরনো পড়া সহ্য করতে পারে:
নির্দিষ্ট করে বলুন কতটা পুরনো ঠিক আছে: সেকেন্ড, মিনিট, নাকি ঘণ্টা। সেই সময় সীমা আপনার প্রতিলিপি ও কোয়োরাম সিদ্ধান্তগুলো চালিত করবে।
যখন প্রতিলিপি একমত হতে পারে না, আপনি সাধারণত তিনটি UX ফলাফলের মধ্যে একটিতে পৌঁছবেন:
প্রতিটি ফিচারের জন্য সবচেয়ে কম ক্ষতিকর অপশন বেছে নিন—গ্লোবালি নয়।
নিশ্চিত না হলে, সিস্টেমটি ভাগ করুন: সমালোচনামূলক রেকর্ডগুলোকে শক্তিশালী সামঞ্জস্য রাখুন, এবং উৎপন্ন ভিউ (ফিড, কেশ, অ্যানালিটিক্স) উপলব্ধতার জন্য অপটিমাইজ করুন।
একটি সমগ্র সিস্টেমে একক "কনসিস্টেন্সি সেটিং" বেছে নিতে হয় না। অনেক আধুনিক বিতরণকৃত ডাটাবেস অপারেশন-ভিত্তিক কনসিস্টেন্সি নির্বাচন করতে দেয়—আর স্মার্ট অ্যাপগুলো তা ব্যবহার করে ইউএক্স মসৃণ রাখে, ট্রেড-অফ অস্বীকার না করেই।
কনসিস্টেন্সিকে একটি কাঁটা মনে করুন যা আপনি ব্যবহারকারীর কাজ অনুযায়ী ঘুরিয়ে দেবেন:
এতে সবকিছুকে সর্বোচ্চ সামঞ্জস্যের খরচ দিতে হয় না, তবুও গুরুত্বপূর্ণ অপারেশনগুলো সুরক্ষিত থাকে।
একটি প্রচলিত প্যাটার্ন হল লিখায় শক্ত, পড়ায় দুর্বল:
কিছু ক্ষেত্রে উল্টোও কাজ করে: দ্রুত লেখা (কিউড/ইভেন্টুয়াল) এবং নিশ্চিতকরণের সময় শক্ত পড়া করা ("আমার অর্ডার প্লেস হয়েছে কি?")।
নেটওয়ার্ক অস্থির হলে ক্লায়েন্টরা রিট্রাই করে। রিট্রাইগুলোকে নিরাপদ রাখুন আইডেম্পোটেন্সি কী ব্যবহার করে যাতে একই key-তে "অর্ডার সাবমিট" দুবার চালালে দুইটি অর্ডার না হয়। প্রথম রেজাল্ট স্টোর করে একই কী দেখলে পুনরায় ব্যবহার করুন।
সার্ভিস-আমাজিং একাধিক ধাপের কাজের জন্য সাগা ব্যবহার করুন: প্রতিটি ধাপের একটি ক্ষতিপূরণ কার্যক্রম (রিফান্ড, রিজার্ভেশন মুক্তি, শিপিং বাতিল) থাকে। এটি সিস্টেমকে পুনরুদ্ধারযোগ্য রাখে এমনকি অংশিক দ্বন্দ্ব বা ব্যর্থতার সময়েও।
আপনি ট্রেড-অফ ম্যানেজ করতে পারবেন না যদি আপনি সেটি দেখতে না পান। প্রোডাকশন সমস্যা প্রায়ই "র্যান্ডম ব্যর্থতা" বলে মনে হয় যতক্ষণ না আপনি সঠিক মেট্রিক্স ও টেস্ট যোগ করেন।
শুরু করুন এমন কিছু মেট্রিক দিয়ে যা সরাসরি ব্যবহারকারীর প্রভাবের সাথে সম্পর্কিত:
যদি সম্ভব হয়, মেট্রিকগুলোকে কনসিস্টেন্সি মোড (কোয়োরাম বনাম লোকাল) ও রিজিয়ন/জোন দ্বারা ট্যাগ করুন যাতে আচরণ কোথায় ভিন্ন হচ্ছে দেখা যায়।
বিজ্ঞপ্তির জন্য অপেক্ষা করুন না—স্টেজিং-এ কৌশলগতভাবে কেআস রাস্তা চালান:
শুধু যাচাই করবেন না যে “সিস্টেম স্থিতিশীল আছে”—পরীক্ষা করুন কোন গ্যারান্টি বজায় থাকে: পড়াগুলো তাজা থাকে কি, লেখাগুলো ব্লক হয় না কি, ক্লায়েন্টরা স্পষ্ট এরর পায় কি না?
নিচের জন্য অ্যালার্ট যোগ করুন:
সবশেষে, আপনার সিস্টেম কাওয়ারেন্টি স্পষ্টভাবে ডকুমেন্ট করুন: স্বাভাবিক অবস্থায় ও পার্টিশনের সময় আপনি কী গ্যারান্টি দেবেন—এবং প্রোডাক্ট ও সাপোর্ট টিমকে শেখান ব্যবহারকারী কী দেখতে পাবে এবং কিভাবে প্রতিক্রিয়া জানাতে হবে।
যদি আপনি নতুন প্রোডাক্টে এই ট্রেড-অফগুলো যাচাই করছেন, ব্যর্থতা মোড, রিট্রাই আচরণ, এবং UI-তে “স্টেল” কেমন লাগে তা শিগগিরি ভ্যালিডেট করা সাহায্য করে।
একটি প্র্যাকটিক্যাল উপায় হল ওয়ার্কফ্লোর ছোট ভার্সন প্রোটোটাইপ করা (রাইট পাথ, রিড পাথ, রিট্রাই/আইডেম্পোটেন্সি, এবং একটি রিকনসিলিয়েশন জব) পূর্ণ আর্কিটেকচারে ঝাঁপ না দিয়ে। উদাহরণস্বরূপ, Koder.ai-এর মতো টুল দিয়ে টিমরা চ্যাট-চালিত ওয়েব অ্যাপ এবং ব্যাকএন্ড দ্রুত স্পিন আপ করে বিভিন্ন কনসিস্টেন্সি প্যাটার্ন (যেমন কঠোর লেখায় + শিথিল পড়া) পরীক্ষা করতে পারে—প্রোটোটাইপ ঠিকঠাক হলে কোড এক্সপোর্ট করে প্রোডাকশন উন্নয়ন জারি রাখা যায়।
একটি প্রতিলিপি-ভিত্তিক ডাটাবেসে একই ডেটা একাধিক মেশিনে থাকে। এটা স্থায়িত্ব এবং নিম্ন ল্যাটেন্সি বাড়ায়, কিন্তু সমন্বয়ের সমস্যা সৃষ্টি করে: নোডগুলো ধীরচল বা অনুপলব্ধ হতে পারে, বা নেটওয়ার্কের কারণে আলাদা হয়ে যেতে পারে—তাই সবসময় তারা একসাথে সর্বশেষ লেখার বিষয়ে একমত থাকতে পারে না।
সরল ভাষায়: একবার একটি লেখাটি সফলভাবে জমা হলে, পরের যে কোনো পড়াই (যে কোনো নোড থেকে) সেই একই মানটা ফিরিয়ে দেয়। বাস্তবে, এটি অর্জন করতে সিস্টেমগুলো প্রায়ই কিছু পড়া/লেখা বিলম্বিত করে বা প্রত্যাখ্যান করে যতক্ষণ না পর্যাপ্ত প্রতিলিপি বা লিডার আপডেট নিশ্চিত করে।
সরল ভাষায়: প্রতিটি অনুরোধ একটি নন-এরর উত্তর পায়, এমনকি কিছু নোড ডাউন বা যোগাযোগবিহীন থাকলেও। উত্তরটি হতে পারে একটু পুরাতন, আংশিক, বা স্থানীয় জ্ঞানভিত্তিক—তবুও সিস্টেম ব্যবহারকারীদের ব্লক না করে চালিয়ে যায়।
নেটওয়ার্ক পার্টিশন হল নোডগুলোর মধ্যে এমন একটি যোগাযোগবিচ্ছেদ যা তাদের এক অ্যাসেম্বলি হিসেবে কাজ করা থেকে বাধা দেয়। নোডগুলো হতে পারে সচল, কিন্তু বার্তা নির্ভরযোগ্যভাবে পার হতে পারে না—এটাই এমন একটি পরিস্থিতি যেখানে ডাটাবেসকে সিদ্ধান্ত নিতে হয়:
পার্টিশনের সময় দুই পাশে আলাদা ভাবে আপডেট গ্রহণ হতে পারে, ফলে দেখা যাবে:
এটি মানে “চিরকাল ধরে দুইটি বেছে নাও” নয়। এর অর্থ: যখনই পার্টিশন ঘটে, আপনি একই সময়ে কনসিস্টেন্সি এবং উপলব্ধতা—দুটোই নিশ্চিত করতে পারবেন না। পার্টিশন না থাকলে অনেক সিস্টেম প্রায়ই দুটো সঙ্গেই আচরণ করতে পারে, কিন্তু পার্টিশনের সময় আপনাকে কোনটি অগ্রাধিকার দেবেন তা বেছে নিতে হয়।
কোয়োরাম হলো প্রতিলিপিদের মধ্যে ভোটিং করে সামঞ্জস্যতা ও উপলব্ধতার মধ্যে সমতা আনার একটি ব্যবহারিক কৌশল।
একটি সাধারণ নিয়ম: R + W > N হলে প্রতিটি রিড অন্তত একটি আপডেটপ্রাপ্ত প্রতিলিপির সঙ্গে ওভারল্যাপ করে, ফলে স্টেল রিডের সম্ভাবনা কমে। কোয়োরাম পার্টিশন সমস্যা মোচন করে না—এটি কেবল নির্ধারণ করে কে এগিয়ে যেতে পারবে (যেমন সংখ্যাগরিষ্ঠ অংশ)।
ইভেন্টুয়াল সামঞ্জস্যতা মানে প্রতিলিপিগুলো সাময়িকভাবে আলাদা থাকতে পারে, কিন্তু পরে তারা একত্র হয়ে একই মানে পৌঁছে যায়। সাধারণ অস্বাভাবিকতাগুলো:
হ্রাস করার জন্য ব্যবহৃত কৌশলগুলোর মধ্যে আছে , , এবং নিয়মিত (সিঙ্ক) কাজ।
পার্টিশন নিরাময়ের পরে দ্বন্দ্ব তখন ঘটে যখন ভিন্ন প্রতিলিপি আলাদা আপডেট গ্রহণ করেছে। সমাধান কৌশলগুলো:
ঠিক কৌশল নির্ভর করে আপনার ডেটার জন্য কি “সঠিক” হিসেবে ধরা হবে তার উপর।
ব্যবসায়িক ঝুঁকি ও ব্যবহারকারীর সহনশীলতা অনুযায়ী সিদ্ধান্ত নিন:
প্রায়ই ব্যবহার করা প্যাটার্ন: অপারেশন-নির্ভর কনসিস্টেন্সি লেভেল (মোটা মাপের মূল রেকর্ডগুলোকে শক্ত রেখে উপরের ভিউগুলোকে নমনীয় রাখা)।