ডাটাবেজ ট্রানজেকশন ও এসিড

রিলেশনাল ডাটাবেজের খুব মৌলিক একটি বিষয় হচ্ছে ডাটাবেজ ট্রানজেকশন। আর ডাটাবেজ ট্রানজেকশনের একটি গুরুত্বপূর্ণ বিষয় হচ্ছে এসিড প্রোপার্টি। আজকের লেখায় এই বিষয়ে আলোচনা করবো।

মনে করি জনি, রবিন, জামাল আর কামাল নামে চার বন্ধুর একই ব্যাংকে একাউন্ট আছে। ওই ব্যাংকের ডাটাবেজে Account নামে একটি টেবিল আছে এবং নিচে আমরা সেই Account টেবিলের ডাটা দেখতে পাচ্ছি –

Account No Account Name Balance
100-01 Jony 15000
100-02 Robin 5000
100-03 Kamal 10000
100-04 Jamal 1200

এবার আমরা নিচের ঘটনাগুলি লক্ষ করি –

  • জনি তার একাউন্ট থেকে ১০০০ টাকা তুলে নিল (Cash Withdraw)
  • একজন রবিনের একাউন্টে ৫০০ টাকা জমা দিল (Cash Deposit)
  • কামাল তার একাউন্ট থেকে ২০০০ টাকা জামালের একাউন্টে পাঠাল (Fund Transfer)
  • জামাল তার একাউন্টে কত টাকা আছে তা জানতে চাইল (Balance Enquiry)

উপরের প্রথম তিনটি ঘটনা Account টেবিলের Balance কলামের ডাটা পরিবর্তন করবে এবং শেষের ঘটনাটি Balance কলামের ডাটা পড়বে। আর রিলেশনাল ডাটাবেজ ম্যানেজমেন্ট সিস্টেমের (RDBMS) পরিপ্রেক্ষিতে এ ধরনের ঘটনাগুলিকে আমরা ডাটাবেজ ট্রানজেকশন (Database Transaction or Transaction) বা ট্রানজেকশন বলি। একটি ডাটাবেজ ট্রানজেকশনে এক বা একাধিক কাজ/ধাপ থাকতে পারে। যেমন, যখন কামাল তার একাউন্ট থেকে ২০০০ টাকা জামালের একাউন্টে পাঠাল তখন দুটি কাজ হবে প্রথমে কামালের একাউন্ট থেকে ২০০০ টাকা কমাতে হবে এবং তারপরে জামালের একাউন্টে ২০০০ টাকা বাড়াতে হবে। প্রতিটি ট্রানজেকশন হয় সফল ভাবে সম্পূর্ণ বা কমিট (Commit) হবে নয়তো রোলব্যাক (Rollback) বা ট্রানজেকশনের পূর্বের অবস্থায় ফেরত যাবে। একটি ট্রানজেকশন ডাটাতে যে পরিবর্তন করে সেই পরিবর্তিত ডাটা ডাটাবেজে স্থায়ী ভাবে রেখে দেয়াকে কমিট (Commit) বলে। আর রোলব্যাক (Rollback) হল ট্রানজেকশনের ফলে ডাটাতে যে পরিবর্তন হয়েছে সেগুলোকে বাদ দিয়ে ডাটাকে ট্রানজেকশন শুরুর পূর্বের অবস্থায় ফিরিয়ে নেয়া। উদাহরণস্বরূপ, আমরা আবার কামালের একাউন্ট থেকে ২০০০ টাকা জামালের একাউন্টে পাঠানর ট্রানজেকশনটি বিশ্লেষণ করি। আমরা জানি এই ট্রানজেকশনে দুটি কাজ করতে হবে। মনে করি প্রথম কাজটি সফল হল অর্থাৎ কামালের একাউন্ট থেকে ২০০০ টাকা কমানো হল, তাহলে কামালের একাউন্টে থাকবে ৮০০০ টাকা (ট্রানজেকশন শুরুর আগে কামালের একাউন্টে ১০০০০ টাকা ছিল)। কিন্তু কোনো কারণে দ্বিতীয় কাজটি মানে জামালের একাউন্টে ২০০০ টাকা বাড়ানো গেল না। সুতরাং এই ট্রানজেকশনটিকে রোলব্যাক করতে হবে এবং রোলব্যাক করার পরে কামালের একাউন্টে আবার ১০০০০ টাকা হয়ে যাবে।

ডাটাবেজ ট্রানজেকশন বা ট্রানজেকশনের নিম্নোক্ত চারটি বৈশিষ্ট্য/ধর্ম আছে –

  • Atomicity (এটমিসিটি)
  • Consistency (কন্সিসটেনসি)
  • Isolation (আইসোলেশন)
  • Durability (ডিউরাবিলিটি)

