মেমক্যাশড

মেমক্যাশড কী? মেমক্যাশড-এর ওয়েবসাইটে লেখা আছে :

Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

memcached_banner75

এটা না বুঝলে সমস্যা নাই। সহজ ভাষায় মেমক্যাশড হচ্ছে কি-ভ্যালু স্টোর। কি-ভ্যালু স্টোর আবার কী? জিনিসটা আসলে হ্যাশটেবল, ম্যাপ বা পাইথনের ডিকশনারি-এর মতো। প্রতিটা ডাটার একটা কি থাকবে, সেই কি দিয়ে সহজেই ডাটা একসেস করা যাবে। একটা কি দিয়ে একটা ডাটা (ভ্যালু) পাওয়া যাবে, আবার একটা ভ্যালুর জন্য একটা কি থাকবে। যেমন প্রতিটি দেশের একটি তিন অক্ষরের কোড থাকে, আমরা চাইলে সেই কোড দিয়ে দেশের নামটা জেনে নিতে পারে। এক্ষেত্রে কোড হচ্ছে কি, আর দেশের নাম হচ্ছে ভ্যালু। পাইথনে যদি আমরা একটি ডিকশনারি তৈরি করি, তাহলে এরকম হবে:
alpha_code = {“BGD”: “Bangladesh”, “AUS”: “Australia”, “DEU”: “Germany”, “SGP”: “Singapore”}
এখন print alpha_code[“BGD”] লিখলে Bangladesh প্রিন্ট হবে।

আমরা যদি চাই, আমাদের প্রোগ্রাম বন্ধ হয়ে গেলেও ডাটা যেন হারিয়ে না যায়, তাহলে উপায় কী? সহজ উপায় হচ্ছে ফাইল ব্যবহার করা। আর বেশি ডাটার ক্ষেত্রে উপায় হচ্ছে ডাটাবেজ ব্যবহার করা। এখন ফাইল ব্যবহার করলে ফাইল ওপেন করা, ফাইল থেকে রিড করা, ফাইল ক্লোজ করা – এসব কাজে কিছুটা সময় ব্যায় হয়। তেমনি ডাটাবেজের জন্যও কানেকশন তৈরি করা, কুয়েরি করা, কুয়েরি থেকে রেজাল্ট পড়া, এতেও সময় ব্যায় হয়। উভয় ক্ষেত্রেই ডাটা হার্ড ডিস্কে থাকে। এখন এই ডাটা যদি হার্ড ডিস্কে না রেখে রেমে রাখার ব্যবস্থা করা যেত, তাহলে খুব দ্রুত সেই ডাটা পড়া যেত। কারণ হার্ড ডিস্ক একসেস করার চেয়ে মেমোরি একসেস করার কাজটি প্রসেসর অনেক দ্রুত করতে পারে। তাই বলে সব ডাটা তো আর রেমে রাখা যাবে না, যেসব ডাটা খুব ঘনঘন একসেস হচ্ছে সেসব ডাটা মেমোরিতে রাখা যায়। এই মেমোরিতে ডাটা রাখার ব্যবস্থাটি সহজ করে দিয়েছে মেমক্যাশড।

ক্যাশ করা মানে হচ্ছে ডাটা তৈরি করে রাখা। ধরা যাক, টুইটারের মতো একটি ওয়েবসাইটের একটি ফিচার হচ্ছে ট্রেনডস্ যেখানে সবচেয়ে আলোচিত দশটি বিষয় থাকে এবং এটি দশ মিনিট পরপর আপডেট করা হয়।

Screen Shot 2015-07-11 at 3.46.51 pm

এখন এই দশ মিনিটের ভেতরে কিন্তু কোটি কোটি ব্যবহারকারি টুইটারের ওয়েবসাইট একসেস করছে। তো প্রতিবার যদি টুইটার ডাটাবেজে একটা কুয়েরি চালাত সেরা দশটি আলোচিত বিষয় খুঁজে বের করার জন্য, তাহলে কিন্তু সার্ভারের ডাটাবেজে লোড অনেক বেড়ে যেত আর সেই লোড সামলানো মোটামুটি অসম্ভব হয়ে পড়ত। আর প্রত্যেকের জন্য কিন্তু একই ফলাফল। তাই সেটা যদি মেমোরিতে রেখে দেওয়া যায়, আর সার্ভারে কোনো রিকোয়েস্ট আসলে মেমোরি থেকেই সেটা পড়ে ফেলা যায়, তাহলে দারুণ ব্যাপার হয়। আর সার্ভারে একটা স্ক্রিপ্ট চলবে যেটা দশ মিনিট পরপর মাত্র একটা কুয়েরি চালাবে আর ডাটাবেজে থেকে ডাটা এনে মেমোরিতে রেখে দিবে।

