WIUNIX ACADEMY
آموزش نصب و راهاندازی رپلیکیشن MariaDB در اوبونتو و دبیان
دو سرور تازهٔ MariaDB را با GTID و TLS به هم متصل کنید؛ دادهٔ اولیه را سازگار منتقل کنید و رسیدن تراکنش جدید به رپلیکای فقطخواندنی را بسنجید.
محیطت را انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
ویرایش 3 مقدار این آموزش
از اینجا شروع کن
در پایان چه چیزی خواهی داشت؟
راهاندازی سرور اصلی و رپلیکای تازه با انتقال اولیهٔ سازگار، TLS تأییدشده و بررسی عملی رسیدن تراکنش تازه.
سیستمعاملها و نسخههای پوششدادهشده
بازبینی۲۰اکتبر۲۰۲۶؛ پنج مسیر سیستمعامل مستندمحورند. دو نمونهٔ واقعی MariaDB 10.11.14 روی Ubuntu 24.04.4 amd64 در فضای شبکهٔ جدا،۱۳ بررسی محدود را گذراندند: نسخهٔ سازگار و بازیابی، GTID، TLS، دریافت و اجرای رویداد، ردیف واقعی، انتظار و پایان مهلت، رد نوشتن عادی، راهاندازی دوباره، شکست امن با CA گمشده و توقف با حفظ داده. بستههای رسمی فقط استخراج شدند. نصب میزبان، systemd و UFW، DNS خصوصی، تمدید PKI سازمانی، همهٔ OSها یا مهاجرت تولیدی آزمایش نشدهاند. LTS بالادست12.3.3 با شاخهٔ خود توزیع فرق دارد؛ نسخهها را مخلوط نکنید. عکسها نمایشیاند.
قبل از شروع
- دو میزبان تازه با systemd، نسخهٔ یکسان سیستمعامل و بسته، دسترسی sudo و SSH، شبکهٔ خصوصی، ساعت هماهنگ و حداقل۲گیگابایت RAM برای هر سرور.
- فایروال و ACL خصوصی با ورودی پیشفرض بسته، کلید SSH تأییدشده و نام داخلی سرور اصلی؛ پورت3306 عمومی نباشد.
- گواهی معتبر سرور اصلی با SAN درست و کلید متناظر، زنجیرهٔ CA یکسان روی رپلیکا، مدیر رمز و ترمینال امن. تا پایان بررسی، برنامه حق نوشتن ندارد.
معماری: یک سرور نویسنده و یک رپلیکا
این راهنما برای دو سرور تازه و اختصاصی است: سرور اصلی با آدرس 10.20.0.10 و شناسهٔ 101، رپلیکا با آدرس 10.20.0.11 و شناسهٔ 102. هر دو از دامنهٔ GTID صفر استفاده میکنند. برنامه فقط روی سرور اصلی مینویسد؛ رپلیکا رویدادها را با TLS دریافت و سپس اجرا میکند. تأیید تراکنش روی سرور اصلی به معنی رسیدن آن به رپلیکا نیست. حذف اشتباه هم منتقل میشود؛ بنابراین این معماری جای بکاپ یا طراحی کامل دسترسپذیری بالا را نمیگیرد.
پیش از نصب، محدوده را مشخص کنید
دو میزبان باید نسخهٔ یکسان سیستمعامل و بستهٔ MariaDB داشته باشند. روی هیچکدام نباید دیتابیس کاربر، کانال تکثیر یا نصب قبلی MySQL/MariaDB وجود داشته باشد. فقط دیتابیس آزمایشی academy_lab منتقل میشود؛ حسابهای برنامه و جداول سیستمی منتقل نمیشوند. اگر بررسی اولیه دادهای پیدا کرد، همینجا متوقف شوید و برای مهاجرت موجود برنامهٔ جدا و بکاپ قابلبازیابی تهیه کنید. آدرسها، رابط ens18، کاربر SSH با نام dbadmin و نام گواهی نمونهاند؛ همه را با مقادیر شبکهٔ خصوصی خود هماهنگ کنید.
قدم بعدی
بررسی هر دو سرور تازه
با حساب مدیریتی فعلی روی هر دو میزبان اجرا کنید. وجود بسته یا دادهٔ قبلی باعث توقف میشود؛ برای عبور از این کنترل چیزی را پاک نکنید. نسخهٔ سیستمعامل، آدرس خصوصی، ساعت و فضای آزاد را بررسی کنید. برای این آزمایش کوچک حداقل ۲ گیگابایت RAM و ۱۰ گیگابایت فضای آزاد، بهعلاوهٔ فضای لاگ و بکاپ در نظر بگیرید.
هر دو میزبان تازه؛ Bash با حساب مدیریتی موجود.
(
set -euo pipefail
. /etc/os-release
printf '%s %s\n' "$ID" "$VERSION_ID"
dpkg --print-architecture
ip -br address
timedatectl status
df -h / /var
installed=$(dpkg-query -W -f='${binary:Package} ${db:Status-Status}\n')
if printf '%s\n' "$installed" | grep -E '^(mariadb-server|mysql-server)([-:][^ ]*)? installed$' >/dev/null; then
echo 'Existing database server: STOP' >&2; exit 1
fi
for path in /var/lib/mariadb /var/lib/mysql /etc/mysql/mariadb.conf.d /etc/mariadb/mariadb.conf.d; do
if sudo test -e "$path"; then echo "Existing state: $path; STOP" >&2; exit 1; fi
done
)
هر دو میزبان تازه، آدرسها تخصیصیافته، ساعت هماهنگ و منابع کافی باشند.
قدم بعدی
دسترسی شبکه را پیش از بازشدن پورت محدود کنید
این مرحله فرض میکند UFW از قبل فعال است، ورودی پیشفرض را رد میکند و SSH فعلی مجاز است؛ ACL شبکهٔ بالادست هم باید همین محدودیت را داشته باشد. روی سرور اصلی فقط آدرس رپلیکا را در رابط خصوصی مجاز کنید. این آموزش برای فعالکردن یا بازنشانی فایروال از راه دور نیست. اگر فایروال شما ابزار دیگری است، مسئول شبکه باید قاعدهٔ معادل را پیش از ادامه برقرار کند. رپلیکا روی loopback گوش میدهد و به قاعدهٔ ورودی دیتابیس نیاز ندارد.
سرور اصلی
(
set -euo pipefail
state=$(sudo env LC_ALL=C ufw status verbose)
printf '%s\n' "$state"
printf '%s\n' "$state" | grep -E '^Status: active$' >/dev/null
printf '%s\n' "$state" | grep -F 'Default: deny (incoming)' >/dev/null
sudo ufw allow in on ens18 from 10.20.0.11 to 10.20.0.10 port 3306 proto tcp
sudo ufw status numbered
)
فایروال فعال با ورودی پیشفرض بسته؛ فقط رپلیکا به پورت خصوصی3306 سرور اصلی برسد.
قدم بعدی
نصب بسته از مخزن همان نسخه
روی هر دو سرور تازه اجرا کنید. اعتبار امضا و هش بسته بر عهدهٔ APT است؛ مخزن نسخهٔ دیگری را اضافه نکنید و بررسی امضا را دور نزنید. نصب، نمونهٔ خالی میسازد و ممکن است سرویس را روشن کند. تا نصب تنظیمات خصوصی، شنوندهٔ شبکه باید فقط محلی باشد. نسخهٔ دقیق بستهٔ دو سرور را مقایسه کنید.
Debian 13: شاخهٔ MariaDB 11.8 با وصلهٔ بررسیشدهٔ11.8.6. بستهٔ امنیتی جاری همان توزیع را روی هر دو سرور با نسخهٔ دقیق یکسان نصب کنید. مسیر تنظیمات /etc/mysql/mariadb.conf.d است. Ubuntu 22.04 بهدلیل پایان پشتیبانی جامعهٔ10.6 در ژوئیهٔ2026 ارائه نشده؛ برای Debian 12 پوشش بسته در دورهٔ LTS را بررسی کنید. مسیر داده در نصب تازه: /var/lib/mysql؛ پیشفرض بسته و اسکریپت نگهدارندهٔ رسمی بررسی شد.
هر دو میزبان تازه؛ Bash با حساب مدیریتی موجود.
(
set -euo pipefail
sudo apt-get update
apt-cache policy mariadb-server mariadb-client
sudo apt-get install -y mariadb-server mariadb-client openssl ca-certificates nano
dpkg-query -W -f='${Package} ${Version}\n' mariadb-server mariadb-client
sudo systemctl enable --now mariadb
sudo mariadb -NBe 'SELECT VERSION();'
sudo ss -lntp 'sport = :3306'
)
نسخهٔ دقیق بستهها در هر دو میزبان یکسان و پورت3306 در ابتدا فقط محلی باشد.
آمادهسازی گواهی معتبر شبکهٔ خصوصی
مسئول PKI باید زنجیرهٔ CA، گواهی سرور اصلی و کلید متناظر را در پوشهٔ خصوصی root تحویل داده باشد. گواهی باید هماکنون معتبر، دارای کاربرد serverAuth و نام db-primary.example.internal در SAN باشد؛ فایل fullchain گواهیهای میانی را هم دارد. کلید امضای CA روی هیچیک از دو سرور قرار نمیگیرد. فقط همان زنجیرهٔ عمومی CA به رپلیکا تحویل میشود. صدور و تمدید در فرایند موجود PKI انجام میشود؛ از گواهی نامعتبر با خاموشکردن کنترل امنیتی عبور نکنید. اثرانگشت فایلها را از کانال مورد اعتماد تطبیق دهید.
قدم بعدی
نصب و بررسی گواهی سرور اصلی
روی سرور اصلی اجرا کنید. فایلها باید قبلاً تحویل شده باشند؛ این مسیرها آدرس دانلود نیستند. کلید فقط برای root و mysql قابلخواندن است. دو هش کلید عمومی باید یکسان باشند. نام داخلی سرور اصلی باید از رپلیکا به آدرس خصوصی درست برسد؛ رکورد DNS داخلی را پیش از ادامه آماده کنید.
سرور اصلی
(
set -euo pipefail
sudo install -d -o root -g mysql -m 0750 /etc/mysql/tls
sudo install -o root -g mysql -m 0640 /root/academy-pki/ca.pem /etc/mysql/tls/ca.pem
sudo install -o root -g mysql -m 0640 /root/academy-pki/primary-fullchain.pem /etc/mysql/tls/server.pem
sudo install -o root -g mysql -m 0640 /root/academy-pki/primary-key.pem /etc/mysql/tls/server.key
sudo openssl x509 -in /etc/mysql/tls/server.pem -noout -subject -issuer -dates -ext subjectAltName
sudo openssl x509 -in /etc/mysql/tls/server.pem -checkend 86400 -noout
sudo openssl x509 -in /etc/mysql/tls/server.pem -pubkey -noout | openssl sha256
sudo openssl pkey -in /etc/mysql/tls/server.key -pubout | openssl sha256
sudo -u mysql test -r /etc/mysql/tls/server.key
)
نام SAN و اعتبار درست، دو هش یکسان و کلید فقط برای root و mysql قابلخواندن باشد.
قدم بعدی
بازکردن تنظیمات سرور اصلی
فایل افزودهٔ زیر را روی سرور اصلی بسازید؛ فایل پایهٔ توزیع را جایگزین نکنید. مسیر این پنل با انتخاب سیستمعامل تغییر میکند و مسیر واقعی LTS و دبیان را نشان میدهد.
سرور اصلی
sudo nano /etc/mysql/mariadb.conf.d/90-academy-replication.cnf
فایل افزودهٔ تازهٔ سرور اصلی باز و فایل پایه حفظ شود.
قدم بعدی
تنظیمات شناسه، ثبت تراکنش و TLS
محتوای فایل، فقط برای سرور اصلی است. دامنهٔ صفر یک جریان تراکنش را مشخص میکند؛ شناسهٔ یکتای میزبان همان server_id است. قالب ROW وابستگی به اجرای دوبارهٔ عبارت SQL را کم میکند. نگهداری هفتروزهٔ باینریلاگ فقط نمونهٔ آزمایش است؛ برای زمان تهیه و انتقال داده، جبران تأخیر و قطعی ظرفیت کافی بگذارید. این تنظیمات، جابهجایی بدون ازدسترفتن داده را تضمین نمیکنند.
محتوای فایل؛ در فایل مشخصشده ذخیره شود، نه در پوسته.
[mariadb]
server_id=101
bind_address=10.20.0.10
log_bin=/var/lib/mysql/primary-bin
binlog_format=ROW
gtid_domain_id=0
gtid_strict_mode=ON
log_slave_updates=ON
sync_binlog=1
innodb_flush_log_at_trx_commit=1
binlog_expire_logs_seconds=604800
read_only=OFF
ssl_ca=/etc/mysql/tls/ca.pem
ssl_cert=/etc/mysql/tls/server.pem
ssl_key=/etc/mysql/tls/server.key
فایل با شناسه101 و مسیرهای خصوصی و تنظیمات توضیحدادهشده ذخیره شود.
قدم بعدی
بررسی گزینهها و راهاندازی مجدد سرور اصلی
فقط روی سرور اصلی. فرمان help خطای گزینهها را میگیرد، اما جای بررسی راهاندازی واقعی یا گواهی نیست. راهاندازی مجدد اتصالها را قطع میکند. اگر سرویس بالا نیامد، برنامه را متصل نکنید و بخش عیبیابی را ببینید. مقدارهای فعال و شنوندهٔ خصوصی باید با تنظیمات یکسان باشند.
سرور اصلی
(
set -euo pipefail
sudo mariadbd --verbose --help >/dev/null
sudo systemctl restart mariadb
systemctl is-active mariadb
sudo mariadb -e "SHOW VARIABLES WHERE Variable_name IN ('server_id','log_bin','binlog_format','gtid_domain_id','gtid_strict_mode','read_only','have_ssl','sync_binlog','innodb_flush_log_at_trx_commit','binlog_expire_logs_seconds');"
sudo ss -lntp 'sport = :3306'
)
sudo mariadb -e "SELECT @@datadir;"
شناسه101، باینریلاگ روشن، قالب ROW، دامنه0، strict روشن، read_only خاموش و TLS فعال؛ شنونده روی10.20.0.10 باشد.
قدم بعدی
نصب CA و بررسی نام سرور از رپلیکا
روی رپلیکا اجرا کنید. در این طراحی یکطرفه، رپلیکا با CA و نام گواهی هویت سرور اصلی را میسنجد؛ سرور اصلی هم حساب محدود رپلیکا را با رمز تأیید میکند. کلید خصوصی کلاینت لازم نیست. خروجی DNS باید آدرس خصوصی سرور اصلی باشد. خود CA محرمانه نیست، اما تعویض آن مرز اعتماد را تغییر میدهد.
رپلیکا
(
set -euo pipefail
sudo install -d -o root -g mysql -m 0750 /etc/mysql/tls
sudo install -o root -g mysql -m 0640 /root/academy-pki/ca.pem /etc/mysql/tls/ca.pem
sudo -u mysql test -r /etc/mysql/tls/ca.pem
getent ahostsv4 db-primary.example.internal
)
mysql زنجیرهٔ CA را بخواند و DNS داخلی به10.20.0.10 برسد.