আর এই চারটি বৈশিষ্ট্যের প্রথম অক্ষর গুলো দিয়ে অর্থাৎ A, C, I এবং D নিয়ে আমরা বলি এসিড (ACID)। ডাটাবেজ ম্যানেজমেন্ট সিস্টেম নিজেই ট্রানজেকশনের এই বৈশিষ্ট্যগুলি পরিচালনা করে এবং অ্যাপ্লিকেশন ডেভেলপারদের আশ্বস্ত করে যে প্রতিটি ট্রানজেকশন সেগুলো মেনে চলবে।

আমারা এই চারটি বৈশিষ্ট্য উদাহরনের মাধ্যমে বোঝার চেষ্টা করি –

Atomicity – ডাটাবেজ ট্রানজেকশনের এই গুনটি নিশ্চিত করে যে, হয় একটি ট্রানজেকশনের সবগুলি ধাপ সফল হবে অথবা কোনটিই হবে না। যেমন, মনে করি, জনি তার বন্ধু রবিনকে ১,০০০ টাকা দিতে চায়। এখন জনির ব্যাংক একাউন্টে ১০,০০০ টাকা আছে আর রবিনের একাউন্টে ৪,০০০ টাকা আছে। তাহলে আমাদেরকে একটি ডাটাবেজ ট্রানজেকশন করতে হবে এবং এই ট্রানজেকশনে আমাদের দুটি কাজ/ধাপ সম্পন্ন করেতে হবে। প্রথমে জনির একাউন্ট থেকে ১,০০০ টাকা কেটে নিতে হবে এবং তারপরে রবিনের একাউন্টে সেই ১,০০০ টাকা যোগ করতে হবে। আমারা এই ট্রানজেকশনটিকে সফল বলব যদি দুটি কাজই সম্পূর্ণ হয়। আর ট্রানজেকশনটি সফল/কমিট (Commit) হলে জনির একাউন্টে থাকবে ৯,০০০ টাকা এবং রবিনের একাউন্টে হবে ৫,০০০ টাকা। এখন যদি কোনও কারণে জনির একাউন্ট থেকে টাকা কেটে নেওয়ার পরে তা রবিনের একাউন্টে যোগ করতে না পারি তাহলে আমাদের ট্রানজেকশনটি সফল/কমিট হবে না। আর ট্রানজেকশনটি সফল না হলে জনির ব্যাংক একাউন্টে ১০,০০০ টাকা এবং রবিনের একাউন্টে ৪,০০০ টাকাই থাকবে অর্থাৎ ট্রানজেকশনটি রোলব্যাক (Rollback) হবে। ডাটাবেজ ট্রানজেকশনের এটমিসিটি বৈশিষ্ট্যটি এই বিষয়টির নিশ্চয়তা দান করে।

Consistency – কন্সিসটেনসি এর বাংলা অর্থ সামঞ্জস্য বা সঙ্গতি অথবা মিল। রিলেশনাল ডাটাবেজ ম্যানেজমেন্ট সিস্টেমে কন্সিসটেনসি দ্বারা আমরা বুঝি যে প্রতিটি ডাটাবেজ ট্রানজেকশনকে ডাটাবেজে নির্ধারিত নিয়মের (Database Constraint) সাথে সামঞ্জস্য রেখে ডাটা পরিবর্তন বা নতুন ডাটা যোগ করতে হবে। আমারা নানাবিধ উপায়ে ডাটাবেজ ট্রানজেকশনের উপরে বাধ্যবাধকতা বা নিয়ম (Database Constraint) নির্ধারণ করতে পারি। যেমন, প্রাইমারি কি (primary key), ফরেন কি (foreign key), ট্রিগার (trigger), ইত্যাদি দ্বারা আমরা ট্রানজেকশনের উপরে বাধ্যবাধকতা বা নিয়ম আরোপ করতে পারি। মনে করি আমাদের একটি Student টেবিল আছে এবং studentId হল এই টেবিলের প্রাইমারি কি। আমরা যখন নতুন একজন স্টুডেন্টের ডাটা যোগ (data insert) করতে যাব তখন ডাটাবেজ পরীক্ষা করে দেখবে যে প্রাইমারি কি নিয়মটি মানা হচ্ছে কিনা। নিচের ছবিতে বিষয়টি দেখানো হল –

studentId name
101 John এই ডাটাটি সফল ভাবে যোগ হবে কারন ডাটাবেজ পরীক্ষা করে দেখবে যে 101 দিয়ে আর কোনও স্টুডেন্ট নেই।
102 Simon এই ডাটাটিও সফল ভাবে যোগ হবে কারন ডাটাবেজ পরীক্ষা করে দেখবে যে 102 দিয়ে আর কোনও স্টুডেন্ট নেই।
101 Jack এই ডাটা আমরা যোগ করতে পারবনা কারন ডাটাবেজ পরীক্ষা করে দেখবে যে 101 দিয়ে আগে থেকেই একজন স্টুডেন্ট আছে। অর্থাৎ এই ডাটাবেজ ট্রানজেকশনটি ডাটাবেজে নির্ধারিত প্রাইমারি কি এর নিয়ম অনুযায়ী সফল হবে না।