আরেকটি উদাহরণ দেওয়া যাক। ধরা যাক, আমরা কোনো পরীক্ষার ফল প্রকাশ করার জন্য একটি ওয়েবসাইট বানাবো। সবার পরীক্ষার ফলাফল ডাটাবেজে সংরক্ষিত আছে। এখন ওয়েবসাইটে ফল প্রকাশ করার কয়েকমিনিটের মধ্যে বা কয়েকঘণ্টার মধ্যে হাজার হাজার (লাখ লাখও হতে পারে) শিক্ষার্থী ও তাদের অভিভাবক ওয়েবসাইটে এসে হুমড়ি খেয়ে পড়বেন ফলাফল দেখার জন্য। এখন সব ফলাফল যদি ডাটাবেজ থেকে সিলেক্ট কুয়েরি করে দেখাতে হয়, তাহলে কিন্তু ডাটাবেজ সেই লোড সামলাতে পারবে না। কথা হচ্ছে, পরীক্ষার ফল যখন তৈরি হয়ে যায়, তখন কিন্তু সেটি পরিবর্তনের সম্ভাবনা খুবই কম। তাই ফলাফল যদি মেমোরিতে রেখে দেওয়া হয় এবং সার্ভারে রিকোয়েস্ট আসলে সেখান থেকেই জবাব দিয়ে দেওয়া যায়, তাহলে ডাটাবেজের লোড অনেকখানি কমিয়ে দেওয়া সম্ভব। তাহলে আমাদের অ্যালগরিদম হবে এরকম :

১) পরীক্ষার্থীর রোল নাম্বার ইনপুট দেওয়া হলো।
২) রোল নাম্বারটি সার্ভার একটি কি-ভ্যালু স্টোরের মধ্যে খুঁজে দেখতে হবে রোল নাম্বারটি কি হিসেবে ব্যবহার করলে সেটির জন্য কোনো ভ্যালু তৈরি করা আছে কী না। যদি থাকে তাহলে ৫ নম্বর ধাপে যেতে হবে (এটিকে বলে ক্যাশ হিট) আর যদি না থাকে তবে ৩ নম্বর ধাপে যেতে হবে (একে বলে ক্যাশ মিস)।
৩) ডাটাবেজে কুয়েরি করে রেজাল্ট আনতে হবে।
৪) রেজাল্ট ক্যাশে (মেমোরিতে) সংরক্ষণ করতে হবে। যাতে পরবর্তি সময়ে কেউ আবার এই রোল নাম্বারের জন্য রেজাল্ট জানতে চায়, তাহলে আর ডাটাবেজে কুয়েরি করার দরকার পরবে না।
৫) ক্লায়েন্টকে রেজাল্ট রিটার্ন করতে হবে।

মেমক্যাশের মাধ্যমে কাজটি খুব সহজে করা যায়।

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

তারপর “Smarts half in client, half in server.” এখানে কিন্তু ক্লায়েন্ট এবং সার্ভার দুইটা অংশ আছে। মেমক্যাশড-এ একটা সার্ভার চলতে থাকে, সেই সার্ভার-এর মধ্যে ডাটাগুলা থাকে (আসলে সার্ভার সমস্ত ডাটা মেমরি (RAM)-এর মধ্যে রাখে)। আর ক্লায়েন্ট কী করে? ক্লায়েন্ট সিদ্ধান্ত নেয় যে এখন অমি যে ডাটা আনার জন্য সার্ভারকে কল করব, কোন কি (Key) দিয়ে কল করব?

