پیاده سازی Master & Slave

MySQL Replication چیست؟

فرآیندی است که به‌کمک آن می‌توان از اطلاعات دیتابیس به صورت اتوماتیک کپی گرفت و به‌صورت بک‌آپ ذخیره کرد. استفاده از این نسخه اطلاعات سبب می‌شود تا رجوع به دیتابیس اصلی نیاز نباشد. در این بحث با توجه به آدرس (IP) های زیر چند نمونه از این فرآیند را بررسی می‌کنیم. (Master Slave Replication) در MySQL به شرح زیر است

۱۲.۳۴.۵۶.۷۸۹- Master Database

۱۲.۲۳.۳۴.۴۵۶- Slave Database

تنظیمات پیش از شروع از دسترسی Sudo و همچنین نصب MySQL بر روی سیستم‌عامل مطمئن شوید. اگر MySQL نصب نیست، با دستور زیر آن را نصب کنید.

sudo apt-get insMySQLmysql-server mysql-client

گام اول:

تنظیمات Master Database تنظیمات فایل Mysql را در سرور باز کنید.

sudo nano /etc/mysql/my.cnf

این فایل را باید کمی تغییر بدهیم، ابتدا قسمتی که شامل عبارت زیر باشد را پیدا می‌کنیم.

bind-address = 127.0.0.1

و آدرس آن را به (۱۲.۳۴.۵۶.۷۸۹) تغییر می‌دهیم. تنظیمات بعدی که می‌بایست انجام دهیم، تغییر (server-id) است. شما هر عددی را می‌توانید به آن اختصاص دهید اما بهتر است آن عدد با ۱ آغاز شود، اما توجه داشته باشید که آن عدد می‌بایست منحصربه‌فرد باشد و با هیچ (server-id) دیگری در گروه یکسان نباشد. ما در این ‌جا عدد ۱ را به آن اختصاص می‌دهیم.

server-id = 1

فایل (log_bin) فایلی است که در آن جزئیات نسخه‌های کپی نگهداری می‌شود. Slave تمام اطلاعاتی که روی آن هست را کپی می‌کند. در این گام کافی‌ست تا خط زیر را از حالت (comment) حذف کنیم (علامت# را از ابتدای خط حذف کنیم).

log_bin = /var/log/mysql/mysql-bin.log

حال برای کپی کردن فایل‌ها از دستور زیر می‌توان استفاده کرد. توجه داشته باشید تکرار این دستور دوباره فایل را در تعداد بیشتر کپی می‌کند.

binlog_do_db  = newdatabase

نهایتاً می‌بایست سروری را که از آن نسخه کپی تهیه می‌شود را مشخص کنیم. لازم به‌ذکر است فقط یک دیتابیس لازم نیست، می‌توان چند دیتابیس را در نظر گرفت و تعیین کرد.

binlog_do_db  = newdatabase

اقدامات لازم پس از انجام تنظیمات پس از انجام تنظیمات، از آن خارج شده و Mysql را restart می‌کنیم.

sudo service mysql restart

قدم بعدی تنظیماتی در محیط shell دیتابیس است. (MySQL Shell) را باز کنید.

mysql -u root -p

نیاز است تا برای slave، نام و رمز عبور مشخص کنیم.

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';

FLUSH PRIVILEGES;

برای کامل کردن این فرآیند نیاز است تا در یک (tab) یا پنجره جدید دستورات زیر را وارد کنید.

USE newdatabase;

FLUSH TABLES WITH READ LOCK;

در آن دستور زیر را نیز وارد کنید:

SHOW MASTER STATUS;

پس از آن جدولی همانند زیر نمایش داده می‌شود:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      ۱۰۷ | newdatabase  |                  |
+------------------+----------+--------------+------------------+
۱ row in set (0.00 sec)

این جدول بیانگر این است که (slave) از کدام دیتابیس شروع به کپی برداری می‌کند. بهتر است این اعداد را پیش خود نگه دارید. در ادامه به آن‌ها نیاز خواهید داشت.

اگر شما تغییری در پنجره یا (tab) دیگری بدهید، دیتابیس به طور اتوماتیک (unblock) می‌شود. به‌همین دلیل بعد از باز کردن پنجره جدید فقط مراحل را ادامه دهید.

با دستور زیر دیتا و اطلاعات را در دیتابیس جدید کپی کنید. لازم به تذکر است این عمل را در یک محیط (shell) جداگانه انجام دهید.

mysqldump -u root -p --opt newdatabase > newdatabase.sql

اکنون به پنجره اصلی کار خود بازگردید و مراحل را به پایان برسانید.

UNLOCK TABLES;
QUIT;

گام دوم:

تنظیمات Slave Database

پس از آن‌ که در گام اول تنظیمات (master database) را انجام دادیم، نوبت به تنظیم (Slave) است. وارد سرور (Slave) شوید و (MySQL shell) را باز کنید. یک دیتابیس جدید ایجاد کنید و سپس آن را ببندید.

CREATE DATABASE newdatabase;
EXIT;

دیتابیسی را که از دیتابیس (master) خارج کرده بودید را در آن وارد کنید.

mysql -u root -p newdatabase < /path/to/newdatabase.sql

حال تنظیمات مربوط به slave را انجام می‌دهیم:

sudo nano /etc/mysql/my.cnf

در این جا نیز نیاز است تا (server-id) را تغییر دهید. همان‌طور که در بالا گفته شد، این نام باید منحصربه‌فرد باشد.

server-id = 2

سپس به شرح زیر مراحل را طی کنید و آن‌ها را کامل کنید.

relay-log = /var/log/mysql/mysql-relay-bin.log
log_bi  = /var/log/mysql/mysql-bin.log
binlog_do_db = newdatabase

پس از ایجاد دیتابیس مراحل را (save) کرده و سپس از آن خارج شوید.

دوباره (MySQL) را (restart) کنید.

sudo service mysql restart

قدم بعدی فعال کردن (Replication) در محیط (MySQL shell) است. آن را دوباره باز کنید و جزئیات زیر را در آن وارد کنید:

CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=  ۱۰۷;

این دستور باعث ایجاد تغییرات زیر می‌گردد:

این عمل سرور فعلی را به‌عنوان (slave) برای (master) قرار می‌دهد. اعتبار سنجی (login‌)ها در سرور درست انجام می‌شود. در آخر، به سرور (slave) اعلام می‌کند تا از کجا عمل کپی برداری را آغاز کند. (طبق همان عددهایی که برای آن‌ها مشخص کردیم) پس از اتمام تنظیمات، سرور (slave) را فعال می‌کنیم:

START SLAVE;

برای مشاهده جزئیات آن نیز از دستور زیر استفاده می‌کنیم:

SHOW SLAVE STATUS\G

اگر برای برقراری ارتباط مشکلی پیش آمد و نتوانست وصل شود، از دستور زیر نیز می‌توان استفاده کرد:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;