বাহ, এটি একটি সাধারণ প্রশ্ন, যা সম্ভাব্য উত্তরের বিশাল অ্যারে। আপনার প্রশ্নের আরও সুস্পষ্ট অংশ আপনাকে জিজ্ঞাসা করবে যে আপনার ডাটাবেসের সাথে সরাসরি বা ওয়েব পরিষেবাদির মাধ্যমে ইন্টারফেস করা আরও স্কেলযোগ্য কিনা। এই উত্তরটি সহজ: সরাসরি ডাটাবেসটি জিজ্ঞাসা করুন। ওয়েব পরিষেবাদির মধ্য দিয়ে যাওয়ার ফলে পুরো ফ্যাশনে যোগ হয়েছে যা ফায়ারওয়ালের পিছনে কোড অপারেটিংয়ের জন্য সম্পূর্ণ অপ্রয়োজনীয় (বড় এবং বড়)। উদাহরণস্বরূপ একটি ওয়েব পরিষেবাতে কোনও অনুরোধ পাওয়ার জন্য এটির ডিজনিয়ালাইজেশন, ডিবিকে জিজ্ঞাসা করা, একটি প্রতিক্রিয়া সিরিয়ালাইজ করতে এবং এটি ফিরিয়ে আনতে কিছু উপাদান প্রয়োজন। সুতরাং যদি আপনার কোডগুলি সমস্ত ফায়ারওয়ালের পিছনে কাজ করে থাকে তবে নিজেকে ঝামেলা বাঁচান এবং কেবল ডিবিটিকে সরাসরি জিজ্ঞাসা করুন।
কোনও ওয়েব সাইটকে স্কেলেবলযোগ্য করা আপনার প্রাথমিকভাবে জিজ্ঞাসা করা প্রশ্নটি ছাড়িয়ে যায়। সুতরাং আমি যদি এখানে কোনও স্পর্শকাতর লোকটি ছেড়ে যাই তবে আমাকে ক্ষমা করুন, তবে আমি ভেবেছিলাম যে আপনি বিশেষত ফেসবুকের উল্লেখ করেছেন তা বিবেচনা করে এটি কার্যকর হতে পারে।
আমি আপনাকে ব্র্যাড ফিৎসপ্যাট্রিক (লাইভ জার্নালের প্রতিষ্ঠাতা এবং এখন গুগলে) দ্বারা নির্মিত কাজ এবং সরঞ্জামগুলি পড়ার পরামর্শ দিচ্ছি। আমি যখন তার সাথে সিক্স অ্যাপার্টমেন্টে কাজ করেছি, তখন তাঁর কাছ থেকে আমি শিখেছি এমন কয়েকটি জিনিস এবং লাইভ জার্নালসের আর্কিটেকচার সম্পর্কে এটি এটিকে এত পরিমাণে স্কেলযোগ্য করে তুলেছে।
বিস্তৃতগুলির বিপরীতে সরু ডাটাবেস সারণী ব্যবহার করুন । যা সম্পর্কে আকর্ষণীয় ছিল তা শিখছিল কী এই আর্কিটেকচারকে অনুপ্রাণিত করেছিল, যা এমন একটি সিস্টেম তৈরি করছিল যা সহজে এবং দ্রুত তৈরি হয়েছিলআপগ্রেড করা হয়েছে। আপনি যদি বিস্তৃত সারণী, বা সারণীগুলির জন্য প্রতিটি ক্ষেত্র বা সম্পত্তি একটি কলাম হিসাবে ব্যবহার করেন, যখন ডাটাবেস স্কিমা আপগ্রেড করার সময় আসে, উদাহরণস্বরূপ একটি নতুন কলাম যুক্ত করার পরে সিস্টেমটি স্কিমার সময় টেবিলটি লক করতে হবে will পরিবর্তন বাস্তবায়িত হয়। স্কেল অপারেটিং করার সময় এর অর্থ হ'ল ডাটাবেস স্কিমাতে একটি সাধারণ পরিবর্তনের ফলে একটি বৃহত ডাটাবেস বিভ্রাট হতে পারে। যা সুস্পষ্টভাবে চুষে ফেলে। অন্যদিকে একটি সংকীর্ণ টেবিল কেবলমাত্র কোনও বস্তুর সাথে সম্পর্কিত প্রতিটি পৃথক সম্পত্তি ডাটাবেসে একক সারি হিসাবে সঞ্চয় করে। অতএব আপনি যখন ডাটাবেসে একটি নতুন কলাম যুক্ত করতে চান তখন আপনাকে কেবল একটি টেবিলের মধ্যে INSERT রেকর্ড করতে হবে যা একটি লকিং-না করা ক্রিয়াকলাপ। ঠিক আছে, এটি একটি সামান্য ব্যাকগ্রাউন্ড, আসুন দেখুন কীভাবে এই মডেলটি লাইভ জার্নালের মতো কার্যকারী সিস্টেমে অনুবাদ করে।
ধরা যাক আপনি কোনও ব্যক্তির ব্লগে সর্বশেষ 10 জার্নাল এন্ট্রিগুলি লোড করতে চান, এবং যাক প্রতিটি জার্নাল এন্ট্রিটির দশটি বৈশিষ্ট্য রয়েছে। ক্লাসিক প্রশস্ত টেবিল বিন্যাসে, প্রতিটি সম্পত্তি একটি টেবিলের একটি কলামের সাথে সম্পর্কিত হতে পারে। তারপরে একজন ব্যবহারকারী তার প্রয়োজনীয় সমস্ত ডেটা একবারে টেবিলটি জিজ্ঞাসা করবেন। ক্যোয়ারিতে 10 টি সারি ফেরত আসবে এবং প্রতিটি সারিতে তাদের প্রয়োজনীয় সমস্ত ডেটা থাকবে (যেমন তারিখের সীমা 10 দ্বারা প্রবেশের মাধ্যমে নির্বাচন করুন * নির্বাচন করুন)। একটি সরু টেবিল বিন্যাসে তবে জিনিসগুলি কিছুটা আলাদা bit এই উদাহরণে আসলে দুটি টেবিল রয়েছে: প্রথম টেবিল (টেবিল এ) সাধারণ মাপদণ্ডগুলি সংরক্ষণ করে যার দ্বারা অনুসন্ধান করা উচিত, যেমন প্রবেশের আইডি, লেখকের আইডি, প্রবেশের তারিখ ইত্যাদি etc. দ্বিতীয় সারণী (টেবিল বি) তারপরে একটি এন্ট্রি সম্পর্কিত সমস্ত সম্পত্তি সংরক্ষণ করে। এই দ্বিতীয় সারণীতে তিনটি কলাম রয়েছে: এন্ট্রি_আইডি, কী এবং মান। টেবিল এ-এর প্রতিটি সারির জন্য টেবিল বি-তে 10 সারি থাকবে (প্রতিটি সম্পত্তির জন্য একটি সারি)। অতএব শেষ দশটি এন্ট্রি আনতে এবং প্রদর্শন করতে আপনার 11 টি প্রশ্নের প্রয়োজন হবে। প্রথম ক্যোয়ারী আপনাকে এন্ট্রি আইডিগুলির তালিকা দেয় এবং তারপরে পরবর্তী দশটি ক্যোয়ারী প্রথম ক্যোয়ারীতে প্রত্যাবর্তিত প্রতিটি প্রবেশকারীর সাথে সম্পর্কিত সম্পত্তিগুলি আনবে।
"পবিত্র মোলি!" আপনি বলছেন, "পৃথিবীতে কীভাবে এটিকে আরও পরিমাপযোগ্য হতে পারে ?!" এটি সম্পূর্ণ পাল্টা স্বজ্ঞাত অধিকার? প্রথম দৃশ্যে আমাদের কেবল একটি ডাটাবেস ক্যোয়ারী ছিল, তবে দ্বিতীয় "আরও স্কেলেবল" সমাধানে আমাদের কাছে 11 টি ডাটাবেস অনুসন্ধান রয়েছে। ওটা কোন অর্থ প্রকাশ করে না. এই প্রশ্নের উত্তর পুরো বুলেট উপর নির্ভর করে।
উদারভাবে মেমক্যাচ ব্যবহার করুন। আপনি যদি সচেতন না হন তবে মেমক্যাচ হ'ল বিতরণকৃত, স্টেটহীন, কম বিলম্বিত, নেটওয়ার্ক ভিত্তিক ক্যাচিং সিস্টেম। এটি ফেসবুক, গুগল, ইয়াহু এবং গ্রহের প্রতিটি জনপ্রিয় এবং স্কেলযোগ্য ওয়েব সাইট ব্যবহার করে। এটি ব্র্যাড ফিটজপ্যাট্রিক আংশিকভাবে একটি সংকীর্ণ টেবিল ডাটাবেস ডিজাইনের অন্তর্নিহিত ডাটাবেস ওভারহেড অফসেটে সহায়তা করার জন্য আবিষ্কার করেছিলেন। উপরের # 1 তে আলোচিত একই উদাহরণটি একবার দেখে নেওয়া যাক, তবে এবার, মেমকেচ চালু করা যাক।
আসুন শুরু করা যাক যখন কোনও ব্যবহারকারী প্রথমে কোনও পৃষ্ঠাতে যান এবং কিছুই ক্যাশে নেই। আপনি টেবিল A কে জিজ্ঞাসাবাদ দিয়ে শুরু করেন যা আপনি পৃষ্ঠায় প্রদর্শন করতে চান এমন 10 টি প্রবেশপথের আইডি ফিরিয়ে দেয়। সেই প্রবেশের প্রত্যেকটির জন্য আপনি সেই প্রবেশের সাথে সম্পর্কিত বৈশিষ্ট্যগুলি পুনরুদ্ধার করতে ডাটাবেসটি জিজ্ঞাসা করেন এবং তারপরে এই বৈশিষ্ট্যগুলি ব্যবহার করে এমন কোনও উপাদান তৈরি হয় যা আপনার কোডের সাথে ইন্টারফেস করতে পারে (যেমন কোনও বস্তু)। তারপরে আপনি সেই বস্তুকে (বা that বস্তুর একটি সিরিয়ালযুক্ত ফর্ম) মেমক্যাশে লুকিয়ে রাখবেন।
দ্বিতীয়বার কেউ একই পৃষ্ঠাটি লোড করার পরে আপনি একইভাবে শুরু করবেন: এন্ট্রি আইডিগুলির তালিকার জন্য টেবিল A কে জিজ্ঞাসা করে আপনি প্রদর্শিত হবে। প্রতিটি প্রবেশের জন্য আপনি প্রথমে মেমক্যাশে যান এবং বলবেন, "ক্যাশে আপনার প্রবেশাধিকার # এক্স আছে?" যদি হ্যাঁ, তবে মেমক্যাচ আপনাকে এন্ট্রি অবজেক্টটি ফিরিয়ে দেবে। যদি তা না হয় তবে এর ডাটাবেসগুলির বৈশিষ্ট্য আনতে, অবজেক্টটি গঠন করুন এবং মেমকেচে রেখে স্ট্যাশ করার জন্য আপনাকে আবার ডাটাবেসটি জিজ্ঞাসা করতে হবে। বেশিরভাগ সময়, দ্বিতীয় বার কেউ একই পৃষ্ঠায় দেখেন কেবল একটি ডাটাবেস ক্যোয়ারী রয়েছে, অন্য সমস্ত ডেটা সরাসরি মেমক্যাশ থেকে টানা হয়।
বাস্তবে, লাইভ জার্নালের বেশিরভাগ ক্ষেত্রে যা ঘটেছিল তা হ'ল সিস্টেমের বেশিরভাগ ডেটা, বিশেষত কম অস্থির ডেটা মেমকেচে রাখা হয়েছিল এবং সংকীর্ণ টেবিলের স্কিমাকে সমর্থন করার জন্য প্রয়োজনীয় ডাটাবেসের অতিরিক্ত প্রশ্নগুলি সম্পূর্ণরূপে অফসেট ছিল।
এই নকশাটি আপনার বন্ধুদের সাথে যুক্ত সমস্ত পোস্টকে একটি স্ট্রিমে বা "প্রাচীর" এর সাথে যুক্ত করার সমস্যাটি সমাধান করেছে, অনেক সহজ।
পরবর্তী, আপনার ডাটাবেস বিভাজন বিবেচনা করুন। উপরের আলোচিত মডেলটিতে আরও একটি সমস্যা রয়েছে এবং এটি হ'ল আপনার সরু টেবিলগুলি খুব বড় / দীর্ঘ হবে। এবং আরও বেশি সারি s টেবিলগুলির মধ্যে অন্যান্য প্রশাসনিক কাজগুলি আরও শক্ত হয়ে যায়। এটি অফসেট করার জন্য, কোনওভাবে টেবিলগুলি বিভাজন করে আপনার টেবিলগুলির আকার পরিচালনা করার জন্য এটি বোধগম্য হতে পারে, যাতে ব্যবহারকারীদের ক্লাস্টারগুলি একটি ডাটাবেস দ্বারা পরিবেশন করা হয় এবং ব্যবহারকারীদের অন্য একটি ক্লাস্টার একটি পৃথক ডাটাবেস দ্বারা পরিবেশন করা হয়। এটি ডাটাবেসে লোড বিতরণ করে এবং ক্যোয়ারিকে দক্ষ রাখে।
অবশেষে, আপনার দুর্দান্ত সূচিগুলির প্রয়োজন। আপনার প্রশ্নের গতি আপনার ডাটাবেসের টেবিলগুলিকে কতটা সূচিকাগ্রস্থ করা হয়েছে তার উপর অনেকাংশে নির্ভর করবে। আমি একটি সূচক কী তা নিয়ে আলোচনার জন্য খুব বেশি সময় ব্যয় করব না, খালি খড়ের ছিলে সূঁচগুলি আরও দক্ষ করে তোলার জন্য এটি একটি বিশালাকার কার্ড ক্যাটালগ সিস্টেমের মতো অনেক কিছুই। আপনি যদি মাইএসকিএল ব্যবহার করেন তবে আমি পূরণ করতে দীর্ঘ সময় নেয় এমন প্রশ্নের জন্য নিরীক্ষণের জন্য ধীর ক্যোয়ারী লগটি চালু করার পরামর্শ দিচ্ছি। যখন কোনও কোয়েরি আপনার রাডারে উঠে আসে (উদাঃ কারণ এটি ধীর) তখন গতি বাড়ানোর জন্য টেবিলে আপনাকে কী সূচি যুক্ত করতে হবে তা নির্ধারণ করুন।
"এই দুর্দান্ত পটভূমির জন্য আপনাকে ধন্যবাদ, তবে পবিত্র ক্রুড, এটি আমাকে অনেক অনেক কোড লিখতে হবে।"
অগত্যা। অনেক লাইব্রেরি লেখা হয়েছে যা মেমক্যাসের সাথে ইন্টারফেসিং করা সত্যিই সহজ। তবুও অন্যান্য গ্রন্থাগারগুলি উপরে বর্ণিত পুরো প্রক্রিয়াটি কোড করেছে; তথ্য :: পার্লের অবজেক্টড্রাইভার ঠিক একটি লাইব্রেরি। অন্যান্য ভাষার হিসাবে, আপনার নিজের গবেষণা করতে হবে।
আমি আশা করি আপনি এই উত্তরটি সহায়ক পেয়েছেন। আমি যা চেয়ে বেশি বার পেয়েছি তা হ'ল যে কোনও সিস্টেমের স্কেলাবিলিটিটি কোডের সাথে কম এবং কম সময়ে আসে এবং একটি সাউন্ড ডেটা স্টোরেজ এবং ম্যানেজমেন্ট কৌশল / প্রযুক্তিগত নকশায় আরও বেশি করে আসে।