রাফ্ট ডিস্ট্রিবিউটেড কনসেনসাস অ্যালগরিদম, এর মূল নীতি, অপারেশনাল পর্যায়, ব্যবহারিক বাস্তবায়ন এবং বিশ্বব্যাপী মাপযোগ্য সিস্টেম তৈরির জন্য এর প্রয়োগ নিয়ে আলোচনা করুন।
ডিস্ট্রিবিউটেড কনসেনসাস আয়ত্ত করা: গ্লোবাল সিস্টেমের জন্য রাফ্ট অ্যালগরিদম বাস্তবায়নের একটি গভীর বিশ্লেষণ
আমাদের ক্রমবর্ধমান আন্তঃসংযুক্ত বিশ্বে, ডিস্ট্রিবিউটেড সিস্টেমগুলি প্রায় প্রতিটি ডিজিটাল পরিষেবার মেরুদণ্ড, ই-কমার্স প্ল্যাটফর্ম এবং আর্থিক প্রতিষ্ঠান থেকে শুরু করে ক্লাউড কম্পিউটিং পরিকাঠামো এবং রিয়েল-টাইম যোগাযোগ সরঞ্জাম পর্যন্ত। এই সিস্টেমগুলি একাধিক মেশিনে ওয়ার্কলোড এবং ডেটা বিতরণ করে তুলনাহীন স্কেলেবিলিটি, প্রাপ্যতা এবং স্থিতিস্থাপকতা সরবরাহ করে। তবে, এই শক্তির সাথে একটি উল্লেখযোগ্য চ্যালেঞ্জ আসে: নেটওয়ার্ক বিলম্ব, নোড ব্যর্থতা এবং সমবর্তী ক্রিয়াকলাপের মুখেও সিস্টেমের অবস্থা সম্পর্কে সমস্ত উপাদান সম্মত কিনা তা নিশ্চিত করা। এই মৌলিক সমস্যাটি ডিস্ট্রিবিউটেড কনসেনসাস নামে পরিচিত।
অ্যাসিঙ্ক্রোনাস, ত্রুটি-প্রবণ ডিস্ট্রিবিউটেড পরিবেশে কনসেনসাস অর্জন করা কুখ্যাতভাবে জটিল। কয়েক দশক ধরে, প্যাক্সোস এই চ্যালেঞ্জ মোকাবেলার জন্য প্রভাবশালী অ্যালগরিদম ছিল, এর তাত্ত্বিক সার্থকতা জন্য সম্মানিত কিন্তু প্রায়শই এর জটিলতা এবং বাস্তবায়নের জন্য সমালোচিত। তারপরে রাফ্ট আসে, একটি অ্যালগরিদম যা একটি প্রাথমিক লক্ষ্য নিয়ে ডিজাইন করা হয়েছে: বোধগম্যতা। রাফ্ট ফল্ট টলারেন্স এবং পারফরম্যান্সের দিক থেকে প্যাক্সোসের সমতুল্য হওয়ার লক্ষ্য রাখে তবে এমন একটি উপায়ে কাঠামোবদ্ধ যা ডেভেলপারদের জন্য বোঝা এবং তৈরি করার জন্য অনেক সহজ।
এই ব্যাপক গাইডটি রাফ্ট অ্যালগরিদম নিয়ে গভীরভাবে আলোচনা করে, এর মৌলিক নীতি, অপারেশনাল প্রক্রিয়া, ব্যবহারিক বাস্তবায়ন বিবেচনা এবং শক্তিশালী, বিশ্বব্যাপী বিতরণ করা অ্যাপ্লিকেশন তৈরির ক্ষেত্রে এর গুরুত্বপূর্ণ ভূমিকা অন্বেষণ করে। আপনি একজন অভিজ্ঞ স্থপতি, একজন ডিস্ট্রিবিউটেড সিস্টেম প্রকৌশলী, বা অত্যন্ত উপলব্ধ পরিষেবা তৈরির জন্য উচ্চাকাঙ্ক্ষী একজন ডেভেলপার হোন না কেন, রাফ্ট বোঝা আধুনিক কম্পিউটিংয়ের জটিলতাগুলি আয়ত্ত করার দিকে একটি অপরিহার্য পদক্ষেপ।
আধুনিক আর্কিটেকচারে ডিস্ট্রিবিউটেড কনসেনসাসের অপরিহার্য প্রয়োজন
প্রতি সেকেন্ডে লক্ষ লক্ষ লেনদেন প্রক্রিয়াকরণকারী একটি বিশ্বব্যাপী ই-কমার্স প্ল্যাটফর্মের কল্পনা করুন। গ্রাহকের ডেটা, ইনভেন্টরির স্তর, অর্ডারের স্থিতি—সমস্ত কিছু মহাদেশ জুড়ে বিস্তৃত অসংখ্য ডেটা সেন্টারে সামঞ্জস্যপূর্ণ থাকতে হবে। একটি ব্যাংকিং সিস্টেমের খাতা, একাধিক সার্ভারে ছড়িয়ে ছিটিয়ে থাকা, অ্যাকাউন্ট ব্যালেন্সের উপর এক মুহূর্তের মতবিরোধের সামর্থ্য রাখতে পারে না। এই পরিস্থিতিগুলি ডিস্ট্রিবিউটেড কনসেনসাসের সমালোচনামূলক গুরুত্ব তুলে ধরে।
ডিস্ট্রিবিউটেড সিস্টেমের সহজাত চ্যালেঞ্জ
ডিস্ট্রিবিউটেড সিস্টেম, তাদের প্রকৃতিগতভাবে, মনোলিথিক অ্যাপ্লিকেশনগুলিতে অনুপস্থিত চ্যালেঞ্জের একটি ভিড় প্রবর্তন করে। এই চ্যালেঞ্জগুলি বোঝা রাফ্টের মতো অ্যালগরিদমের কমনীয়তা এবং প্রয়োজনীয়তা উপলব্ধি করার জন্য গুরুত্বপূর্ণ:
- আংশিক ব্যর্থতা: একটি একক সার্ভারের বিপরীতে যা হয় কাজ করে বা সম্পূর্ণরূপে ব্যর্থ হয়, একটি ডিস্ট্রিবিউটেড সিস্টেমে কিছু নোড ব্যর্থ হতে পারে যখন অন্যরা কাজ চালিয়ে যায়। একটি সার্ভার ক্র্যাশ করতে পারে, এর নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হতে পারে, বা এর ডিস্ক দুর্নীতিগ্রস্ত হতে পারে, এই সমস্ত কিছুই ক্লাস্টারের বাকি অংশ কার্যকরী থাকা অবস্থায়। সিস্টেমকে এই আংশিক ব্যর্থতা সত্ত্বেও সঠিকভাবে কাজ চালিয়ে যেতে হবে।
- নেটওয়ার্ক পার্টিশন: নোডগুলি সংযোগকারী নেটওয়ার্ক সবসময় নির্ভরযোগ্য নয়। নোডের সাবসেটের মধ্যে যোগাযোগ বিচ্ছিন্ন হলে একটি নেটওয়ার্ক পার্টিশন ঘটে, যা নির্দিষ্ট নোডগুলি ব্যর্থ হয়েছে বলে মনে করে, এমনকি যদি তারা এখনও চলছে। এই "স্প্লিট-ব্রেন" পরিস্থিতিগুলির সমাধান, যেখানে সিস্টেমের বিভিন্ন অংশ পুরানো বা অসামঞ্জস্যপূর্ণ তথ্যের উপর ভিত্তি করে স্বাধীনভাবে কাজ করে, একটি মূল কনসেনসাস সমস্যা।
- অ্যাসিঙ্ক্রোনাস যোগাযোগ: নোডগুলির মধ্যে বার্তাগুলি বিলম্বিত, পুনরায় অর্ডার করা বা সম্পূর্ণভাবে হারিয়ে যেতে পারে। কোনও গ্লোবাল ক্লক নেই বা বার্তা বিতরণের সময়ের কোনও গ্যারান্টি নেই, ইভেন্টগুলির একটি সামঞ্জস্যপূর্ণ ক্রম বা একটি সুনির্দিষ্ট সিস্টেম অবস্থা স্থাপন করা কঠিন করে তোলে।
- সমকালীতা: একাধিক নোড একই ডেটার অংশ আপডেট করার বা একই সাথে ক্রিয়া শুরু করার চেষ্টা করতে পারে। এই ক্রিয়াকলাপগুলি সমন্বয় করার জন্য একটি প্রক্রিয়া ছাড়া, দ্বন্দ্ব এবং অসামঞ্জস্যতা অনিবার্য।
- অননুমেয় লেটেন্সি: বিশেষ করে বিশ্বব্যাপী বিতরণ করা স্থাপনায়, নেটওয়ার্ক লেটেন্সি উল্লেখযোগ্যভাবে পরিবর্তিত হতে পারে। এক অঞ্চলে দ্রুত অপারেশনগুলি অন্য অঞ্চলে ধীর হতে পারে, সিদ্ধান্ত গ্রহণ প্রক্রিয়া এবং সমন্বয়কে প্রভাবিত করে।
কেন কনসেনসাস নির্ভরযোগ্যতার ভিত্তি
কনসেনসাস অ্যালগরিদম এই চ্যালেঞ্জগুলি সমাধানের জন্য একটি মৌলিক বিল্ডিং ব্লক সরবরাহ করে। তারা অবিশ্বাস্য উপাদানগুলির একটি সংগ্রহকে সম্মিলিতভাবে একটি একক, অত্যন্ত নির্ভরযোগ্য এবং সুসংগত ইউনিট হিসাবে কাজ করতে সক্ষম করে। নির্দিষ্টভাবে, কনসেনসাস অর্জনে সহায়তা করে:
- স্টেট মেশিন প্রতিলিপি (SMR): অনেক ফল্ট-টলারেন্ট ডিস্ট্রিবিউটেড সিস্টেমের পিছনের মূল ধারণা। যদি সমস্ত নোড ক্রিয়াকলাপের ক্রমে সম্মত হয়, এবং যদি প্রতিটি নোড একই প্রাথমিক অবস্থা থেকে শুরু হয় এবং সেই ক্রিয়াকলাপগুলি একই ক্রমে সম্পাদন করে, তবে সমস্ত নোড একই চূড়ান্ত অবস্থায় পৌঁছাবে। কনসেনসাস হল ক্রিয়াকলাপের এই গ্লোবাল ক্রমে একমত হওয়ার প্রক্রিয়া।
- উচ্চ প্রাপ্যতা: সিস্টেমকে minority নোড ব্যর্থ হলেও কাজ চালিয়ে যাওয়ার অনুমতি দিয়ে, কনসেনসাস নিশ্চিত করে যে পরিষেবাগুলি উপলব্ধ এবং কার্যকরী থাকে, ডাউনটাইম কমিয়ে আনে।
- ডেটা সামঞ্জস্য: এটি গ্যারান্টি দেয় যে ডেটার সমস্ত প্রতিলিপি সিঙ্ক্রোনাইজড থাকে, conflicting আপডেটগুলি প্রতিরোধ করে এবং ক্লায়েন্টরা সর্বদা সবচেয়ে আপ-টু-ডেট এবং সঠিক তথ্য পড়ে তা নিশ্চিত করে।
- ফল্ট টলারেন্স: সিস্টেমটি নির্দিষ্ট সংখ্যক নির্বিচারে নোড ব্যর্থতা (সাধারণত ক্র্যাশ ব্যর্থতা) সহ্য করতে পারে এবং মানব হস্তক্ষেপ ছাড়াই অগ্রগতি চালিয়ে যেতে পারে।
রাফ্ট পরিচিতি: কনসেনসাসের জন্য একটি বোধগম্য পদ্ধতি
রাফ্ট একটি স্পষ্ট উদ্দেশ্য নিয়ে একাডেমিক জগৎ থেকে উদ্ভূত হয়েছে: ডিস্ট্রিবিউটেড কনসেনসাসকে অ্যাক্সেসযোগ্য করে তোলা। এর লেখকরা, দিয়েগো ওনগারো এবং জন অস্টারহাউট, স্পষ্টভাবে রাফ্টকে বোধগম্যতার জন্য ডিজাইন করেছেন, যা কনসেনসাস অ্যালগরিদমগুলির ব্যাপক গ্রহণ এবং সঠিক বাস্তবায়নের জন্য সক্ষম করে।
রাফ্টের মূল ডিজাইন দর্শন: প্রথমে বোধগম্যতা
রাফ্ট কনসেনসাসের জটিল সমস্যাটিকে কয়েকটি তুলনামূলকভাবে স্বাধীন উপ-সমস্যায় ভেঙে দেয়, প্রতিটির নিজস্ব নির্দিষ্ট নিয়ম এবং আচরণ রয়েছে। এই মডুলারিটি বোঝার ক্ষেত্রে উল্লেখযোগ্যভাবে সহায়তা করে। মূল ডিজাইন নীতিগুলি অন্তর্ভুক্ত:
- লিডার-কেন্দ্রিক পদ্ধতি: কিছু অন্যান্য কনসেনসাস অ্যালগরিদমের বিপরীতে যেখানে সমস্ত নোড সিদ্ধান্ত গ্রহণে সমানভাবে অংশ নেয়, রাফ্ট একটি একক লিডারকে মনোনীত করে। লিডার প্রতিলিপি করা লগ পরিচালনা এবং সমস্ত ক্লায়েন্ট অনুরোধ সমন্বয় করার জন্য দায়ী। এটি লগ ব্যবস্থাপনা সহজ করে এবং নোডগুলির মধ্যে মিথস্ক্রিয়া জটিলতা হ্রাস করে।
- শক্তিশালী লিডার: লিডার নতুন লগ এন্ট্রি প্রস্তাব করার এবং সেগুলি কখন প্রতিশ্রুতিবদ্ধ হয় তা নির্ধারণ করার চূড়ান্ত কর্তৃপক্ষ। অনুসারীরা নিষ্ক্রিয়ভাবে লিডারের লগ প্রতিলিপি করে এবং লিডারের অনুরোধগুলিতে সাড়া দেয়।
- নির্ধারক নির্বাচন: রাফ্ট একটি নির্দিষ্ট নির্বাচন মেয়াদে সাধারণত কেবল একটি প্রার্থী লিডার হিসাবে আবির্ভূত হয় তা নিশ্চিত করার জন্য একটি র্যান্ডমাইজড নির্বাচন টাইমআউট ব্যবহার করে।
- লগ সামঞ্জস্য: রাফ্ট তার প্রতিলিপি করা লগের উপর শক্তিশালী সামঞ্জস্য বৈশিষ্ট্য প্রয়োগ করে, নিশ্চিত করে যে প্রতিশ্রুতিবদ্ধ এন্ট্রিগুলি কখনও রোল ব্যাক করা হয় না এবং সমস্ত প্রতিশ্রুতিবদ্ধ এন্ট্রি অবশেষে সমস্ত উপলব্ধ নোডে উপস্থিত হয়।
প্যাক্সোসের সাথে একটি সংক্ষিপ্ত তুলনা
রাফ্টের আগে, প্যাক্সোস ডিস্ট্রিবিউটেড কনসেনসাসের জন্য ডি ফ্যাক্টো মান ছিল। শক্তিশালী হলেও, প্যাক্সোস কুখ্যাতভাবে বোঝা এবং সঠিকভাবে বাস্তবায়ন করা কঠিন। এর নকশা, যা ভূমিকা (প্রস্তাবক, গ্রহীতা, শিক্ষার্থী) পৃথক করে এবং একাধিক লিডারকে সমবর্তীভাবে বিদ্যমান থাকতে দেয় (যদিও শুধুমাত্র একজন একটি মান প্রতিশ্রুতিবদ্ধ করতে পারে), জটিল মিথস্ক্রিয়া এবং প্রান্ত কেসগুলির দিকে নিয়ে যেতে পারে।
বিপরীতে, রাফ্ট স্টেট স্পেসকে সহজ করে। এটি একটি শক্তিশালী লিডার মডেল প্রয়োগ করে, যেখানে লিডার সমস্ত লগ পরিবর্তনের জন্য দায়ী। এটি ভূমিকা (লিডার, ফলোয়ার, প্রার্থী) এবং তাদের মধ্যে স্থানান্তরকে স্পষ্টভাবে সংজ্ঞায়িত করে। এই কাঠামোটি রাফ্টের আচরণকে আরও স্বজ্ঞাত এবং যুক্তিযুক্ত করে তোলে, যার ফলে কম বাস্তবায়ন বাগ এবং দ্রুত বিকাশের চক্র হয়। প্যাক্সোসের সাথে প্রাথমিকভাবে সংগ্রাম করা অনেক বাস্তব-বিশ্বের সিস্টেম রাফ্ট গ্রহণ করে সাফল্য খুঁজে পেয়েছে।
রাফ্টে তিনটি মৌলিক ভূমিকা
যেকোন সময়, একটি রাফ্ট ক্লাস্টারের প্রতিটি সার্ভার তিনটি অবস্থার একটিতে থাকে: লিডার, ফলোয়ার, বা প্রার্থী। এই ভূমিকাগুলি একচেটিয়া এবং গতিশীল, সার্ভারগুলি নির্দিষ্ট নিয়ম এবং ইভেন্টগুলির উপর ভিত্তি করে তাদের মধ্যে স্থানান্তরিত হয়।
১. ফলোয়ার
- নিষ্ক্রিয় ভূমিকা: ফলোয়াররা রাফ্টের সবচেয়ে নিষ্ক্রিয় অবস্থা। তারা কেবল লিডার এবং প্রার্থীদের কাছ থেকে আসা অনুরোধগুলিতে সাড়া দেয়।
-
হার্টবিট প্রাপ্তি: একটি ফলোয়ার নিয়মিত বিরতিতে লিডার থেকে হার্টবিট (খালি AppendEntries RPCs) পাওয়ার আশা করে। যদি কোনও ফলোয়ার একটি নির্দিষ্ট
election timeoutসময়ের মধ্যে হার্টবিট বা AppendEntries RPC না পায়, তবে এটি ধরে নেয় যে লিডার ব্যর্থ হয়েছে এবং প্রার্থী অবস্থায় স্থানান্তরিত হয়। - ভোটদান: নির্বাচনের সময়, একটি ফলোয়ার প্রতি মেয়াদে সর্বাধিক একজন প্রার্থীকে ভোট দেবে।
- লগ প্রতিলিপি: ফলোয়াররা লিডার দ্বারা নির্দেশিত হিসাবে তাদের স্থানীয় লগে লগ এন্ট্রি যুক্ত করে।
২. প্রার্থী
- নির্বাচন শুরু করা: যখন কোনও ফলোয়ার সময়সীমা অতিক্রম করে (লিডার থেকে শুনতে পায় না), তখন এটি নতুন নির্বাচন শুরু করার জন্য প্রার্থী অবস্থায় স্থানান্তরিত হয়।
-
স্ব-ভোটদান: একজন প্রার্থী তার
current termবৃদ্ধি করে, নিজেকে ভোট দেয় এবং ক্লাস্টারের অন্যান্য সমস্ত সার্ভারেRequestVoteRPC পাঠায়। - নির্বাচনে জয়ী হওয়া: যদি একজন প্রার্থী একই মেয়াদের জন্য ক্লাস্টারের সার্ভারগুলির একটি সংখ্যাগরিষ্ঠের কাছ থেকে ভোট পায়, তবে এটি লিডার অবস্থায় স্থানান্তরিত হয়।
- পদত্যাগ: যদি কোনও প্রার্থী উচ্চতর মেয়াদ সহ অন্য সার্ভার আবিষ্কার করে, বা যদি এটি কোনও বৈধ লিডার থেকে AppendEntries RPC পায়, তবে এটি একটি ফলোয়ার অবস্থায় ফিরে আসে।
৩. লিডার
- একমাত্র কর্তৃপক্ষ: একটি নির্দিষ্ট মেয়াদের জন্য একটি রাফ্ট ক্লাস্টারে এক সময়ে কেবল একজন লিডার থাকে। লিডার সমস্ত ক্লায়েন্ট মিথস্ক্রিয়া, লগ প্রতিলিপি এবং সামঞ্জস্যতা নিশ্চিত করার জন্য দায়ী।
-
হার্টবিট পাঠানো: লিডার তার কর্তৃত্ব বজায় রাখতে এবং নতুন নির্বাচন প্রতিরোধ করতে সমস্ত ফলোয়ারদের কাছে নিয়মিত
AppendEntriesRPCs (হার্টবিট) পাঠায়। - লগ ব্যবস্থাপনা: লিডার ক্লায়েন্ট অনুরোধগুলি গ্রহণ করে, তার স্থানীয় লগে নতুন লগ এন্ট্রি যুক্ত করে এবং তারপরে এই এন্ট্রিগুলি ফলোয়ারদের কাছে প্রতিলিপি করে।
- প্রতিশ্রুতি: লিডার সিদ্ধান্ত নেয় কখন একটি এন্ট্রি সংখ্যাগরিষ্ঠ সার্ভারে নিরাপদে প্রতিলিপি করা হয় এবং স্টেট মেশিনে প্রতিশ্রুতিবদ্ধ করা যায়।
-
পদত্যাগ: যদি লিডার উচ্চতর
termসহ কোনও সার্ভার আবিষ্কার করে, তবে এটি অবিলম্বে পদত্যাগ করে এবং একটি ফলোয়ার হিসাবে ফিরে আসে। এটি নিশ্চিত করে যে সিস্টেম সর্বদা সর্বোচ্চ পরিচিত মেয়াদে অগ্রগতি লাভ করে।
রাফ্টের অপারেশনাল পর্যায়: একটি বিস্তারিত ওয়াকথ্রু
রাফ্ট লিডার নির্বাচন এবং লগ প্রতিলিপির একটি অবিচ্ছিন্ন চক্রের মাধ্যমে কাজ করে। এই দুটি প্রাথমিক প্রক্রিয়া, গুরুত্বপূর্ণ সুরক্ষা বৈশিষ্ট্যগুলির সাথে, ক্লাস্টারটি সামঞ্জস্য এবং ফল্ট টলারেন্স বজায় রাখে তা নিশ্চিত করে।
১. লিডার নির্বাচন
লিডার নির্বাচন প্রক্রিয়াটি রাফ্টের অপারেশনের জন্য মৌলিক, নিশ্চিত করে যে ক্লাস্টারের সর্বদা একটি একক, কর্তৃত্বপূর্ণ নোড থাকে যা ক্রিয়াগুলিকে সমন্বয় করে।
-
নির্বাচন টাইমআউট: প্রতিটি ফলোয়ার একটি র্যান্ডমাইজড
election timeout(সাধারণত ১৫০-৩০০ms) বজায় রাখে। যদি কোনও ফলোয়ার বর্তমান লিডার থেকে এই টাইমআউট সময়ের মধ্যে কোনও যোগাযোগ (হার্টবিট বা AppendEntries RPC) না পায়, তবে এটি ধরে নেয় যে লিডার ব্যর্থ হয়েছে বা একটি নেটওয়ার্ক পার্টিশন ঘটেছে। -
প্রার্থী অবস্থায় স্থানান্তর: টাইমআউটের পর, ফলোয়ার
Candidateঅবস্থায় স্থানান্তরিত হয়। এটি তারcurrent termবৃদ্ধি করে, নিজেকে ভোট দেয় এবং তার নির্বাচন টাইমার রিসেট করে। -
RequestVote RPC: প্রার্থী তখন ক্লাস্টারের সমস্ত অন্যান্য সার্ভারে
RequestVoteRPC পাঠায়। এই RPC-তে প্রার্থীরcurrent term, তারcandidateId, এবং তারlast log indexএবংlast log term(সুরক্ষার জন্য এটি কেন গুরুত্বপূর্ণ তা পরে আরও বিস্তারিতভাবে আলোচনা করা হবে) সম্পর্কিত তথ্য অন্তর্ভুক্ত থাকে। -
ভোটদানের নিয়ম: একটি সার্ভার একটি প্রার্থীকে ভোট দেবে যদি:
-
এর
current termপ্রার্থীর মেয়াদের চেয়ে কম বা সমান হয়। - এটি এখনও বর্তমান মেয়াদে অন্য কোনও প্রার্থীর জন্য ভোট দেয়নি।
-
প্রার্থীর লগ তার নিজের লগের মতোই আপ-টু-ডেট। এটি
last log termতুলনা করে নির্ধারণ করা হয়, তারপরlast log indexযদি মেয়াদ একই হয়। একজন প্রার্থী "আপ-টু-ডেট" যদি তার লগে ভোটারের লগে থাকা সমস্ত প্রতিশ্রুতিবদ্ধ এন্ট্রি অন্তর্ভুক্ত থাকে। এটি নির্বাচন সীমাবদ্ধতা নামে পরিচিত এবং সুরক্ষার জন্য সমালোচনামূলক।
-
এর
-
নির্বাচনে জয়ী হওয়া: একটি প্রার্থী নতুন লিডার হয়ে ওঠে যদি এটি একই মেয়াদের জন্য ক্লাস্টারের সার্ভারগুলির একটি সংখ্যাগরিষ্ঠের কাছ থেকে ভোট পায়। একবার নির্বাচিত হলে, নতুন লিডার অবিলম্বে সমস্ত অন্যান্য সার্ভারে
AppendEntriesRPCs (হার্টবিট) পাঠায় তার কর্তৃত্ব স্থাপন করতে এবং নতুন নির্বাচন প্রতিরোধ করতে। - বিভক্ত ভোট এবং পুনরায় চেষ্টা: একাধিক প্রার্থী একই সাথে আবির্ভূত হতে পারে, যা একটি বিভক্ত ভোটের দিকে নিয়ে যায় যেখানে কোনও প্রার্থী সংখ্যাগরিষ্ঠতা অর্জন করে না। এটি সমাধানের জন্য, প্রতিটি প্রার্থীর একটি র্যান্ডমাইজড নির্বাচন টাইমআউট থাকে। যদি কোনও নির্বাচন জিততে বা নতুন লিডারের কাছ থেকে শুনতে না পেয়ে প্রার্থীর টাইমআউট শেষ হয়ে যায়, তবে এটি তার মেয়াদ বৃদ্ধি করে এবং একটি নতুন নির্বাচন শুরু করে। র্যান্ডমাইজেশন নিশ্চিত করে যে বিভক্ত ভোটগুলি বিরল এবং দ্রুত সমাধান করা হয়।
-
উচ্চতর মেয়াদ আবিষ্কার: যদি কোনও প্রার্থী (বা কোনও সার্ভার) তার নিজস্ব
current termএর চেয়ে উচ্চতরtermসহ একটি RPC গ্রহণ করে, তবে এটি অবিলম্বে তারcurrent termকে উচ্চতর মানে আপডেট করে এবংfollowerঅবস্থায় ফিরে আসে। এটি নিশ্চিত করে যে স্টেল তথ্য সহ কোনও সার্ভার কখনও লিডার হওয়ার বা কোনও বৈধ লিডারকে ব্যাহত করার চেষ্টা করে না।
২. লগ প্রতিলিপি
একবার লিডার নির্বাচিত হয়ে গেলে, তার প্রাথমিক দায়িত্ব হল প্রতিলিপি করা লগ পরিচালনা করা এবং ক্লাস্টারের জুড়ে সামঞ্জস্যতা নিশ্চিত করা। এর মধ্যে ক্লায়েন্ট কমান্ডগুলি গ্রহণ করা, সেগুলিকে তার লগে যুক্ত করা এবং সেগুলিকে ফলোয়ারদের কাছে প্রতিলিপি করা অন্তর্ভুক্ত।
- ক্লায়েন্ট অনুরোধ: সমস্ত ক্লায়েন্ট অনুরোধ (স্টেট মেশিন দ্বারা সম্পাদিত কমান্ড) লিডারের দিকে পরিচালিত হয়। যদি কোনও ক্লায়েন্ট কোনও ফলোয়ারের সাথে যোগাযোগ করে, তবে ফলোয়ার অনুরোধটি বর্তমান লিডারের দিকে পুনঃনির্দেশিত করে।
-
লিডারের লগে যুক্ত করা: যখন লিডার কোনও ক্লায়েন্ট কমান্ড গ্রহণ করে, তখন এটি কমান্ডটিকে তার স্থানীয় লগে একটি নতুন
log entryহিসাবে যুক্ত করে। প্রতিটি লগ এন্ট্রি কমান্ড নিজেই, যেtermএ এটি গ্রহণ করা হয়েছিল, এবং এরlog indexধারণ করে। -
AppendEntries RPC: লিডার তখন সমস্ত ফলোয়ারদের কাছে
AppendEntriesRPCs পাঠায়, তাদের নতুন লগ এন্ট্রি (বা এন্ট্রিগুলির একটি ব্যাচ) তাদের লগে যুক্ত করার অনুরোধ করে। এই RPCs অন্তর্ভুক্ত:-
term: লিডারের বর্তমান মেয়াদ। -
leaderId: লিডারের আইডি (ফলোয়ারদের ক্লায়েন্টদের পুনঃনির্দেশিত করার জন্য)। -
prevLogIndex: নতুন এন্ট্রিগুলির ঠিক আগের লগ এন্ট্রির সূচক। -
prevLogTerm:prevLogIndexএন্ট্রির মেয়াদ। এই দুটি (prevLogIndex,prevLogTerm) লগ ম্যাচিং বৈশিষ্ট্যের জন্য গুরুত্বপূর্ণ। -
entries[]: সংরক্ষণ করার জন্য লগ এন্ট্রিগুলি (হার্টবিটের জন্য খালি)। -
leaderCommit: লিডারেরcommitIndex(সর্বোচ্চ লগ এন্ট্রি সূচক যা প্রতিশ্রুতিবদ্ধ বলে পরিচিত)।
-
-
সামঞ্জস্য পরীক্ষা (লগ ম্যাচিং বৈশিষ্ট্য): যখন কোনও ফলোয়ার
AppendEntriesRPC গ্রহণ করে, তখন এটি একটি সামঞ্জস্য পরীক্ষা সম্পাদন করে। এটি যাচাই করে যে তার লগেprevLogIndexএprevLogTermএর সাথে মেলে এমন একটি মেয়াদ সহ একটি এন্ট্রি রয়েছে কিনা। যদি এই পরীক্ষা ব্যর্থ হয়, তবে ফলোয়ারAppendEntriesRPC প্রত্যাখ্যান করে, লিডারকে জানায় যে তার লগ অসামঞ্জস্যপূর্ণ। -
অসামঞ্জস্যতা সমাধান: যদি কোনও ফলোয়ার
AppendEntriesRPC প্রত্যাখ্যান করে, তবে লিডার সেই ফলোয়ারের জন্যnextIndexহ্রাস করে এবংAppendEntriesRPC পুনরায় চেষ্টা করে।nextIndexহল পরবর্তী লগ এন্ট্রি সূচক যা লিডার কোনও নির্দিষ্ট ফলোয়ারকে পাঠাবে। এই প্রক্রিয়াটি চলতে থাকে যতক্ষণ নাnextIndexএমন একটি পয়েন্টে পৌঁছে যায় যেখানে লিডার এবং ফলোয়ারের লগ মিলে যায়। একবার মিল খুঁজে পাওয়া গেলে, ফলোয়ার পরবর্তী লগ এন্ট্রিগুলি গ্রহণ করতে পারে, অবশেষে তার লগকে লিডারের সাথে সামঞ্জস্যপূর্ণ করে তোলে। -
এন্ট্রিগুলি প্রতিশ্রুতিবদ্ধ করা: একটি এন্ট্রি প্রতিশ্রুতিবদ্ধ বলে বিবেচিত হয় যখন লিডার এটিকে সংখ্যাগরিষ্ঠ সার্ভারে (নিজেকে সহ) সফলভাবে প্রতিলিপি করেছে। একবার প্রতিশ্রুতিবদ্ধ হলে, এন্ট্রিটি স্থানীয় স্টেট মেশিনে প্রয়োগ করা যেতে পারে। লিডার তার
commitIndexআপডেট করে এবং প্রতিশ্রুতিবদ্ধ এন্ট্রিগুলির বিষয়ে ফলোয়ারদের অবহিত করার জন্য এটি পরবর্তীAppendEntriesRPCs-এ অন্তর্ভুক্ত করে। ফলোয়াররা লিডারেরleaderCommitএর উপর ভিত্তি করে তাদেরcommitIndexআপডেট করে এবং সেই সূচক পর্যন্ত এন্ট্রিগুলি তাদের স্টেট মেশিনে প্রয়োগ করে। - লিডার সম্পূর্ণতা বৈশিষ্ট্য: রাফ্ট গ্যারান্টি দেয় যে যদি কোনও লগ এন্ট্রি কোনও নির্দিষ্ট মেয়াদে প্রতিশ্রুতিবদ্ধ হয়, তবে সমস্ত পরবর্তী লিডারদের অবশ্যই সেই লগ এন্ট্রি থাকতে হবে। এই বৈশিষ্ট্যটি নির্বাচন সীমাবদ্ধতা দ্বারা প্রয়োগ করা হয়: একজন প্রার্থী কেবলমাত্র তখনই নির্বাচন জিততে পারে যদি তার লগ বেশিরভাগ অন্যান্য সার্ভারের মতোই আপ-টু-ডেট থাকে। এটি কোনও লিডারকে ওভাররাইট বা প্রতিশ্রুতিবদ্ধ এন্ট্রিগুলি মিস করার প্রতিরোধ করে।
৩. সুরক্ষা বৈশিষ্ট্য এবং গ্যারান্টি
রাফ্টের দৃঢ়তা বেশ কয়েকটি যত্ন সহকারে ডিজাইন করা সুরক্ষা বৈশিষ্ট্য থেকে আসে যা অসামঞ্জস্যতা প্রতিরোধ করে এবং ডেটা অখণ্ডতা নিশ্চিত করে:
- নির্বাচন সুরক্ষা: কোনও নির্দিষ্ট মেয়াদে সর্বাধিক একজন লিডার নির্বাচিত হতে পারে। এটি ভোটদানের প্রক্রিয়া দ্বারা প্রয়োগ করা হয় যেখানে একটি ফলোয়ার প্রতি মেয়াদে সর্বাধিক একটি ভোট দেয় এবং একজন প্রার্থীর সংখ্যাগরিষ্ঠ ভোটের প্রয়োজন হয়।
- লিডার সম্পূর্ণতা: যদি কোনও লগ এন্ট্রি কোনও নির্দিষ্ট মেয়াদে প্রতিশ্রুতিবদ্ধ হয়, তবে সেই এন্ট্রিটি সমস্ত পরবর্তী লিডারদের লগে উপস্থিত থাকবে। এটি প্রতিশ্রুতিবদ্ধ ডেটা হারানোর প্রতিরোধ করার জন্য অত্যন্ত গুরুত্বপূর্ণ এবং প্রধানত নির্বাচন সীমাবদ্ধতা দ্বারা নিশ্চিত করা হয়।
- লগ ম্যাচিং বৈশিষ্ট্য: যদি দুটি লগে একই সূচক এবং মেয়াদ সহ একটি এন্ট্রি থাকে, তবে লগগুলি পূর্ববর্তী সমস্ত এন্ট্রিতে অভিন্ন। এটি লগ সামঞ্জস্য পরীক্ষা সহজ করে এবং লিডারকে কার্যকরভাবে ফলোয়ারদের লগ আপ-টু-ডেট আনতে সক্ষম করে।
- প্রতিশ্রুতি সুরক্ষা: একবার একটি এন্ট্রি প্রতিশ্রুতিবদ্ধ হয়ে গেলে, এটি কখনও রোল ব্যাক বা ওভাররাইট করা হবে না। এটি লিডার সম্পূর্ণতা এবং লগ ম্যাচিং বৈশিষ্ট্যগুলির সরাসরি ফলাফল। একবার একটি এন্ট্রি প্রতিশ্রুতিবদ্ধ হয়ে গেলে, এটি স্থায়ীভাবে সংরক্ষিত বলে বিবেচিত হয়।
রাফ্টের মূল ধারণা এবং প্রক্রিয়া
ভূমিকা এবং অপারেশনাল পর্যায় ছাড়াও, রাফ্ট স্টেট পরিচালনা এবং সঠিকতা নিশ্চিত করতে বেশ কয়েকটি মূল ধারণার উপর নির্ভর করে।
১. মেয়াদ (Terms)
রাফ্টে একটি term একটি অবিচ্ছিন্নভাবে ক্রমবর্ধমান পূর্ণসংখ্যা। এটি ক্লাস্টারের জন্য একটি যৌক্তিক ঘড়ি হিসাবে কাজ করে। প্রতিটি মেয়াদ একটি নির্বাচন দিয়ে শুরু হয়, এবং যদি একটি নির্বাচন সফল হয়, তবে সেই মেয়াদের জন্য একজন একক লিডার নির্বাচিত হয়। মেয়াদগুলি স্টেল তথ্য সনাক্ত করতে এবং সার্ভারগুলি সর্বদা সবচেয়ে আপ-টু-ডেট তথ্যের প্রতি শ্রদ্ধাশীল তা নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ:
-
সার্ভারগুলি সমস্ত RPC-তে তাদের
current termবিনিময় করে। -
যদি কোনও সার্ভার অন্য সার্ভারের উচ্চতর
termআবিষ্কার করে, তবে এটি তার নিজস্বcurrent termআপডেট করে এবংfollowerঅবস্থায় ফিরে আসে। -
যদি কোনও প্রার্থী বা লিডার আবিষ্কার করে যে তার
termস্টেল (অন্য সার্ভারেরtermএর চেয়ে কম), তবে এটি অবিলম্বে পদত্যাগ করে।
২. লগ এন্ট্রি (Log Entries)
লগ রাফ্টের কেন্দ্রীয় উপাদান। এটি এন্ট্রিগুলির একটি ক্রমযুক্ত ক্রম, যেখানে প্রতিটি log entry স্টেট মেশিনে সম্পাদিত হওয়ার জন্য একটি কমান্ডের প্রতিনিধিত্ব করে। প্রতিটি এন্ট্রি ধারণ করে:
- কমান্ড: সম্পাদিত হওয়ার জন্য আসল অপারেশন (যেমন, "x=5 সেট করুন", "ব্যবহারকারী তৈরি করুন")।
- মেয়াদ: যে মেয়াদে এন্ট্রিটি লিডারে তৈরি হয়েছিল।
- সূচক: লগে এন্ট্রির অবস্থান। লগ এন্ট্রিগুলি সূচক দ্বারা কঠোরভাবে ক্রমযুক্ত।
লগ স্থায়ী, যার অর্থ ক্র্যাশ চলাকালীন ডেটা হারা থেকে রক্ষা করার জন্য সার্ভাররা ক্লায়েন্টদের সাড়া দেওয়ার আগে এন্ট্রিগুলি স্থিতিশীল স্টোরেজে লেখা হয়।
৩. স্টেট মেশিন (State Machine)
একটি রাফ্ট ক্লাস্টারের প্রতিটি সার্ভার একটি state machine বজায় রাখে। এটি একটি অ্যাপ্লিকেশন-নির্দিষ্ট উপাদান যা প্রতিশ্রুতিবদ্ধ লগ এন্ট্রিগুলি প্রক্রিয়া করে। সামঞ্জস্যতা নিশ্চিত করার জন্য, স্টেট মেশিনটি নির্ধারক (একই প্রাথমিক অবস্থা এবং কমান্ডের ক্রম দেওয়া হলে, এটি সর্বদা একই আউটপুট এবং চূড়ান্ত অবস্থা তৈরি করে) এবং আইডেম্পোটেন্ট (একই কমান্ড একাধিকবার প্রয়োগ করার একই প্রভাব রয়েছে যেমন একবার প্রয়োগ করা, যা রিট্রিগুলি সুন্দরভাবে পরিচালনা করতে সহায়তা করে, যদিও রাফ্টের লগ প্রতিশ্রুতি মূলত একক প্রয়োগের নিশ্চয়তা দেয়) হতে হবে।
৪. প্রতিশ্রুতি সূচক (Commit Index)
commitIndex হল সর্বোচ্চ লগ এন্ট্রি সূচক যা প্রতিশ্রুতিবদ্ধ বলে পরিচিত। এর মানে হল যে এটি সংখ্যাগরিষ্ঠ সার্ভারে নিরাপদে প্রতিলিপি করা হয়েছে এবং স্টেট মেশিনে প্রয়োগ করা যেতে পারে। লিডাররা commitIndex নির্ধারণ করে, এবং ফলোয়াররা লিডারের AppendEntries RPCs থেকে তাদের commitIndex আপডেট করে। commitIndex পর্যন্ত সমস্ত এন্ট্রি স্থায়ী বলে বিবেচিত হয় এবং রোল ব্যাক করা যায় না।
৫. স্ন্যাপশট (Snapshots)
সময়ের সাথে সাথে, প্রতিলিপি করা লগ খুব বড় হতে পারে, উল্লেখযোগ্য ডিস্ক স্পেস গ্রহণ করে এবং লগ প্রতিলিপি এবং পুনরুদ্ধারকে ধীর করে তোলে। রাফ্ট snapshot ব্যবহার করে এটি সমাধান করে। একটি স্ন্যাপশট হল একটি নির্দিষ্ট সময়ে স্টেট মেশিনের অবস্থার একটি কম্প্যাক্ট উপস্থাপনা। সম্পূর্ণ লগ রাখার পরিবর্তে, সার্ভারগুলি পর্যায়ক্রমে তাদের অবস্থা "snapshot" করতে পারে, স্ন্যাপশট পয়েন্ট পর্যন্ত সমস্ত লগ এন্ট্রি বাতিল করতে পারে এবং তারপরে স্ন্যাপশটটি নতুন বা ল্যাগিং ফলোয়ারদের কাছে প্রতিলিপি করতে পারে। এই প্রক্রিয়াটি কার্যকারিতা উল্লেখযোগ্যভাবে উন্নত করে:
- লগ সংকোচন: স্থায়ী লগ ডেটার পরিমাণ হ্রাস করে।
- দ্রুত পুনরুদ্ধার: নতুন বা ক্র্যাশ হওয়া সার্ভারগুলি শুরু থেকে পুরো লগটি পুনরায় চালানোর পরিবর্তে একটি স্ন্যাপশট গ্রহণ করতে পারে।
-
InstallSnapshot RPC: রাফ্ট লিডার থেকে ফলোয়ারদের কাছে স্ন্যাপশট স্থানান্তর করার জন্য একটি
InstallSnapshotRPC সংজ্ঞায়িত করে।
কার্যকরী হলেও, স্ন্যাপশট করা বাস্তবায়নে জটিলতা যোগ করে, বিশেষ করে সমবর্তী স্ন্যাপশট তৈরি, লগ ট্রাঙ্কেশন এবং সংক্রমণ পরিচালনার ক্ষেত্রে।
রাফ্ট বাস্তবায়ন: গ্লোবাল স্থাপনার জন্য ব্যবহারিক বিবেচনা
রাফ্টের কমনীয় নকশাকে একটি শক্তিশালী, প্রোডাকশন-রেডি সিস্টেমে অনুবাদ করা, বিশেষ করে বিশ্বব্যাপী দর্শকদের এবং বৈচিত্র্যময় পরিকাঠামোর জন্য, বেশ কয়েকটি ব্যবহারিক প্রকৌশল চ্যালেঞ্জ মোকাবেলা করার সাথে জড়িত।
১. একটি গ্লোবাল প্রেক্ষাপটে নেটওয়ার্ক লেটেন্সি এবং পার্টিশন
বিশ্বব্যাপী বিতরণ করা সিস্টেমগুলির জন্য, নেটওয়ার্ক লেটেন্সি একটি উল্লেখযোগ্য কারণ। একটি রাফ্ট ক্লাস্টারের সাধারণত একটি লগ এন্ট্রি প্রতিশ্রুতিবদ্ধ করার আগে সংখ্যাগরিষ্ঠ নোডের এটির উপর সম্মত হতে হয়। মহাদেশ জুড়ে ছড়িয়ে থাকা একটি ক্লাস্টারে, নোডগুলির মধ্যে লেটেন্সি কয়েকশ মিলিসেকেন্ড হতে পারে। এটি সরাসরি প্রভাবিত করে:
- প্রতিশ্রুতি লেটেন্সি: ক্লায়েন্ট অনুরোধ প্রতিশ্রুতিবদ্ধ হতে যে সময় লাগে তা প্রতিলিপিগুলির সংখ্যাগরিষ্ঠের কাছে সবচেয়ে ধীর নেটওয়ার্ক লিঙ্কের দ্বারা বাধাগ্রস্ত হতে পারে। রিড-অনলি ফলোয়ার (যা স্টেল রিডের জন্য লিডার ইন্টারঅ্যাকশন প্রয়োজন হয় না) বা ভৌগোলিকভাবে সচেতন কোরাম কনফিগারেশন (যেমন, ৫-নোড ক্লাস্টারের জন্য এক অঞ্চলে ৩ নোড, অন্যটিতে ২ নোড, যেখানে একটি সংখ্যাগরিষ্ঠতা একটি দ্রুত অঞ্চলে হতে পারে) এর মতো কৌশলগুলি এটি হ্রাস করতে পারে।
-
লিডার নির্বাচন গতি: উচ্চ লেটেন্সি
RequestVoteRPCs বিলম্বিত করতে পারে, যার ফলে আরও ঘন ঘন বিভক্ত ভোট বা দীর্ঘতর নির্বাচন সময় হতে পারে। সাধারণ ইন্টার-নোড লেটেন্সি থেকে উল্লেখযোগ্যভাবে বেশি নির্বাচন টাইমআউট সামঞ্জস্য করা অপরিহার্য। - নেটওয়ার্ক পার্টিশন হ্যান্ডলিং: বাস্তব-বিশ্বের নেটওয়ার্ক পার্টিশনের প্রবণ। রাফ্ট পার্টিশনগুলি সঠিকভাবে পরিচালনা করে, নিশ্চিত করে যে কেবলমাত্র সংখ্যাগরিষ্ঠ সার্ভার ধারণকারী পার্টিশনটি একটি লিডার নির্বাচন করতে এবং অগ্রগতি করতে পারে। সংখ্যালঘু পার্টিশন নতুন এন্ট্রি প্রতিশ্রুতিবদ্ধ করতে অক্ষম হবে, এইভাবে স্প্লিট-ব্রেন পরিস্থিতি প্রতিরোধ করবে। যাইহোক, একটি বিশ্বব্যাপী বিতরণ করা সেটআপে দীর্ঘায়িত পার্টিশন নির্দিষ্ট অঞ্চলে অনুপলব্ধতার কারণ হতে পারে, যার জন্য কোরাম স্থাপনা সম্পর্কে সতর্ক স্থাপত্য সিদ্ধান্তের প্রয়োজন।
২. স্থায়ী স্টোরেজ এবং স্থায়িত্ব
রাফ্টের সঠিকতা এর লগ এবং অবস্থার স্থায়িত্বের উপর ব্যাপকভাবে নির্ভর করে। কোনও সার্ভার RPC-তে সাড়া দেওয়ার বা তার স্টেট মেশিনে কোনও এন্ট্রি প্রয়োগ করার আগে, তাকে অবশ্যই নিশ্চিত করতে হবে যে প্রাসঙ্গিক ডেটা (লগ এন্ট্রি, current term, votedFor) স্থিতিশীল স্টোরেজে লেখা হয়েছে এবং fsync'd (ডিস্কে ফ্লাশ করা হয়েছে)। এটি ক্র্যাশগুলির ক্ষেত্রে ডেটা হারানোর প্রতিরোধ করে। বিবেচনার মধ্যে রয়েছে:
- পারফরম্যান্স: ঘন ঘন ডিস্ক রাইটিং পারফরম্যান্সের বাধা হতে পারে। ব্যাচ রাইটিং এবং উচ্চ-কর্মক্ষমতা SSD ব্যবহার সাধারণ অপ্টিমাইজেশন।
- নির্ভরযোগ্যতা: একটি শক্তিশালী এবং টেকসই স্টোরেজ সমাধান (স্থানীয় ডিস্ক, নেটওয়ার্ক-সংযুক্ত স্টোরেজ, ক্লাউড ব্লক স্টোরেজ) নির্বাচন করা অত্যন্ত গুরুত্বপূর্ণ।
- WAL (Write-Ahead Log): প্রায়শই, রাফ্ট বাস্তবায়ন স্থায়িত্বের জন্য একটি রাইট-অ্যাহেড লগ ব্যবহার করে, ডাটাবেসের মতো, নিশ্চিত করে যে পরিবর্তনগুলি মেমরিতে প্রয়োগ করার আগে ডিস্কে লেখা হয়।
৩. ক্লায়েন্ট মিথস্ক্রিয়া এবং সামঞ্জস্য মডেল
ক্লায়েন্টরা লিডারের কাছে অনুরোধ পাঠিয়ে রাফ্ট ক্লাস্টারের সাথে যোগাযোগ করে। ক্লায়েন্ট অনুরোধগুলি পরিচালনা করার মধ্যে রয়েছে:
- লিডার আবিষ্কার: ক্লায়েন্টদের বর্তমান লিডার খুঁজে বের করার জন্য একটি প্রক্রিয়ার প্রয়োজন। এটি একটি পরিষেবা আবিষ্কার প্রক্রিয়ার মাধ্যমে, একটি স্থির এন্ডপয়েন্টের মাধ্যমে যা পুনঃনির্দেশিত করে, বা একটি লিডার হিসাবে প্রতিক্রিয়া না জানানো পর্যন্ত সার্ভারগুলি চেষ্টা করার মাধ্যমে হতে পারে।
- অনুরোধ পুনরায় চেষ্টা: লিডার পরিবর্তন হলে বা কোনও নেটওয়ার্ক ত্রুটি ঘটলে ক্লায়েন্টদের অনুরোধগুলি পুনরায় চেষ্টা করার জন্য প্রস্তুত থাকতে হবে।
-
পঠন সামঞ্জস্য: রাফ্ট প্রধানত লেখার জন্য শক্তিশালী সামঞ্জস্যতা নিশ্চিত করে। পঠনের জন্য, বেশ কয়েকটি মডেল সম্ভব:
- শক্তিশালীভাবে সামঞ্জস্যপূর্ণ পঠন: কোনও ক্লায়েন্ট লিডারকে এটি তার স্টেট আপ-টু-ডেট কিনা তা নিশ্চিত করতে বলতে পারে, পড়ার পরিবেশন করার আগে তার ফলোয়ারদের সংখ্যাগরিষ্ঠের কাছে একটি হার্টবিট পাঠিয়ে। এটি সতেজতা নিশ্চিত করে তবে লেটেন্সি যোগ করে।
- লিডার-লিজ পঠন: লিডার অল্প সময়ের জন্য সংখ্যাগরিষ্ঠ নোড থেকে একটি "লিজ" অর্জন করতে পারে, যার সময় এটি জানে যে এটি এখনও লিডার এবং আরও কনসেনসাস ছাড়াই পঠন পরিবেশন করতে পারে। এটি দ্রুততর তবে সময়-সীমাযুক্ত।
- ফলোয়ারদের কাছ থেকে স্টেল পঠন: ফলোয়ারদের কাছ থেকে সরাসরি পঠন কম লেটেন্সি সরবরাহ করতে পারে তবে ফলোয়ারের লগ লিডারের চেয়ে ল্যাগ করলে স্টেল ডেটা পড়ার ঝুঁকি থাকে। এটি সেই অ্যাপ্লিকেশনগুলির জন্য গ্রহণযোগ্য যেখানে শেষ পর্যন্ত সামঞ্জস্য পঠনের জন্য যথেষ্ট।
৪. কনফিগারেশন পরিবর্তন (ক্লাস্টার সদস্যপদ)
একটি রাফ্ট ক্লাস্টারের সদস্যপদ পরিবর্তন করা (সার্ভার যোগ করা বা অপসারণ করা) একটি জটিল অপারেশন যা অসামঞ্জস্যতা বা স্প্লিট-ব্রেন পরিস্থিতি এড়াতে কনসেনসাসের মাধ্যমেও সঞ্চালিত হতে হবে। রাফ্ট জয়েন্ট কনসেনসাস নামে একটি কৌশল প্রস্তাব করে:
- দুটি কনফিগারেশন: কনফিগারেশন পরিবর্তনের সময়, সিস্টেম অস্থায়ীভাবে দুটি ওভারল্যাপিং কনফিগারেশন সহ কাজ করে: পুরানো কনফিগারেশন (C_old) এবং নতুন কনফিগারেশন (C_new)।
- জয়েন্ট কনসেনসাস অবস্থা (C_old, C_new): লিডার একটি বিশেষ লগ এন্ট্রি প্রস্তাব করে যা জয়েন্ট কনফিগারেশনকে প্রতিনিধিত্ব করে। একবার এই এন্ট্রিটি প্রতিশ্রুতিবদ্ধ হয়ে গেলে (C_old এবং C_new উভয়ের সংখ্যাগরিষ্ঠের কাছ থেকে সম্মতি প্রয়োজন), সিস্টেম একটি রূপান্তরকারী অবস্থায় থাকে। এখন, সিদ্ধান্তগুলি উভয় কনফিগারেশনের সংখ্যাগরিষ্ঠতা দাবি করে। এটি নিশ্চিত করে যে রূপান্তরের সময়, পুরানো বা নতুন কোনও কনফিগারেশন একতরফাভাবে সিদ্ধান্ত নিতে পারে না, বিচ্যুতি প্রতিরোধ করে।
- C_new তে স্থানান্তর: একবার জয়েন্ট কনফিগারেশন লগ এন্ট্রি প্রতিশ্রুতিবদ্ধ হয়ে গেলে, লিডার কেবল নতুন কনফিগারেশন (C_new) প্রতিনিধিত্বকারী আরেকটি লগ এন্ট্রি প্রস্তাব করে। এই দ্বিতীয় এন্ট্রিটি প্রতিশ্রুতিবদ্ধ হয়ে গেলে, পুরানো কনফিগারেশন বাতিল হয়ে যায় এবং সিস্টেমটি কেবল C_new এর অধীনে কাজ করে।
- সুরক্ষা: এই দুই-ধাপের কমিট-সদৃশ প্রক্রিয়া নিশ্চিত করে যে কোনও সময়ে দুটি conflicting লিডার নির্বাচিত হতে পারে না (একটি C_old এর অধীনে, একটি C_new এর অধীনে) এবং পরিবর্তন চলাকালীন সিস্টেমটি উপলব্ধ থাকে।
রূপান্তরকারী অবস্থায় অসংখ্য প্রান্ত কেস এবং ব্যর্থতার পরিস্থিতির কারণে কনফিগারেশন পরিবর্তনগুলি সঠিকভাবে বাস্তবায়ন করা একটি রাফ্ট বাস্তবায়নের সবচেয়ে চ্যালেঞ্জিং অংশগুলির মধ্যে একটি।
৫. ডিস্ট্রিবিউটেড সিস্টেম টেস্টিং: একটি কঠোর পদ্ধতি
এর অ-নির্ধারক প্রকৃতি এবং ব্যর্থতার মোডের বিপুল সংখ্যক কারণে রাফ্টের মতো একটি ডিস্ট্রিবিউটেড কনসেনসাস অ্যালগরিদম পরীক্ষা করা অত্যন্ত চ্যালেঞ্জিং। সাধারণ ইউনিট পরীক্ষা অপর্যাপ্ত। কঠোর টেস্টিংয়ের মধ্যে রয়েছে:
- ফল্ট ইনজেকশন: নোড ক্র্যাশ, নেটওয়ার্ক পার্টিশন, বার্তা বিলম্ব এবং বার্তা পুনরায় অর্ডারিংয়ের মতো ব্যর্থতাগুলি পদ্ধতিগতভাবে প্রবর্তন করা। জেপসেনের মতো সরঞ্জামগুলি বিশেষভাবে এই উদ্দেশ্যে ডিজাইন করা হয়েছে।
- প্রপার্টি-ভিত্তিক টেস্টিং: ইনভেরিয়েন্ট এবং সুরক্ষা বৈশিষ্ট্যগুলি (যেমন, প্রতি মেয়াদে সর্বাধিক একজন লিডার, প্রতিশ্রুতিবদ্ধ এন্ট্রিগুলি কখনই হারিয়ে যায় না) সংজ্ঞায়িত করা এবং বিভিন্ন পরিস্থিতিতে বাস্তবায়ন এগুলি মেনে চলে কিনা তা পরীক্ষা করা।
- মডেল চেকিং: অ্যালগরিদমের গুরুত্বপূর্ণ অংশগুলির জন্য, সঠিকতা প্রমাণ করতে আনুষ্ঠানিক যাচাইকরণ কৌশলগুলি ব্যবহার করা যেতে পারে, যদিও এটি অত্যন্ত বিশেষায়িত।
- সিমুলেটেড পরিবেশ: বিশ্বব্যাপী স্থাপনার সাধারণ নেটওয়ার্ক শর্তাবলী (লেটেন্সি, প্যাকেট লস) অনুকরণ করে এমন পরিবেশে পরীক্ষা চালানো।
ব্যবহারের ক্ষেত্র এবং বাস্তব-বিশ্বের অ্যাপ্লিকেশন
রাফ্টের ব্যবহারিকতা এবং বোধগম্যতা বিভিন্ন গুরুত্বপূর্ণ পরিকাঠামো উপাদান জুড়ে এর ব্যাপক গ্রহণকে উৎসাহিত করেছে:
১. ডিস্ট্রিবিউটেড কি-ভ্যালু স্টোর এবং ডাটাবেস প্রতিলিপি
- etcd: কিউবারনেটিসের একটি মৌলিক উপাদান, etcd কনফিগারেশন ডেটা, পরিষেবা আবিষ্কারের তথ্য সংরক্ষণ এবং প্রতিলিপি করতে এবং ক্লাস্টারের অবস্থা পরিচালনা করতে রাফ্ট ব্যবহার করে। কিউবারনেটিসের সঠিকভাবে কাজ করার জন্য এর নির্ভরযোগ্যতা অপরিহার্য।
- Consul: হ্যাশিকরপ দ্বারা উন্নত, কনসাল তার ডিস্ট্রিবিউটেড স্টোরেজ ব্যাকএন্ডের জন্য রাফ্ট ব্যবহার করে, গতিশীল পরিকাঠামো পরিবেশে পরিষেবা আবিষ্কার, স্বাস্থ্য পরীক্ষা এবং কনফিগারেশন পরিচালনা সক্ষম করে।
- TiKV: TiDB (একটি ডিস্ট্রিবিউটেড SQL ডাটাবেস) দ্বারা ব্যবহৃত ডিস্ট্রিবিউটেড ট্রান্সেকশনাল কি-ভ্যালু স্টোর এর ডেটা প্রতিলিপি এবং সামঞ্জস্যের নিশ্চয়তার জন্য রাফ্ট প্রয়োগ করে।
- CockroachDB: এই বিশ্বব্যাপী বিতরণ করা SQL ডাটাবেস একাধিক নোড এবং ভৌগোলিক অঞ্চল জুড়ে ডেটা প্রতিলিপি করার জন্য ব্যাপকভাবে রাফ্ট ব্যবহার করে, এমনকি অঞ্চলের-ব্যাপী ব্যর্থতার মুখেও উচ্চ প্রাপ্যতা এবং শক্তিশালী সামঞ্জস্যতা নিশ্চিত করে।
২. পরিষেবা আবিষ্কার এবং কনফিগারেশন ব্যবস্থাপনা
রাফ্ট সিস্টেমগুলির জন্য একটি আদর্শ ভিত্তি সরবরাহ করে যা একটি ক্লাস্টারের জুড়ে পরিষেবা এবং কনফিগারেশনগুলির গুরুত্বপূর্ণ মেটাডেটা সংরক্ষণ এবং বিতরণ করতে হবে। যখন কোনও পরিষেবা নিবন্ধিত হয় বা এর কনফিগারেশন পরিবর্তিত হয়, রাফ্ট নিশ্চিত করে যে সমস্ত নোড অবশেষে নতুন অবস্থায় সম্মত হয়, ম্যানুয়াল হস্তক্ষেপ ছাড়াই গতিশীল আপডেট সক্ষম করে।
৩. ডিস্ট্রিবিউটেড ট্রান্সেকশন কোঅর্ডিনেটর
একাধিক অপারেশন বা পরিষেবা জুড়ে অ্যাটমিসিটির প্রয়োজন এমন সিস্টেমগুলির জন্য, রাফ্ট ডিস্ট্রিবিউটেড ট্রান্সেকশন কোঅর্ডিনেটরদের আন্ডারপিন করতে পারে, অংশগ্রহণকারীদের জুড়ে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করার আগে ট্রান্সেকশন লগগুলি সামঞ্জস্যপূর্ণভাবে প্রতিলিপি করা হয়েছে তা নিশ্চিত করে।
৪. অন্যান্য সিস্টেমে ক্লাস্টার কোঅর্ডিনেশন এবং লিডার নির্বাচন
স্পষ্ট ডাটাবেস বা কি-ভ্যালু স্টোর ব্যবহারের বাইরে, রাফ্ট প্রায়শই সমন্বয়মূলক কাজগুলি পরিচালনা করার জন্য, অন্যান্য ডিস্ট্রিবিউটেড প্রসেসগুলির জন্য লিডার নির্বাচন করার জন্য, বা বৃহত্তর সিস্টেমগুলিতে একটি নির্ভরযোগ্য নিয়ন্ত্রণ প্লেন সরবরাহ করার জন্য একটি লাইব্রেরি বা মূল উপাদান হিসাবে এমবেড করা হয়। উদাহরণস্বরূপ, অনেক ক্লাউড-নেটিভ সমাধান তাদের নিয়ন্ত্রণ প্লেন উপাদানগুলির অবস্থা পরিচালনা করতে রাফ্ট ব্যবহার করে।
রাফ্টের সুবিধা এবং অসুবিধা
যদিও রাফ্ট উল্লেখযোগ্য সুবিধা প্রদান করে, এর ট্রেড-অফ বোঝা অপরিহার্য।
সুবিধা:
- বোধগম্যতা: এর প্রাথমিক নকশা লক্ষ্য, যা প্যাক্সোসের মতো পুরানো কনসেনসাস অ্যালগরিদমগুলির কুসংস্কার জটিলতাগুলিতে না পড়ে এটি বাস্তবায়ন, ডিবাগ এবং যুক্তিযুক্ত করা সহজ করে তোলে।
- শক্তিশালী সামঞ্জস্য: প্রতিশ্রুতিবদ্ধ লগ এন্ট্রিগুলির জন্য শক্তিশালী সামঞ্জস্যের গ্যারান্টি প্রদান করে, ডেটা অখণ্ডতা এবং নির্ভরযোগ্যতা নিশ্চিত করে।
- ফল্ট টলারেন্স: minority নোডগুলির (N-নোড ক্লাস্টারে (N-1)/2 পর্যন্ত ব্যর্থতা) অনুপলব্ধতা বা সামঞ্জস্যতা হারানো ছাড়াই ব্যর্থতা সহ্য করতে পারে।
- পারফরম্যান্স: স্থিতিশীল পরিস্থিতিতে (কোনও লিডার পরিবর্তন নেই), রাফ্ট উচ্চ থ্রুপুট অর্জন করতে পারে কারণ লিডার সমস্ত অনুরোধ পর্যায়ক্রমে প্রক্রিয়া করে এবং সমান্তরালভাবে প্রতিলিপি করে, নেটওয়ার্ক ব্যান্ডউইথথকে কার্যকরভাবে ব্যবহার করে।
- সু-সংজ্ঞায়িত ভূমিকা: স্পষ্ট ভূমিকা (লিডার, ফলোয়ার, প্রার্থী) এবং স্টেট ট্রানজিশন মানসিক মডেল এবং বাস্তবায়নকে সহজ করে।
- কনফিগারেশন পরিবর্তন: ক্লাস্টারে নিরাপদে নোড যোগ বা অপসারণ করার জন্য একটি শক্তিশালী প্রক্রিয়া (জয়েন্ট কনসেনসাস) সরবরাহ করে।
অসুবিধা:
- লিডার বাধা: সমস্ত ক্লায়েন্ট লেখার অনুরোধ লিডারের মাধ্যমে যেতে হবে। অত্যন্ত উচ্চ লেখার থ্রুপুট বা লিডাররা ক্লায়েন্টদের থেকে ভৌগলিকভাবে দূরে থাকার পরিস্থিতিতে, এটি একটি পারফরম্যান্স বাধা হয়ে উঠতে পারে।
- পঠন লেটেন্সি: শক্তিশালী সামঞ্জস্যপূর্ণ পঠন অর্জনের জন্য প্রায়শই লিডারের সাথে যোগাযোগের প্রয়োজন হয়, যা সম্ভাব্য লেটেন্সি যোগ করে। ফলোয়ারদের কাছ থেকে পড়া স্টেল ডেটার ঝুঁকি তৈরি করে।
- কোরামের প্রয়োজনীয়তা: নতুন এন্ট্রি প্রতিশ্রুতিবদ্ধ করার জন্য সংখ্যাগরিষ্ঠ নোড উপলব্ধ থাকতে হবে। ৫-নোড ক্লাস্টারে, ২ টি ব্যর্থতা সহ্য করা যায়। যদি ৩ টি নোড ব্যর্থ হয়, তবে ক্লাস্টার লেখার জন্য অনুপলব্ধ হয়ে যায়। ভৌগোলিকভাবে ছড়িয়ে থাকা পরিবেশে যেখানে অঞ্চল জুড়ে সংখ্যাগরিষ্ঠতা বজায় রাখা কঠিন, এটি চ্যালেঞ্জিং হতে পারে।
- নেটওয়ার্ক সংবেদনশীলতা: নেটওয়ার্ক লেটেন্সি এবং পার্টিশনগুলির প্রতি অত্যন্ত সংবেদনশীল, যা নির্বাচন সময় এবং সামগ্রিক সিস্টেম থ্রুপুটকে প্রভাবিত করতে পারে, বিশেষ করে ব্যাপকভাবে বিতরণ করা স্থাপনায়।
- কনফিগারেশন পরিবর্তনের জটিলতা: শক্তিশালী হলেও, জয়েন্ট কনসেনসাস প্রক্রিয়াটি রাফ্ট অ্যালগরিদমের সবচেয়ে জটিল অংশগুলির মধ্যে একটি যা সঠিকভাবে বাস্তবায়ন এবং পুঙ্খানুপুঙ্খভাবে পরীক্ষা করতে হবে।
- ব্যর্থতার একক বিন্দু (লেখার জন্য): লিডার ব্যর্থতার জন্য ফল্ট-টলারেন্ট হলেও, যদি লিডার স্থায়ীভাবে ডাউন থাকে এবং একটি নতুন লিডার নির্বাচন করা না যায় (যেমন, নেটওয়ার্ক পার্টিশন বা অনেক বেশি ব্যর্থতার কারণে), তবে সিস্টেম লেখার উপর অগ্রগতি করতে পারে না।
উপসংহার: স্থিতিশীল গ্লোবাল সিস্টেমের জন্য ডিস্ট্রিবিউটেড কনসেনসাস আয়ত্ত করা
রাফ্ট অ্যালগরিদম জটিল সমস্যাগুলি সরল করার ক্ষেত্রে চিন্তাশীল নকশার শক্তির একটি প্রমাণ। বোধগম্যতার উপর এর জোর ডিস্ট্রিবিউটেড কনসেনসাসকে গণতন্ত্রীকরণ করেছে, যা ডেভেলপার এবং সংস্থাগুলির বিস্তৃত পরিসরকে পূর্ববর্তী পদ্ধতির রহস্যময় জটিলতায় না পড়ে উচ্চ উপলব্ধ এবং ফল্ট-টলারেন্ট সিস্টেম তৈরি করতে সক্ষম করে।
কিউবারনেটিস (etcd এর মাধ্যমে) দিয়ে কন্টেইনার ক্লাস্টারগুলি অর্কেস্ট্রেট করা থেকে শুরু করে ককরোচডিবি (CockroachDB) এর মতো বিশ্বব্যাপী ডাটাবেসগুলির জন্য স্থিতিশীল ডেটা স্টোরেজ সরবরাহ করা পর্যন্ত, রাফ্ট একটি নীরব ওয়ার্কহরস, যা আমাদের ডিজিটাল বিশ্বকে সামঞ্জস্যপূর্ণ এবং কার্যকরী রাখে। রাফ্ট বাস্তবায়ন করা কোনও তুচ্ছ কাজ নয়, তবে এর স্পেসিফিকেশনের স্পষ্টতা এবং এর পরিপার্শ্বের সমৃদ্ধ ইকোসিস্টেম এটিকে পরবর্তী প্রজন্মের শক্তিশালী, মাপযোগ্য পরিকাঠামো তৈরির প্রতি প্রতিশ্রুতিবদ্ধদের জন্য একটি পুরস্কৃত উদ্যোগ করে তোলে।
ডেভেলপার এবং স্থপতিদের জন্য কার্যকর অন্তর্দৃষ্টি:
- বোধগম্যতাকে অগ্রাধিকার দিন: কোনও বাস্তবায়ন প্রচেষ্টা করার আগে, রাফ্টের প্রতিটি নিয়ম এবং স্টেট ট্রানজিশন পুঙ্খানুপুঙ্খভাবে বোঝার জন্য সময় বিনিয়োগ করুন। মূল কাগজ এবং ভিজ্যুয়াল ব্যাখ্যা অমূল্য সম্পদ।
- বিদ্যমান লাইব্রেরিগুলি ব্যবহার করুন: বেশিরভাগ অ্যাপ্লিকেশনের জন্য, আপনার প্রয়োজনীয়তাগুলি অত্যন্ত বিশেষায়িত বা আপনি একাডেমিক গবেষণা করছেন তা ছাড়া, স্ক্র্যাচ থেকে তৈরি করার চেয়ে সু-পরীক্ষিত বিদ্যমান রাফ্ট বাস্তবায়ন (যেমন, etcd, HashiCorp এর রাফ্ট লাইব্রেরি থেকে) ব্যবহার করার কথা বিবেচনা করুন।
- কঠোর টেস্টিং অপরিহার্য: ফল্ট ইনজেকশন, প্রপার্টি-ভিত্তিক টেস্টিং এবং ব্যর্থতার পরিস্থিতির ব্যাপক সিমুলেশন কোনও ডিস্ট্রিবিউটেড কনসেনসাস সিস্টেমের জন্য অত্যন্ত গুরুত্বপূর্ণ। "এটি কাজ করে" বলে কখনও ধরে নেবেন না যতক্ষণ না আপনি এটি সম্পূর্ণরূপে ভেঙে দেন।
- গ্লোবাল লেটেন্সি জন্য ডিজাইন করুন: বিশ্বব্যাপী স্থাপনার সময়, বিভিন্ন ভৌগোলিক অঞ্চলের জুড়ে সামঞ্জস্যতা এবং কর্মক্ষমতা উভয়ই অপ্টিমাইজ করার জন্য আপনার কোরাম স্থাপন, নেটওয়ার্ক টপোলজি এবং ক্লায়েন্ট পঠন কৌশলগুলি সাবধানে বিবেচনা করুন।
-
স্থায়িত্ব এবং নির্ভরযোগ্যতা: নিশ্চিত করুন যে আপনার অন্তর্নিহিত স্টোরেজ স্তরটি শক্তিশালী এবং
fsyncবা সমতুল্য অপারেশনগুলি ক্র্যাশ পরিস্থিতিগুলিতে ডেটা হারাতে রোধ করার জন্য সঠিকভাবে ব্যবহৃত হয়।
যেহেতু ডিস্ট্রিবিউটেড সিস্টেমগুলির বিবর্তন অব্যাহত রয়েছে, রাফ্ট-এর নীতিগুলি—স্পষ্টতা, দৃঢ়তা এবং ফল্ট টলারেন্স—নির্ভরযোগ্য সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের মূল ভিত্তি হিসাবে থাকবে। রাফ্ট আয়ত্ত করার মাধ্যমে, আপনি ডিস্ট্রিবিউটেড কম্পিউটিংয়ের অনিবার্য বিশৃঙ্খলার মুখোমুখি হতে পারে এমন স্থিতিশীল, বিশ্বব্যাপী মাপযোগ্য অ্যাপ্লিকেশন তৈরি করার জন্য একটি শক্তিশালী সরঞ্জাম দিয়ে নিজেকে সজ্জিত করেন।