তারপর আরেকটা মজার ব্যাপার হচ্ছে যে ক্লায়েন্ট কিন্তু একটা না, অনেকগুলা সার্ভার এর সাথেই কমিউনিকেট করতে পারে। খুব বড় অ্যাপ্লিকেশনে আমাদের অনেকগুলা সার্ভার নিয়ে কাজ করতে হয় ও লোড ব্যালেন্সিং করতে হয়। মেমক্যাশড আমাদেরকে একাধিক সার্ভারে ডাটা রাখার সুবিধা দেয়। মেমক্যাশড্ অনেকগুলা সার্ভার এ রেখে দেওয়ার সুবিধা হচ্ছে, যে “Servers are disconnected from each other”, মানে একটা সার্ভার এর সাথে আরেকটা সার্ভার এর কোন সম্পর্ক নাই। তাহলে আমাদের সুবিধা যেটা, যে আমরা যখন নতুন কোন সার্ভার যুক্ত করব তখন বাকীদের সাথে synchronization বা crosstalk বা নিজেদের মধ্যে ব্রডকাস্ট এর কোন ব্যাপার নাই। আবার যখন কোনো সার্ভার বাদ দিয়ে দিব তখন শুধু ওই সার্ভারে যে ডাটাগুলা আছে সেগুলাই শুধু ক্যাশ খুঁজে পাবে না। বাকী সার্ভার-এর ডাটা যেমন ছিল তেমনি থাকবে। আর আমরা নিজেরা কিন্তু প্রোগ্রামিং করার সময় ঠিক করে দিতে পারব না যে ডাটা কোন সার্ভার এর ক্যাশ এ থাকবে? (সেটা কোন সার্ভার এর ক্যাশ এ সেটা জানতে চাইলে আমরা telnet দিয়ে হিট করে দেখতে পারি আসলে এটা কোন ক্যাশ এ আছে, ক্যাশ এর key টা দিয়ে)।

আর সবচেয়ে বড় সুবিধা হচ্ছে O(1) এ আমরা সবকিছু নিয়ে আসতে পারি। (এটা না বুঝলে হাম্মাদ আলী স্যারের ডিসক্রিট ম্যাথ কোর্সটা করে ফেলতে হবে)।

আরেকটা হচ্ছে “Forgetting data is a feature”, আমরা ভ্যালুর এক্সপায়ার টাইম ঠিক করে দিতে পারি। সেই সময় পরে ডাটা ক্যাশ থেকে আপনাআপনি মুছে যাবে। এটা খুব গুরুত্বপূর্ণ ও সুন্দর একটা ফিচার।

তারপরের ফিচারটা হচ্ছে “Cache invalidation is trivial”। আসলে কম্পিউটার সাইন্স এ নাকি দুইটা প্রবলেম খুবই হার্ড প্রবলেম হিসেবে চিহ্নিত করা হয়। প্রথম প্রবলেম হচ্ছে naming প্রবলেম। যে আমরা কোনকিছুর নাম ঠিক করে দিতে পারি না, এটা সবসময়ই হার্ড (কঠিন) প্রবলেম। দ্বিতীয় হার্ড প্রবলেম হচ্ছে ক্যাশিং ভেলিডেশন। এটাও হার্ড প্রবলেম, মানে আমরা যখন ক্যাশটাকে ইনভেলিড করি তখন অনেক জায়গায় অনেক রকম ঝামেলার সৃষ্টি হতে পারে। তো মেমক্যাশড্ এ এই জিনিসটা অনেকটা সহজ হলেও ব্যবহার করার সময় আমাদের নিজেদের কিছু সতর্কতার প্রয়োজন। একটা ডাটা কিন্তু অনেকগুলা ক্যাশ কি-তে রাখতে পারি বিভিন্ন প্রয়োজনে। তখন আমরা যেটা করব তখন আমাদের মাথায় রাখতে হবে প্রোগ্রামিং করার সময় বা ডিজাইন করার সময় যে এখন যদি অমি একটা জিনিস আপডেট (update) করব বা বাদ দিব (invalid করব), তখন সাথে সাথে সংশ্লিষ্ট আর কোথায় কোথায় আমাদের সেই কাজটি করতে হবে। কোনো একটা জায়গায় ভুলে গেলে কিন্তু ঝামেলা হয়ে যাবে। তখন এমন হতে পারে যে ওয়েবসাইটের হোমপেজে দেখাচ্ছে তামিম ইকবাল আউট কিন্তু স্কোরবোর্ডে সেটা দেখাচ্ছে না!

মেমক্যাশড নিয়ে মুক্তসফটে অনেক বছর আগে একটি প্রেজেন্টেশন দিয়েছিলাম, সেটির ভিডিও দেখা যাবে এখানে :

আর স্লাইডগুলো পাওয়া যাবে এখানে

আর আরো জানতে হলে মেমক্যাশডের অফিশিয়াল ওয়েবসাইট-এ যেতে হবে।

মেমক্যাশডের সঠিক ব্যবহার ডেভেলাপার ও ব্যবহারকারীদের জীবনে শান্তি বয়ে আনুক।