MySQL replication، یک فرایند کپی کردن دادهها از یک سرور پایگاهداده master به یک یا چند سرور slave میباشد.
MySQL، از چندین توپولوژی همسانسازی (replication) پشتیبانی میکند و توپولوژی Master/Slave یکی از محبوبترین توپولوژی ها است که در آن یک سرور پایگاهداده بهعنوان master و یک یا چند سرور دیگر به عنوان salve (یا فرمانپذیر) عمل میکنند.
بهطور پیشفرض، همسانسازی بصورت غیرهمزمان است؛ بدین معنی که master رویدادهایی را مبنی بر تغییر پایگاهداده به فایل گزارش باینری خود ارسال میکند و slaveها زمانی که آماده هستند، آن رویدادها را درخواست مینمایند.
این مطلب نیز ممکن است برای شما مفید باشد: بررسی پایگاه داده MySQL و MariaDB و اندازه جدول در لینوکس
در این راهنما، ما به شما نحوه تنظیم MariaDB Master/Slave replication را با یک سرور master و یک سرور slave در Debian 10 نشان خواهیم داد. MariaDB، اجرای پیش فرض MySQL در Debian است. همین مراحل برای Oracle MySQL نیز قابل اعمال است.
این نوع توپولوژی همسانسازی، مناسبترین توپولوژی برای پشتیبانگیری از پایگاهدادهها است.
در این آموزش، فرض بر این است که شما دو سرور Debian 10 در حال اجرا دارید؛ بطوریکه آنها با یکدیگر از طریق یک شبکه خصوصی ارتباط برقرار میکنند. اگر سرور میزبان شما از آدرس های IP خصوصی پشتیبانی نمیکند، میتوانید از آدرسهای IP عمومی استفاده کرده و فایروال خود را پیکربندی نمایید؛ بهگونهای که عبور ترافیک را تنها از منابع قابل اعتماد و برروی پورت 3306 اجازه دهد.
سرورهای مورد استفاده در این مثال دارای آدرس های IP زیر هستند:
Master IP: 10.10.8.12
Slave IP: 10.10.8.164
نصب MariaDB
مخزنهای پیش فرض Debian 10 شامل نسخه 10.3 MariaDB است. بهتر است برای جلوگیری از بروز مشکلات احتمالی، همان نسخه MariaDB را روی هر دو سرور نصب نمایید.
MariaDB را با اجرای دستورات زیر بر روی سرور master و slave نصب کنید:
$ sudo apt-get update
$ sudo apt-get install mariadb-server
پیکربندی سرور master
اولین قدم، راهاندازی سرور master است. در اینجا، تغییرات زیر را انجام خواهیم داد:
- تنظیم سرور MariaDB برای شنود برروی IP خصوصی
- تنظیم شناسه سرور بصورت منحصر به فرد
- فعالسازی گزارش دودویی (binary logs - binlog)
فایل پیکربندی MariaDB را باز کرده و خطوط زیر را از حالت کامنت بیرون آورید و یا در صورت عدم وجود، آنها را وارد نمایید:
$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
master:/etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 10.10.8.12
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
سپس فایل را ذخیره کرده و سرویس MySQL را مجدداً راهاندازی نمایید تا تغییرات اعمال شود:
$ sudo systemctl restart mariadb
قدم بعدی، ایجاد یک کاربر جدید replication است. بهعنوان کاربر root به سرور MariaDB وارد شوید:
$ sudo mysql
برای ایجاد یک کاربر با نام replica و اعطای امتیاز REPLICATION SLAVE به کاربر، کوئریهای SQL زیر را اجرا کنید:
mysql> CREATE USER 'replica'@'10.10.8.164' IDENTIFIED BY 'replica_password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replica'@'10.10.8.164';
دقت کنید که حتما IP را با آدرس IP مربوط slave خود تغییر دهید. شما میتوانید این کاربر را با هر نامی که بخواهید نامگذاری نمایید.
پس از آن، دستور زیر را اجرا کنید تا نام فایل و مکان آن را بصورت باینری چاپ نماید.
mysql> SHOW MASTER STATUS\G
Output:
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 328
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.001 sec)
به نام فایل یعنی ‘mysql-bin.000001’ و موقعیت آن یعنی ‘328’ توجه کنید. این مقادیر، هنگام پیکربندی سرور slave نیاز هستند و احتمالاً در سرور شما متفاوت خواهد بود.
پیکربندی سرور Slave
در این مرحله، باید همان تغییراتی که برروی سرور master اعمال کردیم، برروی سرور slave نیز اعمال نماییم:
- تنظیم سرور MariaDB، برای شنود برروی IP خصوصی
- تنظیم شناسه سرور بصورت منحصر به فرد
- فعالسازی گزارش دودویی (binary logs - binlog)
فایل پیکربندی MariaDB را باز کرده و خطوط زیر را ویرایش نمایید:
$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
slave:/etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 10.10.8.164
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
سرویس MariaDB را مجدداً راهاندازی کنید:
$ sudo systemctl restart mariadb
مرحله بعدی تنظیم پارامترهایی است که سرور slave برای اتصال به سرور master از آن استفاده خواهد کرد. وارد پوسته MariaDB شوید:
$ sudo mysql
تردهای (threads) سرور slave را به صورت زیر متوقف نمایید:
mysql> STOP SLAVE;
برای پیکربندی Master/Slave replication، کوئری زیر را اجرا کنید:
mysql> CHANGE MASTER TO
mysql> MASTER_HOST='10.10.8.12',
mysql> MASTER_USER='replica',
mysql> MASTER_PASSWORD='replica_password',
mysql> MASTER_LOG_FILE='mysql-bin.000001',
mysql> MASTER_LOG_POS=328;
اطمینان حاصل کنید که از آدرس IP، نام کاربری و رمز عبور صحیحی استفاده میکنید. نام و موقعیت فایل گزارش باید برابر با مقادیری باشد که از سرور master به دست آوردهاید.
پس از آن، تردهای slave را راهاندازی نمایید.
mysql> START SLAVE;
تست پیکربندی
برای اطمینان از اینکه همه چیز به درستی راهاندازی میشود، یک پایگاهداده جدید در سرور master ایجاد کنید:
$ sudo mysql
mysql> CREATE DATABASE replicatest;
وارد پوسته MySQL مربوط به سرور slave شوید:
$ sudo mysql
دستور زیر را برای نمایش لیست تمام پایگاهدادهها اجرا نمایید:
mysql> SHOW DATABASES;
در اینجا، متوجه خواهید شد که پایگاهدادهای که در سرور master ایجاد کردهاید بر روی slave همسانسازی شده است:
Output:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| replicatest |
| sys |
+--------------------+
5 rows in set (0.00 sec)
منبع:
به نظر من سه دلیل برای مشکلتون میتونه وجود داشته باشه:
۱- عملیات foreign key check بر روی master غیرفعال شده باشه و یک دیتای اشتباه (که دارای کلیدهای معتبری نیست) بر روی master درج بشه و خب بدیهی هست که master خطایی در این خصوص نخواهد داد؛ اما هنگام اعمال دیتا بر روی slave با خطای foreign key مواجه خواهد شد.
۲- تنظیمات مقدار متغیر sysvar_slave_parallel_workers به صورت نادرست تنظیم شده باشه، اطلاعات بیشتر:
https://dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#sysvar_slave_parallel_workers
۳- یک باگ مرتبط با این موضوع گزارش شده و شما هم با این مورد برخورد کردید:
https://bugs.mysql.com/bug.php?id=97836
(که این حالت احتمال کمتری دارد)
همچنین میتونید برای حل مشکل توسط جی سرور، در پنل کاربری اکانت ایجاد و در بخش پشتیبانی تیکت ارسال کنید.
https://www.jeyserver.com/fa/userpanel/register