এভাবেই ডাটাবেজে নির্ধারিত নিয়মগুলো (Database Constraint) প্রতিটি ট্রানজেকশনের সময় পরীক্ষা করে দেখে যেন ট্রানজেকশনটি নিয়মের ব্যত্তয় না ঘটিয়ে সম্পূর্ণ হয়।

Isolation – আইসোলেশনের আভিধানিক অর্থ হল বিচ্ছিন্নতা। আর এই বৈশিষ্ট্যটি নিশ্চিত করে যে একাধিক ট্রানজেকশন নিরাপদে এবং স্বাধীনভাবে কোনরূপ সংঘর্ষ ছাড়া একই সময়ে সম্পূর্ণ হতে পারে, কিন্তু এটা কোন ট্রানজেকশনটি আগে হবে আর কোনটি পরে হবে অর্থাৎ ক্রম (order) নিশ্চিত করে না। উদাহরণস্বরূপ, মনে করি রনির একাউন্টে ১৫,০০০ টাকা আছে। রনি তার দুই বন্ধু কামাল এবং জামাল কে যথাক্রমে ৩,০০০ ও ২,০০০ টাকার দুটি চেক দিল। কামাল এবং জামাল একসাথে ব্যাংকে গেল টাকা তোলার জন্য। তারা দুজন ব্যাংকের দুজন অপারেটরের কাছে একই সময়ে চেক দুটি জমা দিল। এখানে একই সাথে দুটি ট্রানজেকশন হবে, কিন্তু যেহেতু একই একাউন্ট থেকে টাকা তোলা হবে তাই যে কোনও একটি ট্রানজেকশন আগে হবে এবং অন্যটিকে অপেক্ষা করতে হবে। ধরে নেই জামালের ট্রানজেকশনটি আগে শুরু হল তাই কামালের ট্রানজেকশনটি অপেক্ষা করবে। জামালের ট্রানজেকশনটি সম্পূর্ণ হলে কামালের ট্রানজেকশনটি শুরু হবে। অর্থাৎ জামালের ট্রানজেকশনটি যখন শুরু হবে তখন রনির একাউন্টে আছে ১৫,০০০ টাকা আর ট্রানজেকশনটি শেষ হবার পরে রনির একাউন্টে ১৩,০০০ টাকা থাকবে। আর কামালের ট্রানজেকশনটি যখন শুরু হবে তখন রনির একাউন্টে আছে ১৩,০০০ টাকা আর ট্রানজেকশনটি শেষ হবার পরে রনির একাউন্টে ১০,০০০ টাকা থাকবে। যেহেতু দুটি ট্রানজেকশনই একই ডাটার (রনির একাউন্ট) উপর নির্ভরশীল তাই একটিকে অন্যটি শেষ হবার জন্য অপেক্ষা করতে হচ্ছে। যদি এভাবে না হত তাহলে যে ডাটার উপর ট্রানজেকশনগুলি নির্ভরশীল সেই ডাটা একটা সামঞ্জস্যহীন (inconsistent) অবস্থায় চলে যাবে। আর ডাটা যেন কোনও ভাবেই সামঞ্জস্যহীন না হয় সে জন্যই ট্রানজেকশন আইসোলেশন প্রয়োজন।

ডাটাবেজে চারটি আইসোলেশন লেভেল আছে –

  1. Read Uncommitted
  2. Read Committed
  3. Repeatable Read
  4. Serializable

Read Uncommitted হল আইসোলেশনের সর্বনিম্ন লেভেল আর Serializable হচ্ছে সর্বোচ্চ লেভেল। এই আইসোলেশন লেভেলগুলির কিছু সমস্যা আছে যথা, Dirty Reads, Non Repeatable Reads এবং Phantom। নিচে এগুলোর বর্ণনা দেয়া হল –

Dirty Read – একটি ট্রানজেকশন অন্য ট্রানজেকশনের দ্বারা পরিবর্তিত ডাটা যা কমিট (commit) হয়নি সেগুলো পড়তে পারাকেই ডারটি রিড বলে। উদাহরণ স্বরূপ, মনে করি একজন ক্রেতা একটি কেনাকাটার সাইট থেকে কোনও একটি পণ্য ২৮০ টি কিনতে চাইল, এখন তার জন্য ট্রানজেকশন A শুরু হল। ট্রানজেকশন A প্রথমে দেখবে যে ঐ পণ্যের ২৮০ টি স্টকে আছে কিনা। ধরে নেই সাইটের ডাটাবেজে Product_Inventory নামে একটি টেবিল আছে যাতে পণ্যের পরিমান আছে। তো ট্রানজেকশন A সেই Product_Inventory টেবিল থেকে পেল যে তার ইউজার যে পণ্যটি কিনতে চায় তা ৫০০ টি আছে। সুতরাং ট্রানজেকশন A এই অর্ডারটিকে কনফার্ম করল এবং Product_Inventory টেবিলে ঐ পণ্যটির পরিমান ৫০০ থেকে কমিয়ে ২২০ করে দিল। কিন্তু ট্রানজেকশন A এখনও কমিট হয়নি। একই সময়ে আরও একজন ঐ একই সাইট থেকে ঠিক ঐ পণ্যটি ৪০০ টি কিনতে চাইল। ধরে নেই পরের ক্রেতার জন্য ট্রানজেকশন B শুরু হল। ট্রানজেকশন B দেখল যে ঐ পণ্যটি মাত্র ২২০ টি আছে, তাই সে ক্রেতাকে জানাল যে তার অর্ডারটি নেয়া যাচ্ছে না। এরই মধ্যে আবার ট্রানজেকশন A এর যে ক্রেতা সে অর্ডারটি বাতিল করে দিল, তার ফলে ট্রানজেকশন A রোলব্যাক হয়ে গেল। অর্থাৎ Product_Inventory টেবিলে ঐ পণ্যটির পরিমান আবার ৫০০ হয়ে গেল। তার মানে এখানে ট্রানজেকশন B এমন একটি ডাটা পেয়েছিল যা আসলে কমিট হয়নি আর এটাকেই Dirty Read বলে।

