RedisRaft (উন্নতিমূলক) একটি নতুন মডিউল ওপেন সোর্স Redis-এর জন্য যা আপনাকে বেশ কিছু Redis সার্ভারকে একটি একক ফল্ট-টলারেন্ট, স্ট্রংলি কনসিস্টেন্ট ক্লাস্টার হিসেবে অপারেট করতে সক্ষম করে। নাম অনুযায়ী, এটি Raft কনসেনসাস অ্যালগরিদম এবং এটি বাস্তবায়নকারী একটি ওপেন-সোর্স C লাইব্রেরির ওপর ভিত্তি করে।
RedisRaft Redis এবং Redis ইকোসিস্টেমে একটি নতুন স্ট্রং-কনসিস্টেন্সি এবং স্ট্রিক সিরিয়ালাইজেশন ডিপ্লয়মেন্ট অপশন আনোয়েছে। নতুন মডিউলটি Redis-কে Redis-এর বিদ্যমান ক্লায়েন্ট, লাইব্রেরি, এবং ডেটা টাইপসহ ব্যবহার করা সম্ভব করে তোলে বিয়ন্ড-ক্যাশ সিনেরিওতে যেকোনো হাই রিলায়াবিলিটি ও কনসিস্টেন্সি প্রয়োজনীয়।
RedisRaft-এর সূচনা
RedisRaft একটি পরীক্ষামূলক "সাইড প্রজেক্ট" হিসেবে শুরু হয়েছিল Redis 5 রিলিজের מעט আগে। Redis মডিউল API Redis 4-এ চালু করা হয়েছিল, মূলত নতুন ডেটা টাইপ এবং কমান্ড বাস্তবায়নকারী মডিউল সাপোর্ট করার জন্য। আমরা এক্সপ্লোর করতে চেয়েছিলাম API কতটুকু ফেলা যায়, এবং মডিউল ব্যবহার করে Redis কে আরও র্যাডিক্যালভাবে এক্সটেন্ড করা। কিন্তু আমরা একই সাথে কিছু উপযোগী কিছুও চেয়েছিলাম—Redis-এর জন্য একটি স্ট্রং কনসিস্টেন্সি ডিপ্লয়মেন্ট অপশন।
একটি RedisRaft ক্লাস্টার একই লেভেলের কনসিস্টেন্সি ও রিলায়াবিলিটি অফার করে যেকোনো ভালো পরিচিত ডেটা স্টোরের মতো যেমন ZooKeeper বা Etcd। সংক্ষেপে, RedisRaft-এ:
- অনুমোদিত রাইটগুলো গ্যারান্টিডভাবে কমিট হয় এবং কখনো হারায় না।
- রিডগুলো সবসময় সবচেয়ে আপ-টু-ডেট কমিটেড রাইট রিটার্ন করে।
যে লেভেলের কনসিস্টেন্সি অফার করা হয় বিশ্বস্ত ডেটা স্টোরগুলো থেকে, সেরকম গ্যারান্টি পারফরমেন্স ও অভailability-এ ট্রেড-অফ নিয়ে আসে। RedisRaft-এ:
- ক্লায়েন্ট অপারেশন ক্লাস্টার নোডের মেসেজ এক্সচেঞ্জের ওপর ডিপেন্ড করে, তাই সেগুলো নেটওয়ার্ক ল্যাটেন্সির সাথে বাউন্ড হয়।
- রাইটগুলো ডিস্কে ফ্লাশ করার আগে কমপ্লিট হয় না, তাই সেগুলো ডিস্ক I/O ল্যাটেন্সির সাথে বাউন্ড হয়।
- ক্লাস্টার উপলব্ধ থাকে যতক্ষণ না মেজরিটি নোড আপ, হেলথি, এবং একে অপরের সাথে কমিউনিকেশন করতে পারে।
RedisRaft কীভাবে কাজ করে
একবার RedisRaft মডিউল Redis-এ লোড হলে, এটি ক্লাস্টার নোডের মধ্যে যোগাযোগ, Raft লগ বা স্ন্যাপশটের রেপ্লিকেশন, পায়ার্জেন্স, ইত্যাদি নিয়ন্ত্রণ করে। Redis কোর对此 অনুভব না করে এবং য ততক্ষণে তার কাছে, এটি একটি স্ট্যান্ডঅ্যালোন সার্ভার হিসেবে অপারেট করছে কোনো ক্লাস্টারিং, পায়ার্জেন্স, বা রেপ্লিকেশন ছাড়া।
একটি তিন-নোড RedisRaft ক্লাস্টার সেট আপ করা তিনটি Redis সার্ভার স্টার্ট করার মতো সহজ, নিচের মতো:
redis-server --loadmodule /path/to/redisraft.so
এইভাবে প্রথম সার্ভারে কানেক্ট করে Raft ক্লাস্টার তৈরি করুন:
10.0.0.1:6379> RAFT.CLUSTER INIT
OK 989645460313dd2ddb051f033c791222
তারপর অন্য দুটি সার্ভারে কানেক্ট করে সেগুলো ক্লাস্টারে জয়েন করুন:
10.0.0.2:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
OK
10.0.0.3:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
OK
ক্লাস্টার অ্যাক্সেস করা
RedisRaft সেট আপ হলে, আমরা আমাদের ক্লাস্টারে ডেটা লিখতে পারি:
10.0.0.1:6379> INCR counter:1
(integer) 1
রিপ্লাই পাওয়া দেখায় আমাদের রাইট কমপক্ষে ক্লাস্টার নোডের মেজরিটিতে (আমাদের কেসে ২ নোড) রেপ্লিকেট হয়েছে এবং তাদের পায়ার্জেন্ট স্টোরেজে কমিট হয়েছে।
Raft স্ট্রং-লিডার কনসেপ্টের ওপর ভিত্তি করে, অর্থাৎ সকল ক্লায়েন্ট অপারেশন লিডার নোডে যেতে হবে এবং সেখান থেকেই শুরু হবে। এই কেসে, আমাদের ক্লায়েন্ট আসলে লিডারের সাথে কানেক্টেড ছিল, কিন্তু ক্লাস্টার লিডারশিপ ডাইনামিক এবং ক্লায়েন্টগুলো যেন যেন লিডার কেARE জানতে পারে না।
একই অপারেশন একটি ফলোয়ার (নন-লিডার) নোডে ট্রাই করলে এই রেসপন্স আসে:
10.0.0.3:6379> INCR counter:1
(error) MOVED 10.0.0.1:6379
তো একটি ক্লায়েন্ট হিসেবে, আমরা এই এরর ক্যাচ করতে পারি, নির্দিষ্ট লিডার নোডের সাথে পুনরায় কানেকশন প্রতিষ্ঠা করতে পারি, এবং আমাদের কমান্ড রিট্রাই করতে পারি।
কিন্তু যদি আমরা আমাদের বিদ্যমান অ্যাপ্লিকেশন মডিফাই করতে না চাই? خوشখবর, RedisRaft কনফিগার করা যায় এটি অটোমেটিক্যালি হ্যান্ডেল করার জন্য। ফলোয়ার প্রক্সি মোড এনেবল করে, আমরা ক্লাস্টার নোডকে আমাদের রিকোয়েস্ট লিডারকে ফরওয়ার্ড করতে এবং রিপ্লাই উপলব্ধ হলে দিতে পারি:
10.0.0.3:6379> RAFT.CONFIG SET follower-proxy yes
OK
10.0.0.3:6379> INCR counter:1
(integer) 2
এটি অনেক সিম্পল, অবশ্যই, কিন্তু ল্যাটেন্সি ও নেটওয়ার্ক লোডে প্রভাব ফেলে কারণ নন-লিডার নোডে হিট করলে একটি এক্সট্রা নেটওয়ার্ক হপ তৈরি হয়।
ক্লাস্টার পরিবর্তন
আমাদের ক্লাস্টার সেট আপ করার সময়, আমরা আসলে তিনটি স্বতন্ত্র অপারেশন করেছি:
- একটি নোডে ক্লাস্টার তৈরি করলাম।
- দ্বিতীয় নোড যোগ করলাম।
- তৃতীয় নোড যোগ করলাম।
RedisRaft ক্লাস্টার কনফিগারেশন স্ট্যাটিক নয়, এবং ক্লাস্টার তৈরি হওয়ার পর এবং সক্রিয় থাকার সময় অতিরিক্ত নোড যোগ বা রিমুভ করা সম্ভব।
উদাহরণস্বরূপ, আমাদের তৃতীয় নোড রিপ্লেস করতে হতে পারে। প্রথমে, একটি নতুন নোড জয়েন করুন যা সেটি রিপ্লেস করবে। লক্ষ্য করুন আমরা "অ্যাড-দেন-রিমুভ" করছি "রিমুভ-দেন-অ্যাড" না, যাতে ট্রানজিশন সময়ে ক্লাস্টার এবং আমাদের মূল্যবান ডেটা ডিগ্রেডেড রিডান্ডেন্সি স্টেটে না পড়ে:
10.0.0.4:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
OK
এরপর, আমাদের তৃতীয় নোডে র্যান্ডমলি অ্যাসাইন করা ID লুক আপ করুন:
redis-cli -h 10.0.0.1 --raw RAFT.INFO | grep 10.0.0.3
node2:id=1739451728,state=connected,voting=yes,addr=10.0.0.3,port=6379,
last_conn_secs=3537,conn_errors=0,conn_oks=1
তারপর সেটি রিমুভ করুন:
10.0.0.1:6379> RAFT.NODE REMOVE 1739451728
OK
RedisRaft রিলিজ স্ট্যাটাস
RedisRaft ডেভেলপমেন্ট কাজের অংশ হিসেবে, আমরা Kyle Kingsbury (a.k.a Aphyr) এর সাথে কলাবোরেট করেছি RedisRaft Jepsen দিয়ে বিশ্লেষণ ও টেস্ট করার জন্য, একটি সুপরিচিত ফ্রেমওয়ার্ক ডিস্ট্রিবিউটেড সিস্টেমের সেফটি ও করেক্টনেস টেস্ট করার জন্য। এই কলাবোরেশন আজ পর্যন্ত এই পাবলিশড অ্যানালিসিস-এ ফলাফল দিয়েছে।
যদিও এখনও উন্নতিমূলক, RedisRaft-এর অধিকাংশ বেসিক ফাংশন্যালিটি জায়গা পেয়েছে। আমরা বর্তমানে একটি ফার্স্ট প্রিভিউ ভার্সন অর্জনের দিকে কাজ করছি, যা এক-दুই মাসে উপলব্ধ হয়ে যাওয়া আশা করা হয়। সাধারণভাবে উপলব্ধ হলে, RedisRaft ডুয়াল লাইসেন্সে রিলিজ হবে, либо GNU AGPLv3 অথবা Redis Source Available License (RSAL)।