বর্তমানে পরীক্ষা চলছে: সম্পূর্ণ হলে GitHub কোড উন্মুক্ত করা হবে।

Raft প্যারামিটার

বিষয়মান
হার্টবিট ব্যবধান৫০০ms (cluster_heartbeat_ms)
সাড়াহীন বিবেচনার সময়২০০০ms (cluster_election_timeout_ms) — হার্টবিট এতক্ষণ বন্ধ থাকলে লিডার মারা গেছে ধরা হয়
প্রকৃত নির্বাচন শুরুর পরিসর১৭৫০ ~ ২০০০ms — প্রতিটি নোডে এলোমেলোভাবে ছড়ানো, যাতে একসাথে প্রার্থী হওয়া (split vote) না ঘটে। সর্বোচ্চ মানটিই সেট করা সাড়াহীন-বিবেচনার সময়
লিডার ব্যর্থতায় ক্লায়েন্টের থমকে থাকাপরিমাপে সাড়াহীন বিবেচনার সময় + ০.৩~০.৫ সেকেন্ড (ডিফল্টে প্রায় ২.৩~২.৫ সেকেন্ড) — শনাক্তকরণের পর একবার রিডাইরেক্ট
নোড সংখ্যা৩ অথবা ৫ (কনফিগ লোডে বাধ্যতামূলক — অন্য সংখ্যায় বুট প্রত্যাখ্যাত)
নোড IDcluster_peers তালিকায় নিজের (cluster_self) অবস্থান — তাই তালিকার ক্রম সব নোডে অভিন্ন হতে হবে
বুটস্ট্র্যাপচালুর ৫০০ms পর সব নোড একই মেম্বার গঠন দিয়ে ইনিশিয়ালাইজড হয় — ইতিমধ্যে ইনিশিয়ালাইজড ক্লাস্টারে যোগ দিলে উপেক্ষিত হয়
লগ সংরক্ষণইন-মেমরি (উদ্বায়ী) — পুনরায় চালু হওয়া নোড রেপ্লিকেশন/স্ন্যাপশট দিয়ে পুনরুদ্ধার করে
lease মেয়াদ-শেষ শনাক্তকরণলিডার ১০০ms পর্যায়ক্রমে শনাক্ত করে ঐকমত্যের মাধ্যমে Expire কমিট করে
wait টাইমআউটের সূক্ষ্মতাঅপেক্ষা টাইমআউট (T)-ও একই ১০০ms টিকে নির্ধারিত হয় — সর্বোচ্চ ১০০ms দেরিতে আসতে পারে
লিডার বদলের বিজ্ঞপ্তিলিডার বদলালে সংযুক্ত সব ক্লায়েন্টকে সঙ্গে সঙ্গে L পাঠানো হয়

হার্টবিট ও সাড়াহীন-বিবেচনার সময় বাছাই

দুটি মানই কনফিগে cluster_heartbeat_mscluster_election_timeout_ms দিয়ে নিয়ন্ত্রণ করা হয়। সাড়াহীন বিবেচনার সময় (T)-ই লিডার ব্যর্থ হলে সেবা যতক্ষণ থমকে থাকে সেই সময়; উল্টো দিকে খুব ছোট হলে জীবিত লিডারকেই মৃত ধরে অপ্রয়োজনীয় নির্বাচন ঘটে।