Non Repeatable Read – একটি ট্রানজেকশন যদি একই ডাটা দুবার পড়ে আর দুবার দুটি আলাদা ভ্যালু পায় তাকে Non Repeatable Read বলে। যেমন, মনে করি রবিন একটি কেনাকাটার সাইট থেকে কোনও একটি পণ্য ৩০০ টি কিনতে চাইল, এখন তার জন্য ট্রানজেকশন A শুরু হল। ট্রানজেকশন A প্রথমে দেখবে যে ঐ পণ্যের ৩০০ টি স্টকে আছে কিনা। ধরে নেই সাইটের ডাটাবেজে Product_Inventory নামে একটি টেবিল আছে যাতে পণ্যের পরিমান আছে। তো ট্রানজেকশন A সেই Product_Inventory টেবিল থেকে পেল যে রবিন যে পণ্যটি কিনতে চায় তা ৫০০ টি আছে। একই সময়ে জামাল ঐ একই সাইট থেকে ঠিক ঐ পণ্যটি ২৫০ টি কিনতে চাইল। ধরে নেই জামালের জন্য ট্রানজেকশন B শুরু হল এবং এই ট্রানজেকশনটি Product_Inventory টেবিল থেকে পেল যে ঐ পণ্যের ৫০০ টি স্টকে আছে। এদিকে রবিন তার অর্ডারটিকে কনফার্ম করল তার ফলে ট্রানজেকশন A পণ্যটির পরিমান ৫০০ থাকে কমিয়ে ২০০ করে দিল এবং ট্রানজেকশন A কমিট হয়ে গেল। ওদিকে জামাল তার অর্ডারে একটু পরিবর্তন করল, সে ঐ পণ্যটি বাদ দিয়ে অন্য একটি পণ্য ২৫০ টি কিনতে চাইল। ফলে ট্রানজেকশন B আবার Product_Inventory টেবিল থেকে খুঁজে পেল যে এই পরে অর্ডার দেয়া পণ্যটি মাত্র ১০০ টি রয়েছে। তাই ট্রানজেকশন B জামালকে জানাল যে পরে অর্ডার দেয়া পণ্যটি স্টকে ২৫০ টি নেই, জামাল আবার প্রথমে অর্ডার দেয়া পণ্যটি নিতে চাইল। এবার ট্রানজেকশন B Product_Inventory টেবিল থেকে দেখল যে এই পণ্যের আর ২০০ টি অবশিষ্ট আছে এবং অর্ডারটি নেয়া যাচ্ছে না। অর্থাৎ ট্রানজেকশন B একই ডাটা দুবার পড়ে দুটি ভিন্ন ভ্যালু (পণ্যের দুটি ভিন্ন পরিমান) পেল। ট্রানজেকশন B যে সমস্যাটির মুখে পড়েছে তাকে Non Repeatable Read বলে।

Phantom – মনে করি কেনাকাটার সাইটের ডাটাবেজে Order নামে একটি টেবিল আছে এবং এই টেবিলে সব অর্ডারের ডাটা আছে। এখন একজন জানতে চাইল মোট কতগুলো অর্ডার হয়েছে। তো একটি ট্রানজেকশন A শুরু হল যা কিনা Order টেবিল থেকে মোট কতটি অর্ডার হয়েছে তা বের করবে। এদিকে একই সময়ে অন্য একটি ট্রানজেকশন B নতুন একটি ডাটা Order টেবিলে যোগ করল। এখন যদি ট্রানজেকশন A আবার Order টেবিল থেকে মোট কতটি অর্ডার হয়েছে তা বের করে তাহলে ভিন্ন ভ্যালু পাবে। এই ধরনের ঘটনাকে Phantom বলে। Non Repeatable Read এর সাথে Phantom এর পার্থক্য হচ্ছে এখানে ডাটা ভিন্ন হচ্ছে নতুন ডাটা যোগ করার ফলে বা ডাটা মুছে ফেলার কারণে (insert or delete)।

নিচের টেবিলে কোন আইসোলেশন লেভেলে কোন অসুবিধা গুলো হয় বা হয় না তা দেখানো হল –

