টপিকঃ মাইসিক্ল-এ মাস্টার-স্লেইভ রেপ্লিকেশন
মাইসিক্ল-এ মাস্টার-স্লেইভ রেপ্লিকেশন নিয়ে নাড়াচাড়া করছি ইদানীং। যেটুকু শিখেছি, তাই আপাততঃ শেয়ার করছি সবার সাথে।
মাস্টার স্লেইভ রেপ্লিকেশন করার বেশ কিছু সুবিধা আছে, যেমনঃ
মূল ডেটাবেইজ সার্ভার থেকে অনেক কুয়েরী অফ্লোড করে সার্ভারের লোড অনেকটা কমানো যাবে। মাস্টার সার্ভারটি write প্রিডমিনেন্ট কুয়েরী INSERT, UPDATE প্রসেস করুক, এই ফাঁকে আপনি স্লেইভ সার্ভার থেকে রিড-অনলী কুয়েরী (SELECT) করে ফেলতে পারবেন। ল্যাগ টাইম অনেক কমে যাবে (অবশ্য কোড কম্পলেক্সিটিও একটু বেড়ে যাবে)।
আপকামিং পিএইচপি ৫,৩-এ নতুন মাইসিক্ল নেটিভ ড্রাইভার (MySQL-nd) থাকছে, ওটা দিয়ে এক সাথে অনেকগুলো প্যারালাল অ্যাসিঙ্ক কুয়েরী করা যায়। হেভীলী লোডেড সার্ভারে এই ফীচার প্রচুর উপকারে আসবে বলে মনে হচ্ছে।
এছাড়া স্লেইভ সার্ভার থেকে সহজেই mysqldump করে ব্যাকআপ নিতে পারবেন, আপনার মাস্টার সার্ভার তো ফ্রী থেকে যাচ্ছে, ইউজাররা টেরই পাবেনা। যা ল্যাগ হবার তা স্লেইভ সার্ভারেই হবে। কিন্তু সরাসরি মাস্টার সার্ভারে ব্যাকআপ চালাতে গেলে (বিশেষ করে যদি বড় সড় মাল্টিগিগাবাইট ডেটাবেইজ হয়) সাইট কিছুক্ষণের জন্য হলেও লক আপ হয়ে যাবে। অতএব মাস্টার সার্ভারের লোড এ্যাভারেজ কম রাখতে চাইলে ব্যাকআপের স্টীমরোলার স্লেইভের উপর দিয়েই চালানো বুদ্ধিমানের কাজ। ট্রিইইং! 
যাক এবার মূল কাজের কথায় আসি। ধরি আমার কনফিগারেশন এইরকমঃ
মাস্টার সার্ভার আইপিঃ 1.0.0.1
স্লেইভ সার্ভার আইপিঃ 1.0.0.2
স্লেইভ ইউজারঃ slaveuser
স্লেইভ পাসোয়ার্ডঃ slavepass
ডেটা ডাইরেক্টরীঃ /usr/local/mysql/var/আমি ভিএমঅয়্যারে দুইটা ভার্চুয়াল মেশিন ফেডারেশন করে এই সেটআপটা করেছিলাম, তবে আশা করি কোন পরিবর্তন ছাড়াই ফিজিকাল সার্ভারে ইম্পলিমেন্ট করা যাবে।
এবার মাস্টার সার্ভারের my.cnf-এর [mysqld] সেকশনটা এইরকম হবেঃ
server-id = 1
relay-log = /usr/local/mysql/var/mysql-relay-bin
relay-log-index = /usr/local/mysql/var/mysql-relay-bin.index
log-error = /usr/local/mysql/var/mysql.err
master-info-file = /usr/local/mysql/var/mysql-master.info
relay-log-info-file = /usr/local/mysql/var/mysql-relay-log.info
datadir = /usr/local/mysql/var
log-bin = /usr/local/mysql/var/mysql-binঠিক একই ভাবে স্লেইভ সার্ভারের my.cnf-এ [mysqld] সেকশনে এইভাবে লিখতে হবে
server-id = 2
relay-log = /usr/local/mysql/var/mysql-relay-bin
relay-log-index = /usr/local/mysql/var/mysql-relay-bin.index
log-error = /usr/local/mysql/var/mysql.err
master-info-file = /usr/local/mysql/var/mysql-master.info
relay-log-info-file = /usr/local/mysql/var/mysql-relay-log.info
datadir = /usr/local/mysql/varবিঃদ্রঃ server-id অংশটা খেয়াল করুন। এটা দুই সার্ভারে অবশ্যই আলাদা হতে হবে।
এখন মাস্টারে নতুন ইউজার বানানঃ
mysql> grant replication slave on *.* to slaveuser@'1.0.0.2' identified by 'slavepass';আপনার ডেটাবেইজে যদি আগে থেকেই ডেটা থাকে তবে…
মাস্টারে ডাম্প করুন...
mysqldump -u root --all-databases --single-transaction --master-data=1 > masterdump.sqlআর স্লেইভে ইম্পোর্ট করুন...
mysql < masterdump.sqlএইবার স্লেইভের ক্লায়েন্টে-এ ঢুকে মাস্টারের কনফিগ অ্যাড করুনঃ
mysql> CHANGE MASTER TO MASTER_HOST='1.0.0.1', MASTER_USER='slaveuser', MASTER_PASSWORD='slavepass';ওক্কে, কনফিগারেশন এবং ডেটা ইম্পোর্ট তো হয়ে গেলো। এইবার বুকে ফুঁ দিয়ে চাকর বাবাজীকে স্টার্ট করেনঃ
mysql> start slave;সব ঠিকঠাক থাকলে চাকর সাহেবের রিয়েল টাইম স্টেটাস দেখতে পারবেন এই কমান্ড দিয়েঃ
mysql> show slave statusতবে স্লেইভ আর মাস্টারের লাস্ট রেকর্ড কাউন্ট সব সময় একই হবে না। বেশিরভাগ ক্ষেত্রেই মাস্টার থেকে স্লেইভ একটু পিছিয়ে থাকবে।
সর্বশেষ সম্পাদনা করেছেন invarbrass (22-02-2009 02:29)


লেখাটি GPL v3 এর অধীনে প্রকাশিত