بازیابی و همگام‌سازی نودهای Replica در MariaDB با استفاده از Mariabackup

در معماری‌های Master-Slave (یا Primary-Replica) در پایگاه‌داده MariaDB، یکی از چالش‌های رایج، خارج شدن یک نود Slave از مدار و نیاز به همگام‌سازی مجدد (Resync) آن با نود Master است. در این مقاله، مراحل دقیق بازیابی یک نود آسیب‌دیده (مثلاً نود ۱) از روی بکاپ نود Master (مثلاً نود ۲) را با استفاده از ابزار قدرتمند mariabackup بررسی می‌کنیم.


مرحله اول: تهیه بکاپ اولیه (Backup)

ابتدا روی نود Master، یک بکاپ فیزیکی از دیتابیس تهیه می‌شود. این کار با دستور زیر انجام می‌گیرد:

mariabackup --backup --target-dir=/backup/forsync/ --user=root --password=YOUR_PASSWORD

ابزار mariabackup فایل‌های دیتای InnoDB را کپی می‌کند. اما از آنجایی که دیتابیس در حین بکاپ‌گیری روشن و در حال کار است، این فایل‌ها در لحظه اتمام بکاپ ناسازگار (Inconsistent) هستند.


مرحله دوم: آماده‌سازی بکاپ (Prepare) - قلب تپنده Mariabackup

این مرحله یکی از حیاتی‌ترین بخش‌های فرآیند است که باید پیش از انتقال یا ریستور بکاپ انجام شود:

mariabackup --prepare --target-dir=/backup/forsync/

چرا مرحله Prepare الزامی است؟

هنگامی که شما در حال تهیه بکاپ (Hot Backup) هستید، دیتابیس متوقف نمی‌شود. کاربران همچنان در حال خواندن و نوشتن اطلاعات هستند. بنابراین، فایل‌هایی که در ابتدای فرآیند کپی شده‌اند با فایل‌هایی که در انتهای فرآیند کپی شده‌اند، از نظر زمانی همگام نیستند.

پشت صحنه Prepare چه اتفاقی می‌افتد؟

ابزار mariabackup در حین بکاپ‌گیری، تمام تغییراتی که روی دیتابیس رخ می‌دهد را در فایلی به نام xtrabackup_logfile (که همان Redo Log های InnoDB است) ثبت می‌کند. در مرحله Prepare، موتور داخلی InnoDB روی فایل‌های بکاپ اجرا می‌شود تا فرآیندی به نام Crash Recovery را شبیه‌سازی کند:

  1. Roll Forward (اعمال تراکنش‌های موفق): تراکنش‌هایی که در طول بکاپ‌گیری با موفقیت ثبت (Commit) شده‌اند، اما هنوز در فایل‌های دیتا نوشته نشده بودند، از روی فایل لاگ خوانده شده و به فایل‌های دیتا تزریق می‌شوند.
  2. Roll Back (لغو تراکنش‌های ناقص): تراکنش‌هایی که در زمان اتمام بکاپ هنوز کامل نشده بودند (Uncommitted)، از فایل‌های دیتا حذف (Rollback) می‌شوند.

نتیجه این مرحله، تبدیل یک مجموعه فایل ناسازگار به یک دیتابیس کاملاً یکپارچه و سازگار (Consistent) است که آماده راه‌اندازی می‌باشد.


مرحله سوم: انتقال و بازگردانی بکاپ (Restore)

اکنون بکاپ آماده شده را به نود ۱ (Slave) منتقل می‌کنیم.

۱. ابتدا مطمئن شوید سرویس MariaDB در نود ۱ خاموش است و مسیر دیتای آن (مثلاً /var/lib/mysql/datadir) کاملاً خالی است.

systemctl stop mariadb

rm /var/lib/mysql/datadir/*

۲. داده‌ها را به slave ی که عقب افتاده منتقل کنید و در جای خود قرار دهید و سپس بر روی سرور slave این دستورات را بزنید:

mariabackup --copy-back --target-dir=/backup/forsync/ --datadir=/var/lib/mysql/datadir/
 
۳. بسیار مهم: مالکیت فایل‌ها را به کاربر mysql تغییر دهید تا سرویس بتواند آن‌ها را بخواند:
 
chown -R mysql:mysql /var/lib/mysql/datadir/
 

مرحله چهارم: استخراج مختصات Binlog

برای اینکه نود Slave بداند دقیقاً از چه نقطه‌ای باید خواندن تغییرات جدید (Replication) را از Master شروع کند، باید فایل xtrabackup_binlog_info را که در پوشه بکاپ یا دیتا ایجاد شده است بخوانیم:

cat /var/lib/mysql/datadir/xtrabackup_binlog_info

خروجی چیزی شبیه به این خواهد بود:

mysql-bin.000045 123456

این دو مقدار (نام فایل و موقعیت) را یادداشت کنید.


مرحله پنجم: راه‌اندازی و اتصال Replication

۱. سرویس دیتابیس را روشن کنید:

systemctl start mariadb

۲. وارد محیط کاربری دیتابیس شوید (mysql -u root -p) و دستورات زیر را با مقادیری که در مرحله قبل به دست آوردید اجرا کنید:

STOP SLAVE;

CHANGE MASTER TO 
MASTER_HOST='IP_NODE_2',
MASTER_USER='replication_user',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='mysql-bin.000045',
MASTER_LOG_POS=123456;

START SLAVE;

(نکته: در نسخه‌های جدیدتر MariaDB می‌توانید از CHANGE REPLICATION SOURCE TO و START REPLICA استفاده کنید).

۳. در نهایت، وضعیت اتصال را بررسی کنید:

SHOW SLAVE STATUS\G

اگر مقادیر Slave_IO_Running و Slave_SQL_Running هر دو Yes باشند، تبریک می‌گوییم! نود ۱ با موفقیت بازیابی شده و در حال همگام‌سازی با Master است.