Isolation Level Dirty Read Non Repeatable Read Phantom
Read Uncommitted হয় হয় হয়
Read Committed হয় না হয় হয়
Repeatable Read হয় না হয় না হয়
Serializable হয় না হয় না হয় না

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

আশা করি লেখাটি ডাটাবেজ ট্রানজেকশন ও এসিড সম্বন্ধে বুঝতে সাহায্য করবে।

লেখকঃ মোঃ শফিউজ্জামান রাজিব, ডাটাবেজ ও বিগ ডাটা প্রফেশনাল।

ডাটাবেজ নরমালাইজেশন

ডাটাবেজ নরমালাইজেশন (normalization) কী জিনিস? এক কথায় আসলে উত্তর দেওয়া সম্ভব নয়। তাই বরং আসুন, আমরা বিষয়টি নিয়ে একটু বিস্তারিত আলচনা করি। কোনো কিছুকে নরমালাইজ (normalize) করার অর্থ হচ্ছে সেটিকে স্বাভাবিক (normal) অবস্থায় নিয়ে আসা। তো ডাটাবেজের ক্ষেত্রে এই নরমালাইজেশনের অর্থ হচ্ছে ডাটাবেজকে এমন অবস্থায় নিয়ে আসা যেন ডাটা রিডানডেন্সি (data redundancy) না থাকে এবং ডাটা ইন্টিগ্রিটি (data integrity) বজায় থাকে। এই যে এখন আবার নতুন দুটো জিনিস চলে এল, ডাটা রিডানডেন্সি ও ডাটা ইন্টিগ্রিটি। এগুলো আবার কী জিনিস?

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

ডাটা ইনটিগ্রিটি – Integrity শব্দের অর্থ হচ্ছে শুদ্ধতা। অনেক সময় ডাটাবেজে বিভিন্ন কারণে (হার্ডওয়্যারের ত্রুটি কিংবা সফটওয়্যারের সমস্যা বা ডাটাবেজ ডিজাইনের সমস্যা) ডাটায় ভেজাল ঢুকে যায়। এই ভেজাল আবার কী জিনিস? ধরা যাক কোনো একভাবে হিসেব করলে একজন শিক্ষার্থীর মোট নাম্বার হয় ৫৪৬, আবার আরেকভাবে (যেমন অন্য কোনো টেবিল থেকে ডাটা নিয়ে) হিসেব করলে মোট নাম্বার হয় ৫৫৫। তার মানে ডাটাতে ভেজাল ঢুকে গিয়েছে বা ডাটা তার শুদ্ধতা হারিয়ে ফেলেছে। নরমালাইজেশন করলে ডাটার শুদ্ধতা বজায় থাকার সম্ভাবনা বেড়ে যায় অনেক।

এখন, নিচের উদাহরণগুলো দিয়ে নরমালাইজেশন বিষয়টি বোঝার চেষ্টা করি –

fig1

উপরের টেবিলটিতে কোনো নরমালাইজেশন নেই। এই টেবিলে নতুন ডাটা যোগ করতে (data insert), পুরনো ডাটা পরিবর্তন (data update) করতে এবং ডাটা মুছে ফেলতে (data delete) আমাদের কিছু অসুবিধা হবে (সেগুলোকে নরমালাইজেশন দ্বারা দূর করা যায়)। যেমন, আমরা যদি নতুন একজন স্টুডেন্ট এই টেবিলে যোগ করতে চাই যে কোনো সাবজেক্টই নেয় নি, তাহলে subject কলামে NULL ভ্যালু যাবে। আবার আমারা যদি একজন স্টুডেন্ট এর সাবজেক্ট বাড়াতে বা কমাতে চাই তাহলে আমরা খুব সহজে তা করতে পারব না, কারণ subject কলামে ডাটা কমা দিয়ে আলাদা করা আছে।

এখন আমরা Student টেবিলটিকে First normal form (1NF) নিতে চাই। First normal form (1NF) এর শর্ত হচ্ছে টেবিলের সব কলামের ভ্যালু একক (atomic) হতে হবে। আমারা দেখতে পাচ্ছি যে subject কলামের ডাটা একক (atomic) নয়। নিচে দেখানো উপায়ে আমরা Student টেবিলটিকে পরিবর্তন করে First normal form (1NF) এ নিলাম –

fig2

এখন Student টেবিলের সব কলামের ভ্যালু একক (atomic) হয়েছে। এবার আমারা দেখতে পাচ্ছি যে, একই ডাটা বার বার আসছে। শুধুমাত্র subject কলামের ডাটা পরিবর্তন হচ্ছে।

আমারা এবার Second normal form (2NF) এ আমদের Student টেবিলটিকে নিয়ে যাব। এর জন্য নিচের শর্ত দুটি পূরণ করতে হবে –
১) টেবিলটি First normal form (1NF) এ থাকতে হবে
২) কোনও non-prime অথবা non-key attribute, candidate key এর subset এর উপর নির্ভরশীল হতে পারবে না।

