در دنیای پایگاههای داده، پایداری (High Availability) و توزیع بار (Load Balancing) از اهمیت بسیار بالایی برخوردار است. یکی از بهترین روشها برای رسیدن به این هدف در دیتابیس MariaDB، استفاده از معماری Primary-Replica (یا همان Master-Slave سابق) است. در این معماری، تمام عملیات نوشتن روی سرور اصلی (Primary) انجام میشود و دادهها بهصورت لحظهای (Real-time) روی یک یا چند سرور استندبای (Replica) کپی میشوند.
در این مقاله، قصد داریم دیتابیس MariaDB نسخه 10.11.13 را بهصورت کاملاً آفلاین (با استفاده از فایل tar.gz) روی سیستمعامل Ubuntu 24.04 نصب کرده و یک کلاستر شامل ۱ سرور اصلی و ۲ سرور استندبای راهاندازی کنیم.
پیشنیازها و معماری شبکه
برای اجرای این سناریو، ما از 33 ماشین مجازی با مشخصات زیر استفاده میکنیم:
- سیستمعامل: Ubuntu 24.04
- نسخه دیتابیس: MariaDB 10.11.13
- سرور اصلی (Primary):
mariadb1با IP آدرس192.168.56.101 - سرور استندبای اول (Replica 1):
mariadb2با IP آدرس192.168.56.102 - سرور استندبای دوم (Replica 2):
mariadb3با IP آدرس192.168.56.103
گام اول: آمادهسازی شبکه و سیستمعامل
ابتدا باید مطمئن شویم سرورها بهراحتی یکدیگر را در شبکه میبینند و نام آنها (Hostname) قابل ترجمه (Resolve) است.
وارد هر سرور شده و فایل /etc/hosts را ویرایش کنید:
sudo nano /etc/hosts
خطوط زیر را به انتهای فایل در هر 3 سرور اضافه کنید:
192.168.56.101 mariadb1
192.168.56.102 mariadb2
192.168.56.103 mariadb3
گام دوم: نصب آفلاین MariaDB (روی هر ۳ سرور)
چون در محیطهای ایزوله یا Enterprise دسترسی به اینترنت محدود است، ما از سورس باینری استفاده میکنیم. مراحل این گام باید روی هر 3 سرور دقیقاً به یک شکل انجام شود.
۱. ساخت کاربر و گروه سیستمی:
ابتدا یک گروه و کاربر اختصاصی برای اجرای سرویس دیتابیس ایجاد میکنیم تا امنیت سیستم حفظ شود:
sudo groupadd mysql
sudo useradd -g mysql mysql
۲. استخراج فایل نصب:
فایل mariadb-10.11.13-linux-systemd-x86_64.tar.gz را به مسیر /tmp منتقل کرده و با دستور زیر آن را استخراج کنید:
cd /tmp/
tar -zxvf mariadb-10.11.13-linux-systemd-x86_64.tar.gz -C /usr/local/
sudo mv /usr/local/mariadb-10.11.13-linux-systemd-x86_64 /usr/local/mysql
۳. ایجاد دایرکتوریها و تنظیم دسترسیها:
پوشههای لازم برای ذخیره دادهها و لاگها را ایجاد میکنیم و مالکیت آنها را به کاربر mysql میدهیم:
sudo mkdir -p /etc/mysql /var/log/mysql /var/lib/mysql
sudo chown -R mysql:mysql /usr/local/mysql /etc/mysql /var/log/mysql /var/lib/mysql
۴. مقداردهی اولیه پایگاه داده (Initialize):
حالا باید ساختار اولیه دیتابیس را ایجاد کنیم:
cd /usr/local/mysql
sudo scripts/mariadb-install-db --user=mysql --datadir=/var/lib/mysql
۵. تنظیم سرویس Systemd:
برای اینکه بتوانیم دیتابیس را با دستوراتی مثل systemctl مدیریت کنیم:
sudo cp /usr/local/mysql/support-files/systemd/mariadb.service /etc/systemd/system/
sudo systemctl daemon-reload
برای اجرای راحت دستورات محیط خط فرمان MariaDB، مسیر اجرایی آن را به متغیر محیطی سیستم اضافه میکنیم:
echo 'export PATH=$PATH:/usr/local/mysql/bin' | sudo tee /etc/profile.d/mariadb.sh
source /etc/profile.d/mariadb.sh
گام سوم: پیکربندی سرور اصلی (Primary - mariadb1)
وارد سرور mariadb1 شوید. فایل تنظیمات را باز کنید:
sudo nano /etc/mysql/my.cnf
تنظیمات زیر را در آن قرار دهید:
[mysqld]
basedir=/usr/local/mysql
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
user=mysql
bind-address=0.0.0.0
server-id=1
log_bin=/var/log/mysql/mysql-bin.log
نکته: مقدار server-id باید در کل کلاستر یکتا باشد.
سرویس را روشن کنید:
sudo systemctl start mariadb
sudo systemctl enable mariadb
ایجاد کاربر Replication:
وارد محیط دیتابیس شوید (mariadb) و کاربری بسازید که سرورهای Replica بتوانند از طریق آن دادهها را بخوانند:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'StrongPass123';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
دریافت وضعیت فعلی سرور اصلی (بسیار مهم):
برای اتصال سرورهای Replica، باید بدانیم خواندن دادهها را از کدام فایل و کدام خط (Position) آغاز کنند. دستور زیر را اجرا کنید:
SHOW MASTER STATUS;
خروجی واقعی:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 787 | | |
+------------------+----------+--------------+------------------+
توجه: مقادیر mysql-bin.000001 و عدد 787 را دقیقاً یادداشت کنید. استفاده از مقادیر اشتباه باعث بروز خطای معروف Error 1236 (bogus data in log event) در سرورهای استندبای میشود.
گام چهارم: پیکربندی سرورهای استندبای (mariadb2 و mariadb3)
این مراحل را روی سرورهای دوم و سوم انجام دهید. ابتدا فایل my.cnf را بسازید:
sudo nano /etc/mysql/my.cnf
برای سرور mariadb2:
[mysqld]
basedir=/usr/local/mysql
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
user=mysql
bind-address=0.0.0.0
server-id=2
(برای سرور mariadb3، مقدار server-id را برابر 33 قرار دهید).
سرویس را روی هر دو سرور استارت کنید:
sudo systemctl start mariadb
sudo systemctl enable mariadb
اتصال به سرور اصلی:
وارد محیط mariadb شده و دستورات زیر را با توجه به مقادیری که در گام قبل یادداشت کردید، وارد نمایید:
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='192.168.56.101',
MASTER_USER='replica_user',
MASTER_PASSWORD='StrongPass123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=787;
START SLAVE;
گام پنجم: بررسی سلامت کلاستر و تست نهایی
برای اطمینان از صحت عملکرد، روی سرورهای mariadb2 و mariadb3 دستور زیر را اجرا کنید:
SHOW SLAVE STATUS\G
بررسی خروجی لاگ واقعی:
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.101
Master_User: replica_user
Master_Port: 3306
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 0
Last_Errno: 0
Last_Error:
تحلیل خروجی:
Slave_IO_Running: Yes: نشان میدهد ارتباط شبکهای با موفقیت برقرار شده و دیتابیس در حال خواندن لاگها است.Slave_SQL_Running: Yes: نشان میدهد کوئریهای دریافت شده با موفقیت در دیتابیس محلی اجرا میشوند.Seconds_Behind_Master: 0: عدد 00 یعنی کلاستر بدون هیچگونه تاخیری در حال همگامسازی لحظهای است.Last_Errno: 0: عدم وجود هیچگونه خطا در ارتباط.
جمعبندی
در این آموزش توانستیم دیتابیس MariaDB را با استفاده از سورس فایل کامپایلشده نصب کرده و یک کلاستر قدرتمند و بدون تاخیر را پیادهسازی کنیم. در حین راهاندازی این سناریوها، همیشه به مقادیر Log File و Position دقت کنید، زیرا رایجترین خطای این معماری (خطای 12361236) به دلیل وارد کردن پوزیشنهای اشتباه رخ میدهد. هماکنون این کلاستر آماده سرویسدهی در محیطهای عملیاتی (Production) است.