হার্টবিট / Tশনাক্তকরণের পরিসরলিডার kill-এ সর্বোচ্চ বিলম্ব (পরিমাপ)প্রস্তাবিত পরিবেশ
১০০ms / ৬০০ms৪৫০~৬০০msপ্রায় ০.৯ সেকেন্ডএকই র‍্যাক·একই AZ, অত্যন্ত স্থিতিশীল লেটেন্সি
১০০ms / ১০০০ms৭৫০~১০০০msপ্রায় ১.২ সেকেন্ডএকই AZ
২৫০ms / ২৫০০ms১৮৭৫~২৫০০msপ্রায় ২.৮ সেকেন্ডমাল্টি-AZ
৫০০ms / ২০০০ms১৭৫০~২০০০msপ্রায় ২.৪ সেকেন্ডডিফল্ট — মাল্টি-AZ-এ ভারসাম্য
৫০০ms / ৫০০০ms৩৭৫০~৫০০০msপ্রায় ৫.৩ সেকেন্ডক্রস-রিজিয়ন, বা লেটেন্সি বেশি ওঠানামা করে এমন পরিবেশ
  • স্বাভাবিক অবস্থায় প্রক্রিয়াকরণের বিলম্ব এই মানগুলোর সাথে সম্পর্কহীন (পরিমাপে p50 বদলায়নি) — এগুলো শুধু ব্যর্থতার সময় পুনরুদ্ধারের সময় নির্ধারণ করে।
  • ফলোয়ার মারা গেলে কোনো মানেই ক্লায়েন্টে প্রভাব পড়ে না। উপরের বিলম্ব শুধু লিডার মারা গেলেই ঘটে।
  • সীমাবদ্ধতা: cluster_election_timeout_ms অন্তত ৬০০ms হতে হবে, এবং হার্টবিটের ৪ গুণ বা বেশি হতে হবে। (লোডের সময় একবার শিডিউলিং বিলম্বে দুটি হার্টবিট পুরোপুরি গিলে ফেলার ঘটনা পরিমাপ করা হয়েছে।)

নোড সংখ্যা ৩ বা ৫ কেন

কমিটের জন্য সংখ্যাগরিষ্ঠতা দরকার। জোড় সংখ্যার গঠন শুধু খরচ বাড়ায়, ব্যর্থতা-সহনশীলতা বাড়ায় না, তাই সার্ভার তা প্রত্যাখ্যান করে।

নোড সংখ্যাসংখ্যাগরিষ্ঠতাএকসাথে সহনীয় ব্যর্থতা
০টি — একটি মারা গেলেই থেমে যায়। সিঙ্গেল মোডের চেয়ে ভালো কিছু না
১টি
১টি — ৩-এর মতোই (শুধু খরচ বাড়ে)
২টি

ব্যর্থতার সময় আচরণের সারসংক্ষেপ

পরিস্থিতিআচরণ
লিডার নয় এমন নোডে ক্লায়েন্ট অনুরোধM (লিডারের ঠিকানা), লিডার অজানা হলে E no_leader
লিডার ব্যর্থতা৫০০-১০০০ms-এর মধ্যে নতুন লিডার নির্বাচিত। এর মাঝে অনুরোধে E no_leader → ক্লায়েন্ট আবার চেষ্টা করে
লিডার বদলের মুহূর্তেঅপেক্ষমাণ অর্জন অনুরোধ M/E no_leader দিয়ে পরিষ্কার হয় এবং ক্লায়েন্ট নতুন লিডারে আবার চেষ্টা করে
নোড পুনরায় চালুখালি স্টেটে বুট → পিয়ারের লগ রেপ্লিকেশন/স্ন্যাপশট দিয়ে ধরে ফেলে
সংখ্যাগরিষ্ঠতা হারানোকমিট অসম্ভব হয়ে যায় → লেখা বন্ধ (নিরাপত্তা প্রথম), সংখ্যাগরিষ্ঠতা ফিরে এলে স্বয়ংক্রিয়ভাবে আবার শুরু

পরিভাষা

  • সংখ্যাগরিষ্ঠতা (quorum) — মোট নোডের অর্ধেকের বেশি (৩-এ ২টি, বা ৫-এ ৩টি)। যেকোনো সিদ্ধান্তে সংখ্যাগরিষ্ঠতার সম্মতি লাগে বলে, বিচ্ছিন্ন হয়ে যাওয়া দুটি গ্রুপ কখনো একই সাথে ভিন্ন সিদ্ধান্ত কমিট করতে পারে না।
  • নির্বাচন টাইমআউট (election timeout) — হার্টবিট ছাড়া কতক্ষণ অপেক্ষার পর একজন ফলোয়ার লিডার মারা গেছে ধরে নিয়ে নির্বাচন শুরু করে। প্রতি নোডে এলোমেলোভাবে ভিন্ন, যাতে একসাথে অনেকে প্রার্থী না হয়ে যায়।