[candidate key মানে এমন কলাম বা কলামের সমষ্টি যা একটি টেবিলের প্রতিটি রেকর্ড কে আলাদা ভাবে চিহ্নিত করতে পারে। একটি টেবিলের এক বা একাধিক candidate key থাকতে পারে। এর মধ্যে একটি বিশেষ candidate key কে আমরা primary key বলি। যে attribute/column কোনও candidate key এর অংশ নয় তাকে non-prime attribute অথবা non-key attribute বলে।]।

আমদের Student টেবিলটি First normal form (1NF) এ আছে। আমাদের দ্বিতীয় শর্তটি পূরণ করতে হবে। Student টেবিল থেকে আমরা লক্ষ করি যে, {studentId, subject} কলাম দুটি মিলে হচ্ছে একটা candidate key এবং name, age, postCode, city কলামগুলো হচ্ছে non-prime attribute।

এখন name, age, postCode, city কলামগুলি শুধুমাত্র studentId কলামের উপর নির্ভরশীল এবং studentId হল candidate key: {studentId, subject} এর একটি subset।

আমরা Student টেবিলটিকে নিচের মত করে Second normal form (2NF) এ নিতে পারি। আমারা একটি নতুন টেবিল Student_Subject তৈরি করলাম স্টুডেন্ট এবং সাবজেক্ট এর মধ্যে সম্পর্ক ঠিক রাখার জন্য।

fig3

তাহলে আমাদের ডাটাবেজ এখন Second normal form (2NF)-এ চলে আসল। এবারে আমরা শেষ ধাপে যাব এবং একে Third normal form (3NF)-এ নেব। যার মাধ্যমে আমাদের নরমালাইজেশন করার প্রক্রিয়াটি সম্পন্ন হবে।

Third normal form (3NF) এ নেওয়ার জন্য আমদের নিচের দুটি শর্ত পূরণ করতে হবে –
১) টেবিল Second normal form (2NF) এ থাকতে হবে
২) কোনো Transitive functional dependency থাকতে পারবে না

[Transitive functional dependency – মনে করি একটি টেবিলের প্রাইমার‍ি কি (primary key) হচ্ছে A এবং এই টেবিলের দুটি নন-প্রাইম (non-prime) কলাম হচ্ছে B এবং C, যেখানে C কলামের ভ্যালু যতটা A কলামের ভ্যালুর উপরে নির্ভরশীল তার চাইতে B কলামের ভ্যালুর উপর বেশি নির্ভরশীল, আবার B কলামের ভ্যালু A কলামের ভ্যালুর উপরে সরাসরি নির্ভরশীল, তাহলে আমরা বলতে পারি যে C কলাম transitively কলাম A এর উপর নির্ভরশীল। ওই যে, ছাগল ঘাস খায়, মানুষ ছাগল খায়, তার মানে মানুষ ঘাস খায় – এরকম লজিক আর কী।]

আমাদের Student টেবিলটিতে studentId হচ্ছে প্রাইমার‍ি কি (primary key) এবং postCode আর city হচ্ছে দুটি নন-প্রাইম (non-prime) কলাম। আমরা লক্ষ করি যে, city কলামটি যতটা studentId কলামের উপরে নির্ভরশীল তার চাইতে বেশি নির্ভরশীল postCode কলামটির উপরে এবং postCode কলামটি আবার studentId কলামের উপরে সরাসরি নির্ভরশীল। সুতরাং আমরা বলতে পারি যে city কলামটি transitively কলাম studentId এর উপর নির্ভরশীল।

তাই Student টেবিলটিকে Third normal form (3NF)-এ নিতে নিচের মতো পরিবর্তন করতে পারি এবং PostCode_City নামে একটি নতুন টেবিল তৈরি করতে পারি –

fig4

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

লেখক – মোঃ শফিউজ্জামান রাজিব, বিগডাটা প্রফেশনাল।

মেমক্যাশড

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

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 করব), তখন সাথে সাথে সংশ্লিষ্ট আর কোথায় কোথায় আমাদের সেই কাজটি করতে হবে। কোনো একটা জায়গায় ভুলে গেলে কিন্তু ঝামেলা হয়ে যাবে। তখন এমন হতে পারে যে ওয়েবসাইটের হোমপেজে দেখাচ্ছে তামিম ইকবাল আউট কিন্তু স্কোরবোর্ডে সেটা দেখাচ্ছে না!

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

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

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

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

ক্যারিয়ার এডভাইজ – ২

সফটওয়্যার টেস্টিং
প্রোগ্রামার যারা, তারা সফটওয়্যার তৈরি করবে এবং তৈরি করার পর (খুব ছোট সফটওয়্যার না হলে) সেই সফটওয়্যারে অনেক বাগ থাকে, সমস্যা থাকে, অন্যান্য ইস্যু থাকে। গ্রাহককে সফটওয়্যার দেওয়ার আগে এগুলো টেস্ট করে বাগগুলো দূর করতে হয় এবং তারপর গ্রাহককে দিতে হয়। তাই প্রায় যেকোনো সফটওয়্যার কোম্পানিতে সফটওয়্যার টেস্টারদের প্রয়োজন। তুমি যে কমার্শিয়াল সফটওয়্যার দেখ বা ব্যবহার কর, এটা অবশ্যই টেস্টিং হয়ে এসেছে। কাজেই যেই পরিমান প্রোগ্রামার প্রয়োজন প্রায় সেই পরিমান টেস্টারও প্রয়োজন।

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

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

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

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

