WIUNIX ACADEMY
آموزش نصب و راهاندازی رپلیکیشن MariaDB در اوبونتو و دبیان
صفحهٔ 3 از 4؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
ویرایش 3 مقدار این آموزش
قدم بعدی
ورود به نشست امن SQL رپلیکا
در ترمینال رپلیکا نشست بدون تاریخچه باز کنید. همان رمز یکتایی که برای حساب اصلی ساخته شد لازم است. عبارت اتصال حاوی رمز نباید به آرگومان پوسته، فایل عمومی یا خروجی منتشرشده تبدیل شود.
ترمینال رپلیکا
sudo env MYSQL_HISTFILE=/dev/null mariadb
نشست مدیریتی محلی رپلیکا بدون ثبت تاریخچه باز شود.
قدم بعدی
اتصال تکثیر با GTID و TLS تأییدشده
داخل نشست SQL رپلیکا اجرا کنید. MariaDB برای سازگاری هنوز نامهای MASTER و SLAVE را در این دستورها دارد. نام میزبان باید با SAN گواهی و DNS خصوصی تطابق داشته باشد. رمز را پیش از اجرا در نشست امن جایگزین کنید. حالت slave_pos ادامهٔ رویدادها پس از نسخهٔ بازیابیشده را میگیرد. اگر TLS خطا داد، علت را رفع کنید؛ تأیید گواهی نباید خاموش شود.
نشست SQL رپلیکا
CHANGE MASTER TO
MASTER_HOST='db-primary.example.internal',
MASTER_PORT=3306,
MASTER_USER='academy_repl',
MASTER_PASSWORD='REPLACE_WITH_THE_SAME_UNIQUE_SECRET',
MASTER_USE_GTID=slave_pos,
MASTER_SSL=1,
MASTER_SSL_CA='/etc/mariadb/tls/ca.pem',
MASTER_SSL_VERIFY_SERVER_CERT=1,
MASTER_CONNECT_RETRY=10;
START SLAVE;
SHOW SLAVE STATUS\G
EXIT;
دریافت و اجرا فعال؛ حالت Slave_Pos و TLS همراه با بررسی گواهی فعال باشد.
قدم بعدی
کنترل جداگانهٔ دریافت و اجرای رویداد
در رپلیکا هم دریافتکننده و هم اجراکننده باید Yes باشند؛ شمارهٔ خطای هر دو صفر و پیام خطا خالی باشد. شناسهٔ مبدأ101، حالت Slave_Pos و هر دو پرچم TLS را هم ببینید. صفرشدن تأخیر بهتنهایی سلامت را ثابت نمیکند؛ NULL ممکن است از توقف رشته بیاید و یک منبع بیکار هم تصویر کاملی از عقبماندگی نمیدهد. خروجی وضعیت شامل اطلاعات داخلی شبکه است.
رپلیکا
sudo mariadb -e "SHOW SLAVE STATUS\G"
sudo mariadb -e "SELECT @@server_id,@@read_only,@@GLOBAL.gtid_slave_pos;"
هر دو رشته Yes، خطاها صفر و خالی، مبدأ و GTID درست، تأیید TLS فعال و read_only برابر1 باشد.
نمونهٔ توضیحی وضعیت
این خروجی صرفاً نمونه است و نباید اجرا شود. نام لاگ، موقعیت و تأخیر واقعی باید از سرور خودتان خوانده شود.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_SQL_Errno: 0
Using_Gtid: Slave_Pos
Master_Server_Id: 101
Master_SSL_Allowed: Yes
Master_SSL_Verify_Server_Cert: Yes
Seconds_Behind_Master: 0قدم بعدی
بازکردن نوشتن و ثبت دادهٔ جدید
فقط روی سرور اصلی و پس از تأیید وضعیت رپلیکا و ردیف اولیه اجرا کنید. وقفهٔ نوشتن تمام میشود و یک ردیف جدید پس از اسنپشات ثبت میگردد. GTID خروجی محرمانه نیست؛ همان مقدار دقیق برای انتظار محدود روی رپلیکا استفاده میشود. مقصد نوشتن برنامه همچنان سرور اصلی است.
سرور اصلی
sudo mariadb -e "SET GLOBAL read_only=OFF; INSERT INTO academy_lab.replication_probe VALUES (2,'after-seed'); SELECT @@GLOBAL.gtid_binlog_pos AS target_gtid; SELECT * FROM academy_lab.replication_probe ORDER BY id;"
سرور اصلی قابلنوشتن، ردیفهای1 و2 حاضر و target_gtid واقعی ثبت شود.
قدم بعدی
انتظار برای همان تراکنش و مقایسهٔ داده
با روش قبلی نشست SQL رپلیکا را باز کنید و GTID واقعی مرحلهٔ قبل را جایگزین نمایید. نتیجهٔ غیرمنفی یعنی رسیدن به تراکنش؛ مقدار1- یعنی پایان مهلت و NULL یعنی خطا. هیچکدام را موفقیت حساب نکنید، حتی اگر فیلد تأخیر صفر باشد. هر دو ردیف و متنشان باید با سرور اصلی یکسان باشند. این بررسی برای جدول کوچک آزمایش است و تطبیق همهٔ دادههای تولیدی محسوب نمیشود.
نشست SQL رپلیکا
SELECT MASTER_GTID_WAIT('REPLACE_WITH_ACTUAL_TARGET_GTID',30) AS wait_result;
SELECT id,note FROM academy_lab.replication_probe ORDER BY id;
SHOW SLAVE STATUS\G
EXIT;
نتیجهٔ انتظار غیرمنفی؛ ردیف1 consistent-seed و ردیف2 after-seed؛ هر دو رشته بدون خطا فعال باشند.
قدم بعدی
آزمودن ادامهٔ تکثیر پس از راهاندازی مجدد
این آزمون اختیاری فقط رپلیکا را پس از مقایسهٔ موفق داده موقتاً قطع میکند. چون شروع خودکار غیرفعال نشده، کانال معمولاً پس از راهاندازی بالا میآید. داده، GTID، هر دو رشته و وضعیت فقطخواندنی را دوباره ببینید. راهاندازی مجدد، نبود باینریلاگ یا ناسازگاری داده را درمان نمیکند.
رپلیکا
sudo systemctl restart mariadb
systemctl is-active mariadb
sudo mariadb -e "SHOW SLAVE STATUS\G; SELECT @@read_only,@@GLOBAL.gtid_slave_pos; SELECT * FROM academy_lab.replication_probe ORDER BY id;"
داده و موقعیت حفظ، read_only برابر1 و هر دو رشته بدون خطا دوباره فعال شوند.
قدم بعدی
نگهداری بکاپ مستقل و قابلبازیابی
روی سرور اصلی و بدون تغییر ساختار همزمان اجرا کنید. دادهٔ آزمایشی، تنظیمات و گواهی با ساختار مسیرها بایگانی میشوند؛ خطا باعث توقف است و اصل فایلها باقی میماند. بایگانی کلید خصوصی دارد و باید در محل مجاز خارج از سرور با رمزنگاری نگهداری شود. تأیید هش و خواندن آرشیو جای بازیابی واقعی نیست. پیش از اتکا یا کنارگذاشتن هر دادهای، SQL را در نمونهٔ تازه و جدا با نسخهٔ متناظر بازیابی و ردیفها را بررسی کنید؛ فایل بازیابی را روی سرور نویسندهٔ فعال وارد نکنید. برای محیط واقعی، حسابها و اشیای سیستمی هم برنامهٔ بکاپ جدا میخواهند.
سرور اصلی
sudo bash -eu <<'BACKUP'
umask 077
install -d -m 0700 /root/academy-backups
backup=$(mktemp -d /root/academy-backups/mariadb-XXXXXXXX)
mariadb-dump --single-transaction --quick --routines --events --triggers --databases academy_lab > "$backup/academy_lab.sql"
test -s "$backup/academy_lab.sql"
tar -C / -cpf "$backup/config-tls.tar" etc/mariadb/mariadb.conf.d/90-academy-replication.cnf etc/mariadb/tls
cd "$backup"
sha256sum academy_lab.sql config-tls.tar > SHA256SUMS
sha256sum -c SHA256SUMS
tar -tf config-tls.tar >/dev/null
tar -C / -df config-tls.tar
printf 'Retained backup: %s\n' "$backup"
BACKUP
خواندن و هش آرشیو موفق و اصل داده حفظ شود؛ بازیابی جدا و نسخهٔ امن خارج از سرور همچنان لازم است.
قدم بعدی
حفظ توقف آگاهانه پس از راهاندازی مجدد
برای توقف یا برگشت، خواندن برنامه را از رپلیکا جدا کنید و نویسندهٔ سالم را همان سرور اصلی نگه دارید. هیچکدام را ارتقا ندهید. در فایل رپلیکا، گزینهٔ پنل بعدی را داخل گروه موجود اضافه کنید و read_only را روشن نگه دارید. توقف رشته بهتنهایی پس از راهاندازی مجدد پایدار نیست.
رپلیکا
sudo nano /etc/mariadb/mariadb.conf.d/90-academy-replication.cnf
فایل رپلیکا برای افزودن تنها گزینهٔ توقف پایدار باز شود.
قدم بعدی
گزینهٔ توقف پایدار
فقط همین گزینه را داخل گروه موجود mariadb در فایل رپلیکا اضافه کنید؛ باقی فایل را جایگزین نکنید.
محتوای فایل؛ در فایل مشخصشده ذخیره شود، نه در پوسته.
skip_slave_start=ON
تنها یک خط skip_slave_start در گروه موجود ذخیره و read_only روشن بماند.
قدم بعدی
توقف تکثیر با حفظ داده و موقعیت
فقط روی رپلیکا. وضعیت را برای بررسی داخلی نگه دارید، گزینهٔ تازه را بسنجید و کانال را متوقف کنید. هر دو رشته باید No شوند و داده باقی بماند. باینریلاگ، رلهلاگ یا پوشهٔ داده را پاک نکنید و تراکنش را رد نکنید. این توقف عملیاتی قابلبرگشت است، نه رفع ناسازگاری. اگر راهاندازی اولیه نیمهکاره مانده و سرور اصلی هنوز فقطخواندنی است، بازکردن نوشتن تنها پس از تعیین نویسندهٔ معتبر و با پنل صریح همان مرحله انجام شود.
رپلیکا
(
set -euo pipefail
sudo mariadbd --verbose --help >/dev/null
sudo mariadb -e "SHOW SLAVE STATUS\G; STOP SLAVE; SHOW SLAVE STATUS\G; SELECT * FROM academy_lab.replication_probe ORDER BY id;"
)
هر دو رشته No؛ داده، لاگ و فرادادهٔ اتصال حفظ و read_only برابر1 بماند.
قدم بعدی
ازسرگیری فقط با موقعیت معتبر
اختیاری و فقط پس از رفع علت، اطمینان از سازگاری داده و موجودبودن لاگهای لازم روی سرور اصلی. با ویرایشگر فقط خط توقف خودکار را بردارید؛ بقیهٔ تنظیمات و read_only حفظ شوند. اگر تاریخچه منقضی یا داده ناسازگار است، این نمونه را نگه دارید و رپلیکای تازهٔ دیگری با نسخهٔ معتبر بسازید؛ دادهٔ فعلی را بازنویسی نکنید.
رپلیکا
sudo nano /etc/mariadb/mariadb.conf.d/90-academy-replication.cnf
فقط خط توقف پس از تأیید سازگاری داده و وجود لاگها برداشته شود.