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

Ticketing সার্ভার ডিপ্লয়মেন্ট

এনভায়রনমেন্ট
শেল
মোড
bash
ক্লায়েন্ট সংযোগ উদাহরণ
rust
nc দিয়ে দ্রুত পরীক্ষা
bash

এনভায়রনমেন্ট ভ্যারিয়েবল

সার্ভার কনফিগারেশন সম্পূর্ণভাবে এনভায়রনমেন্ট ভ্যারিয়েবল দিয়ে হয়। কী কেস-অসংবেদনশীল, খালি মান মিসেট হিসেবে গণ্য হয়, আর ফ্ল্যাগ-জাতীয় মান শুধু 1/true/yes/on হলেই সত্য। Docker ইমেজ scratch-ভিত্তিক, তাই কনফিগ কোনো কনফিগ ফাইল ছাড়াই শুধু এনভায়রনমেন্ট ভ্যারিয়েবল দিয়ে ইনজেক্ট করা হয়।

এনভায়রনমেন্ট ভ্যারিয়েবলডিফল্টবিবরণ
PORT5225সিঙ্গেল মোডে লিসেন পোর্ট। ক্লাস্টার মোডে উপেক্ষিত, তখন CLUSTER_SELF-এর পোর্ট ব্যবহৃত হয়
SOCKET_BIND0.0.0.0লিসেন ঠিকানা
CLIENT_TOKENS(নেই)ক্লায়েন্ট প্রমাণীকরণ টোকেনের কমা-বিভক্ত তালিকা। মিসেট হলে খালি টোকেন অনুমোদিত
CLUSTER_SELF(নেই)এই নোডের বিজ্ঞাপিত ঠিকানা, host:port। উপস্থিত থাকলে ক্লাস্টার মোড সক্রিয় হয়
CLUSTER_PEERS(নেই)সব নোডের বিজ্ঞাপিত ঠিকানার কমা-বিভক্ত তালিকা। ঠিক ৩ বা ৫টি, সব নোডে একই ক্রম, অবশ্যই self অন্তর্ভুক্ত
CLUSTER_TOKENS(নেই)পিয়ার-টু-পিয়ার প্রমাণীকরণ টোকেনের কমা-বিভক্ত তালিকা
TLS_CERT / TLS_KEY(নেই)সার্টিফিকেট/প্রাইভেট কী PEM ফাইলের পাথ — TLS সক্রিয় করতে দুটোই একসাথে সেট করুন
TLS_CA(নেই)পিয়ার সার্টিফিকেট যাচাইয়ের CA — মিসেট হলে সিস্টেম ট্রাস্ট স্টোরে ফিরে যায়
TLS_SKIP_VERIFYfalseপিয়ার সার্টিফিকেট যাচাই বাদ দেয় — শুধু টেস্টের জন্য
DOCKERfalseক্লাস্টার মোডে অভ্যন্তরীণ লিসেন পোর্ট 5225/6225-এ আটকে রাখে — অফিসিয়াল ইমেজে ডিফল্টভাবে সেট করা
DEBUGবিল্ড-নির্ভর1/true হলে ডিবাগ লগিং সক্রিয়

সম্পূর্ণ নিয়মের জন্য (পোর্ট নির্ধারণ, বিজ্ঞাপিত ঠিকানা, শূন্য-ডাউনটাইম টোকেন ঘোরানো ইত্যাদি) দেখুন কনফিগারেশন (এনভায়রনমেন্ট ভ্যারিয়েবল)

সিঙ্গেল বনাম ক্লাস্টার

  • সিঙ্গেল (১ নোড): CLUSTER_* ছাড়া নোড একাই চলে। সবচেয়ে দ্রুত, কিন্তু পুনরায় চালুতে সংক্ষিপ্ত বিরতি হয়, আর স্টেট ইন-মেমরি বলে পুনরায় চালু হলে হারিয়ে যায় (lease সুরক্ষা জাল)।
  • ক্লাস্টার (নিরবচ্ছিন্ন): ৩ বা ৫টি নোড। নোডগুলো Raft ঐকমত্যের মাধ্যমে একটি একক লক-স্টেট শেয়ার করে — শুধু লিডার অনুরোধ প্রক্রিয়া করে, আর প্রতিটি স্টেট পরিবর্তন সংখ্যাগরিষ্ঠ কমিটের পরই চূড়ান্ত হয়। লিডার মারা গেলে ০.৫-১ সেকেন্ডের মধ্যে নতুন লিডার নির্বাচিত হয়, এবং সংখ্যাগরিষ্ঠতা চালু থাকা পর্যন্ত লক-স্টেট ও সেবা চালু থাকে। বিস্তারিত ব্যাখ্যার জন্য দেখুন কার্যপ্রণালী এবং প্রোটোকল (ক্লাস্টার)
  • প্রতিটি ক্লাস্টার নোড ক্লায়েন্ট পোর্টের পাশাপাশি একটি Raft পোর্ট (ক্লায়েন্ট পোর্ট + ১০০০)-ও শোনে — ফায়ারওয়ালে দুটো পোর্টই খুলুন।

Kubernetes ক্লাস্টার ডিপ্লয়মেন্ট একটি StatefulSet + হেডলেস সার্ভিস ব্যবহার করে। প্রতিটি পডকে একটি স্থিতিশীল DNS নাম দিন (ticketing-0.ticketing…, ticketing-1.ticketing…), সেই নামগুলো CLUSTER_PEERS-এ বসান, আর প্রতিটি পডের CLUSTER_SELF downward API (metadata.name) দিয়ে স্বয়ংক্রিয়ভাবে ইনজেক্ট করুন।

নিরবচ্ছিন্ন পুনরায় চালু (রোলিং)

মূল নিয়ম একটাই — সংখ্যাগরিষ্ঠতা সবসময় চালু থাকতে হবে (৩টির মধ্যে একসাথে সর্বোচ্চ ১টি বন্ধ)।

  1. ফলোয়ার দিয়ে শুরু করুন, একে একে পুনরায় চালু করুন। পুনরায় চালু হওয়া নোড রেপ্লিকেশন বা স্ন্যাপশট দিয়ে ধরে ফেললে পরেরটিতে যান।
  2. শেষে, লিডারকে নামান — ০.৫-১ সেকেন্ডের মধ্যে নতুন লিডার নির্বাচিত হয়, আর ক্লায়েন্ট স্বচ্ছভাবে সরে যায়।
  3. বন্ধ থাকা নোড আবার চালু করলে সেটি ফলোয়ার হিসেবে যোগ দেয়।

বিস্তারিত ধাপের জন্য দেখুন নিরবচ্ছিন্ন পুনরায় চালু (রোলিং) পদ্ধতি

রেফারেন্স

  • ইমেজ: sarolab/ticketing · Github: saro-lab/ticketing
  • ক্লায়েন্ট (ব্রোকার)-এ প্রতিটি নোডের ঠিকানা নিবন্ধন করুন যাতে স্বয়ংক্রিয়ভাবে ফেইলওভার হয়। ভাষাভিত্তিক ব্যবহারের জন্য দেখুন লাইব্রেরি