3666796961_0ab03e7c49

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

প্রোজেক্ট ম্যানেজমেন্ট
এই ফিল্ডেও আইটি ও ননআইটি ব্যাকগ্রাউন্ড থেকে লোকজন আসে। কিন্তু আইটি থেকে আসলে আলাদা সুবিধা পাওয়া যায়।

পরবর্তী পর্ব পড়তে এখানে ক্লিক করুন

প্রথম পর্ব পড়তে এখানে ক্লিক করুন

বিশেষ দ্রষ্টব্য : থেরাপ সার্ভিসেস লিমিটেড কর্তৃক আয়োজিত নিয়মিত ওয়েবিনারের একটি পর্ব ছিল প্রোগ্রামিং ক্যারিয়ার নিয়ে। সেখানে বক্তা ছিলেন থেরাপের প্রধান কারিগরি কর্মকর্তা (সিটিও) মোজাহেদুল হক আবুল হাসনাত (মাসুম)। থেরাপ কর্তৃপক্ষের অনুমতিক্রমে সেই ওয়েবিনার থেকে টেক্সটে রূপান্তর করে আমার ব্লগের পাঠকদের জন্য পোস্ট করলাম।

ওয়েবসাইট বিপর্যয় ও মুক্তির উপায় – পর্ব ২

প্রথম পর্বের লিঙ্ক : http://subeen.com/?p=28

 

২০১১ সালের ডিসেম্বর মাসে সাস্ট (SUST) থেকে শিক্ষক রুহুল আমিন সজীবের নেতৃত্বে একটি দল ঢাকায় আসে প্রায় দুই সপ্তাহের জন্য। মিশন জাতীয় বিশ্ববিদ্যালয়ের ভর্তি পরীক্ষার ফলাফল প্রসেস করে রেজাল্ট তৈরি করা। চার লক্ষ পরীক্ষার্থীর জন্য এই কাজটি এক বিশাল আয়োজন। এর মধ্যে একটি ছোট্ট অংশ হচ্ছে রেজাল্ট তৈরি করার পরে সেটি ওয়েবসাইটে প্রকাশ করা।

 

সজীবকে বললাম, ‘সজীব, চল ওয়েবসাইটটা ক্লাউডে হোস্ট করি, আর এমনভাবে করি যেন সেটা ডাউন না হয়।

সজীব উত্তর দিল, ‘আরে সুবিন ভাই, সব ব্যবস্থা করে ফেলছি, রেকস্পেস ক্লাউড সাইটে ওয়েবসাইট হোস্ট করবো, সেটা অনেক লোড সামলাতে পারবে

– ‘লোড সামলাতে পারলে ভালো, কিন্তু সেটা তো যথেষ্ট নয়। ডাটাবেজ কানেকশনতো একটা মূল ইস্যু।

– ‘তাহলে কী করতে বলেন?’

– ‘মেমক্যাশ (memcached) ব্যবহার করি।

– ‘কোনো সমস্যা হবে না?’

– ‘না, সমস্যা নাই, সবার রেজাল্ট মেমোরিতে ক্যাশ করা থাকবে, আর কোনো কারণে সেটা ফেইল করলে মাইএসকিউএল ডাটাবেজ থেকে রেজাল্ট আনা হবে।

– ‘ঠিক আছে, আপনে যা ভালো বুঝেন করেন। আর টাকাপয়সা সমস্যা না, সার্ভারে যত টাকা খরচ করতে হয় করবো, আপনে খালি দেখবেন, মানইজ্জত যেন না ডুবে।

 

আমি খুশিমনে তিনদিনের জন্য ওদের সাথে থেকে গেলাম।

 

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

 

এখন আমরা যে আটটি সার্ভার ব্যবহার করবো, সেখানে কখন কোন সার্ভারে রিকোয়েস্ট যাবে, সেটা নির্ধারণ করা হবে কীভাবে? আমরা সহজ একটা সিদ্ধান্তে আসলাম। একটা ভেরিয়েবল N নেই। N-এর মান ৮। N ভেরিয়েবল হওয়ার সুবিধা হচ্ছে আমরা ইচ্ছামতো সার্ভার মূল সিস্টেমে যুক্ত করতে পারবো, আবার বাদও দিতে পারবো। এখন পরীক্ষার্থীদের রোল নাম্বারকে ৮ দিয়ে মড করা হবে (মড করলে সেটা হবে ০ থেকে ৭এর ভিতরে)। মড করলে যেই সংখ্যাটি পাওয়া যাবে তার সাথে ১ যোগ করে তত নম্বর সার্ভারে রিকোয়েস্ট করা হবে। তাহলে প্রতিটি সার্ভারকে গড়ে ৫০ হাজার স্টুডেন্টের ফলাফল প্রসেস করতে হবে, যেহেতু মোট পরীক্ষার্থী ৪ লক্ষ! লোড অনেক কমে গেলো।

