প্লাগ টেনে বের করে দিন। কিলসুইচ চাপুন। এই সহজাত প্রবৃত্তিগুলো তখনই কাজ করে যখন আপনি একটি মাত্র মেশিনের পাশে দাঁড়িয়ে থাকেন। কিন্তু আপনার AI সিস্টেম যখন তিনটি অ্যাভেইল্যাবিলিটি জোনে ছড়িয়ে থাকা পঞ্চাশটি নোড জুড়ে বিস্তৃত থাকে, তখন এগুলো ব্যর্থ হয়। বেশিরভাগ ইঞ্জিনিয়ারিং টিম এটি কঠিন অভিজ্ঞতার মাধ্যমে শেখে। তারা একটি কেন্দ্রীয় ডাটাবেস আপডেট করে, একটি বুলিয়ান মান true থেকে false করে দেয় এবং ধরে নেয় যে সিস্টেমটি বন্ধ হয়ে গেছে। কিন্তু তা হয় না। ডাটাবেসটি পরিষ্কার দেখায়, কিন্তু সার্ভিসটি তখনও চলছে।
একটি মাত্র সুইচের বিভ্রম
এমন একটি কন্ট্রোলারের কথা ভাবুন যা এপক ১২-তে একটি রিভোকেশন (বাতিলকরণ) রেকর্ড করে। এটি পরিবর্তনটি একটি পারসিস্টেন্ট স্টোরে লিখে রাখে এবং স্বস্তির নিঃশ্বাস ফেলে। ইতিমধ্যে, ওয়ার্কার B এপক ১১-এর একটি ক্যাশড গ্র্যান্টের ওপর ভিত্তি করে চলছে। ওয়ার্কারটি সেই তথ্যটি কখনোই পায়নি। ত্রিশ সেকেন্ড পরে, এটি একটি মডেল ইনফারেন্স জব শুরু করে, একটি GPU ক্লাস্টার চালু করে অথবা একটি এক্সটার্নাল API কল করে। অডিট লগ বলছে অ্যাক্সেস বাতিল করা হয়েছে, কিন্তু কাজটি তবুও সম্পন্ন হয়ে গেল।
এটি হলো পারসিস্টেন্স এবং প্রোপাগেশনের মধ্যকার ব্যবধান। একটি ডাটাবেস রাইট মানেই সিস্টেমের স্টেট নয়। এটি একটি টেবিলের মাত্র একটি রো, এবং আপনার সিস্টেমের অনেক অ্যাক্টর ঠিক যখন প্রয়োজন তখন সেই টেবিলটি পোল করে না। আপনি যদি একটি জরুরি স্টপকে লাইট সুইচের মতো বিবেচনা করেন, তবে আপনি দেখতে পাবেন যে ঘরের কিছু কোণায় অন্ধকার কখনোই পৌঁছায় না।
ডিস্ট্রিবিউটেড সিস্টেমের কঠিন বাস্তবতা
আপনাকে ব্যর্থতার কথা মাথায় রেখে ডিজাইন করতে হবে। মাঝে মাঝে ব্যর্থতার কথা নয়; বরং ক্রমাগত, বিশৃঙ্খল এবং স্বতন্ত্র ব্যর্থতার কথা মাথায় রাখতে হবে। কাজের মাঝপথে ওয়ার্কাররা রিবুট হয়। কিউ কনজিউমাররা কয়েক মিনিট পিছিয়ে থাকে। অথরাইজেশন সার্ভিসগুলো পুরনো বা স্টেল (stale) ডেটা প্রদান করে কারণ একটি রেপ্লিকা আটকে আছে। মেসেজ ডুপ্লিকেট হয়। মেসেজ হারিয়ে যায়। মেসেজগুলো ভুল ক্রমে আসে। আপনার NTP ডেমোন সময়ের ব্যবধান তৈরি করে এবং হঠাৎ একটি নোড মনে করে যে এটি অন্যদের চেয়ে দশ সেকেন্ড পিছিয়ে আছে। ঘড়িতে ত্রুটি থাকে এবং আপনি বিভিন্ন সীমানার মধ্যে ইভেন্টগুলো সাজানোর জন্য ওয়াল টাইম (wall time)-এর ওপর ভরসা করতে পারেন না।
আপনার জরুরি প্রোটোকল যদি নির্ভরযোগ্য নেটওয়ার্ক, ক্রমানুসারে মেসেজ ডেলিভারি বা সিনক্রোনাইজড ঘড়ির ওপর নির্ভর করে, তবে আপনার কাছে কোনো প্রোটোকল নেই; বরং আপনার কাছে একটি ইচ্ছা বা আকাঙ্ক্ষা আছে। ওয়ার্কার, কিউ কনজিউমার এবং অথরাইজেশন সার্ভিসগুলো স্বতন্ত্রভাবে ব্যর্থ হয়। আপনার অবকাঠামো যখন সক্রিয়ভাবে প্রতিকূল মনে হবে, তখনও আপনার সুরক্ষা নিয়মগুলোকে অটুট থাকতে হবে।
পাঁচটি নিয়ম যা প্রকৃতপক্ষে কাজ করে
নিরাপত্তা আসে সেই ইনভ্যারিয়েন্টস (অপরিবর্তনীয় বৈশিষ্ট্য) থেকে যা বিশৃঙ্খলার মধ্যেও টিকে থাকে। এখানে সেই নিয়মগুলো দেওয়া হলো যা একটি রিভোকেশনকে কাল্পনিক হতে দেয় না।
কোনো অ্যাকশনই রিভোকেশন এপকের চেয়ে কম গ্র্যান্ট এপক নিয়ে শুরু হবে না।
এটি আপনার মূল গার্ডরেল। প্রতিটি পারমিশন গ্র্যান্ট একটি এপক নম্বর বহন করে। প্রতিটি রিভোকেশন একটি নতুন নম্বর বহন করে। কোনো ওয়ার্কার কাজ করার আগে, এটি নম্বরগুলো তুলনা করে। যদি ওয়ার্কারের গ্র্যান্টটি তার দেখা সর্বশেষ রিভোকেশনের চেয়ে পুরনো হয়, তবে ওয়ার্কারটি কাজ বন্ধ করে দেয়। এপক আপনাকে একটি লজিক্যাল ক্লক প্রদান করে যা সিস্টেম ক্লকের ওপর নির্ভর করে না। একটি ওয়ার্কার যদি এপক ১১ ধারণ করে, তবে এপক ১২ মূল কর্তৃত্ব বাতিল করে ফেলেছে তা জানার সাথে সাথে তাকে কাজ শুরু করতে অস্বীকার করতে হবে।
ক্যাশড গ্র্যান্টগুলো একটি নির্দিষ্ট সময়ের মধ্যে মেয়াদোত্তীর্ণ হবে।
একটি পারমিশন কখনোই মেমরিতে চিরকাল বেঁচে থাকতে পারে না। একটি নির্দিষ্ট সময়ের ব্যবধানের পর ওয়ার্কারদের তাদের অধিকার পুনরায় যাচাই করতে হবে বা ত্যাগ করতে হবে। এটি ছাড়া, একটি নোড যা অফলাইনে চলে গেছে, সেটি কয়েক দিন বা সপ্তাহ পরে জেগে উঠে একটি পুরনো বা অকেজো গ্র্যান্ট ব্যবহার করে কাজ চালিয়ে যেতে পারে। একটি লিজ (lease) সেট করুন। এটি কঠোরভাবে প্রয়োগ করুন। সময় তখন আপনার স্বয়ংক্রিয় ক্লিনার হিসেবে কাজ করবে।
সিস্টেম রিস্টার্ট কোনো সংরক্ষিত এপককে কমাতে পারে না।
পারসিস্টেন্স গুরুত্বপূর্ণ। যদি একটি কন্ট্রোলার ক্র্যাশ করে এবং রিস্টার্ট হয়, তবে এটিকে তার ইস্যু করা সর্বোচ্চ এপকটি পুনরুদ্ধার করতে হবে। একটি পুরনো এপকে ফিরে গেলে বাতিল করা পারমিশনগুলো আবার জীবিত হয়ে উঠবে, যেন জরুরি স্টপটি কখনোই ঘটেনি। এপকটি ব্রডকাস্ট করার আগে এটি স্থায়ীভাবে সংরক্ষণ করুন। একটি রাইট-অ্যাহেড লগ, একটি কনফার্মড fsync, অথবা একটি রেপ্লিকেটেড কনসেনসাস গ্রুপ ব্যবহার করুন। ইতিহাস কেবল সামনের দিকেই এগিয়ে যায়।
ডুপ্লিকেট রিভ