cloud-arch1

তারপরে কাজ হচ্ছে প্রতিটি সার্ভার যেন একসাথে যত বেশি সম্ভব রিকোয়েস্ট হ্যান্ডেল করতে পারে। সার্ভারগুলোয় ওয়েব সার্ভার হিসেবে এপাচি (Apache) ইনস্টল করা ছিলো। সেটার কনফিগরেশন ফাইল এদিকসেদিক করে দেখলাম আগের চেয়ে বেশি রিকোয়েস্ট হ্যান্ডেল করা যাচ্ছি। কিন্তু আমি জানতাম যে ইঞ্জিনএক্স নামে আরেকটি ওয়েব সার্ভার আছে যেটা আরো বেশি কনকারেন্ট (concurrent) রিকোয়েস্ট হ্যান্ডেল করতে পারে। তাই এপাচি বাদ দিয়ে ইঞ্জিনএক্স (Nginx) ইনস্টল করলাম। সেটার কনফিগারেশন ফাইল একটু এদিকসেদিক করলাম। পরীক্ষা করে দেখলাম এপাচির চেয়ে ৫ গুণ বেশি কনকারেন্ট রিকোয়েস্ট হ্যান্ডেল করা যাচ্ছিল। সার্ভারের সবকিছু সিদ্ধান্ত চূড়ান্ত করে সেগুলো দেখাশোনার দায়িত্ব পড়ল সাস্টের ছাত্র শিব্বির হোসেনের উপর।

 

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

 

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

 

এখন শেষ আরেকটা ইস্যু। সজীব বললো, ‘সুবিন ভাই, ক্লাউড সাইট কিন্তু শুরুতে বেশি রিকোয়েস্ট হ্যান্ডেল করতে পারে না। লোড যখন বেশি পড়ে তখন সেটা অটোমেটিক একটা উন্নত পারফরম্যান্সের সার্ভারে ট্রান্সফার হয়। তাই শুরুতে রেজাল্ট দেখায় একটু সমস্যা হতে পারে, তবে কয়েক ঘণ্টা পরে ঠিক হয়ে যাবে। আমি বললাম, ‘এটা শুরু থেকেই ঠিক করে দেই। তাওয়া গরম করার ব্যাপারই তো।আমরা একটা স্ক্রিপ্ট লেখে অনেকগুলো সার্ভারে আর আমাদের ল্যাপটপে চালিয়ে দিলাম। স্ক্রিপ্টের কাজ ছিল ওয়েবসাইটে অটোমেটিক হিট করতে থাকা। তাওয়া গরম হয়ে গেল‌ো! আমরা রাত ১১টায় ওয়েবসাইটে রেজাল্ট পাবলিশ করলাম। আমার মনে আছে রাত ১টা থেকে ২টার মধ্যে দুই লক্ষ হিট হয়েছিল। এত রাতে লোকজনের ওয়েবসাইটে রেজাল্ট দেখার আগ্রহ দেখে অবাক হলাম। তো আমরা সিস্টেম সার্বক্ষণিক মনিটর করছিলাম। প্রথম দিনে এক মিলিয়ন (দশ লক্ষ) হিট হয়েছিল। দ্বিতীয় দিনের শেষে আমরা আটটি সার্ভারের মধ্যে ছয়টি বাদ দিয়ে কেবল দুইটি রাখি কারণ তখন একসাথে আর খুব বেশি হিটের সম্ভাবনা নাই। শেষমেষ আমাদের কাজটি সফল হয়েছিল। প্রথমদিনে আমাদের সিস্টেম এক সেকেন্ডের জন্যও ডাউন হয় নি। ৭২ ঘণ্টার সফল পরিশ্রম শেষে আনন্দ নিয়ে বাসায় চলে আসলাম। সজীব ও তাঁর দলকে ধন্যবাদ এমন একটি গুরুত্বপূর্ণ কাজে আমাকে কাজ করার সুযোগ করে দেওয়ার জন্য।

ওয়েবসাইট বিপর্যয় ও মুক্তির উপায় – পর্ব ১

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

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

webarch

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

এই সমস্যা থেকে মুক্তি পাওয়ার উপায় কী? উপায় হচ্ছে ডিসট্রিবিউটেড কম্পিউটিং (distributed computing), যা ক্লাউড কম্পিউটিং (cloud computing) ব্যবহার করে সহজে করা যায়। আগামী পর্বে লিখব ২০১১-২০১২ সালের জাতীয় বিশ্ববিদ্যালয়ের ভর্তি পরীক্ষার ফল প্রকাশের ওয়েবসাইটের জন্য  ক্লাউড কম্পিউটিং ব্যবহারের অভিজ্ঞতার কথা।

দ্বিতীয় পর্ব পড়তে এখানে ক্লিক করুন