WIUNIX ACADEMY
آموزش نصب و راهاندازی رپلیکیشن MariaDB در اوبونتو و دبیان
صفحهٔ 2 از 4؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
ویرایش 3 مقدار این آموزش
قدم بعدی
بازکردن تنظیمات رپلیکا
روی رپلیکا فایل افزودهٔ متناسب با سیستمعامل انتخابی را باز کنید. محتوای پنل بعدی مخصوص رپلیکا است و نباید با تنظیمات سرور اصلی عوض شود.
رپلیکا
sudo nano /etc/mariadb/mariadb.conf.d/90-academy-replication.cnf
فایل افزودهٔ رپلیکا در مسیر سیستمعامل انتخابی باز شود.
قدم بعدی
تنظیم رپلیکا برای جلوگیری از نوشتن عادی
محتوای فایل رپلیکا. گزینهٔ read_only نوشتن عادی را رد میکند؛ رشتهٔ تکثیر و مدیر دارای اختیار READ_ONLY ADMIN یا SUPER همچنان میتوانند بنویسند. این اختیارها نباید به حساب برنامه داده شوند. فعالبودن باینریلاگ و ثبت رویدادهای دریافتی به معنی ارتقای خودکار نقش نیست. این دستورها برای MariaDB 10.11 و11.8 نوشته شدهاند و به گزینهٔ اختصاصی MySQL تکیه ندارند.
محتوای فایل؛ در فایل مشخصشده ذخیره شود، نه در پوسته.
[mariadb]
server_id=102
bind_address=127.0.0.1
log_bin=/var/lib/mariadb/replica-bin
relay_log=/var/lib/mariadb/replica-relay
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=ON
فایل رپلیکا با شناسه102، شنوندهٔ محلی و read_only روشن ذخیره شود.
قدم بعدی
راهاندازی و کنترل رپلیکای خالی
فقط روی رپلیکا اجرا کنید. راهاندازی مجدد اتصالها را قطع میکند؛ در این آزمایش هنوز برنامهای متصل نیست. شناسه، وضعیت فقطخواندنی و اتصال محلی را بررسی کنید. نباید کانال تکثیر یا دیتابیس کاربر وجود داشته باشد. کانال موجود را بازنشانی نکنید؛ وجود آن دلیل توقف است.
رپلیکا
(
set -euo pipefail
sudo mariadbd --verbose --help >/dev/null
sudo systemctl restart mariadb
systemctl is-active mariadb
sudo mariadb -e 'SELECT VERSION(),@@server_id,@@read_only,@@gtid_domain_id; SHOW DATABASES; SHOW SLAVE STATUS\G'
sudo ss -lntp 'sport = :3306'
)
sudo mariadb -e "SELECT @@datadir;"
شناسه102، read_only برابر1، دامنه0؛ کانال تکثیر و دیتابیس کاربر غایب و شنونده محلی باشد.
قدم بعدی
ورود امن به نشست مدیریتی سرور اصلی
روی سرور اصلی نشست زیر را باز کنید. پنلهای SQL بعدی در همین نشست اجرا میشوند، نه در Bash. تاریخچهٔ کلاینت غیرفعال است. رمز بلند و یکتای حساب تکثیر را از مدیر رمز دریافت و فقط داخل نشست امن جایگزین کنید؛ رمز را در آرگومان فرمان، تاریخچهٔ پوسته، عکس یا تیکت نگذارید. مقدار نمونه رمز واقعی نیست. سیاست ضبط نشست و لاگ ممیزی را هم بررسی کنید؛ فرادادهٔ تکثیر شامل اطلاعات حساس اتصال است. رمز تصادفی۶۴کاراکتری فقط با رقم و حروف a تا f انتخاب کنید تا در رشتهٔ SQL به escaping نقلقول نیاز نباشد.
ترمینال سرور اصلی
sudo env MYSQL_HISTFILE=/dev/null mariadb
نشست مدیریتی محلی سرور اصلی بدون ثبت تاریخچه باز شود.
قدم بعدی
ساخت حساب محدود برای تکثیر
داخل نشست SQL سرور اصلی اجرا کنید. میزبان حساب باید دقیقاً IP مبدأ رپلیکا باشد؛ wildcard یا آدرس اشتباه پشت NAT نگذارید. تنها مجوز دریافت رویداد و الزام TLS داده میشود. بررسی نام گواهی در مرحلهٔ اتصال رپلیکا صریحاً فعال خواهد شد. ساخت حساب و GRANT به بارگذاری دستی جدول مجوز نیاز ندارند.
نشست SQL اصلی
CREATE USER 'academy_repl'@'10.20.0.11' IDENTIFIED BY 'REPLACE_WITH_UNIQUE_SECRET' REQUIRE SSL;
GRANT REPLICATION SLAVE ON *.* TO 'academy_repl'@'10.20.0.11';
حساب تازه فقط مجوز تکثیر، مبدأ محدود و الزام TLS داشته باشد؛ رمز در خروجی چاپ نشود.
قدم بعدی
ساخت دادهٔ آزمایش و بستن مسیر نوشتن
در نشست SQL اصلی، تنها دیتابیس کاربر این آزمایش را بسازید. برنامه و job یا مدیر دیگری نباید همزمان بنویسند. وضعیت فقطخواندنی را تا مقایسهٔ داده حفظ کنید. این گزینه جلوی مدیر پرامتیاز را نمیگیرد؛ بنابراین پنجرهٔ توقف نوشتن باید هماهنگ باشد. این توالی برای دیتابیس تولیدی موجود مجاز نیست.
نشست SQL اصلی
CREATE DATABASE academy_lab CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE academy_lab.replication_probe (id INT PRIMARY KEY, note VARCHAR(80) NOT NULL) ENGINE=InnoDB;
INSERT INTO academy_lab.replication_probe VALUES (1,'consistent-seed');
SET GLOBAL read_only=ON;
SELECT @@read_only;
SELECT * FROM academy_lab.replication_probe;
EXIT;
یک ردیف InnoDB و read_only برابر1؛ نویسندهای باقی نماند و نشست به پوسته برگردد.
قدم بعدی
گرفتن نسخهٔ سازگار همراه با موقعیت GTID
در Bash سرور اصلی اجرا کنید. پوشه باید تازه باشد؛ اجرای مجدد بهجای بازنویسی بکاپ قبلی متوقف میشود. اسنپشات InnoDB و موقعیت دقیق GTID در یک خروجی ثبت میشوند؛ قفل کوتاه ابتدای کار ممکن است منتظر تراکنش طولانی بماند. تغییر ساختار، جدول غیرتراکنشی یا نوشتن مدیر در این بازه مجاز نیست. این خروجی بذر همان دیتابیس آزمایشی است، نه بکاپ کامل همهٔ حسابها و دیتابیسها. موقعیت جدید سرور را به نسخهٔ قدیمی داده نچسبانید.
سرور اصلی
sudo bash -eu <<'SEED'
umask 077
mkdir /root/academy-seed
mariadb-dump --single-transaction --quick --master-data=2 --gtid --routines --events --triggers --skip-add-drop-table --databases academy_lab > /root/academy-seed/seed.sql
test -s /root/academy-seed/seed.sql
grep -E "^-- SET GLOBAL gtid_slave_pos='[0-9,-]+';" /root/academy-seed/seed.sql
cd /root/academy-seed
sha256sum seed.sql > SHA256SUMS
sha256sum -c SHA256SUMS
SEED
خروجی کامل، هش موفق و دقیقاً یک GTID ثبتشده. در خطا فایلها حفظ و ورود داده متوقف شود.
قدم بعدی
ساخت پوشهٔ خصوصی دریافت داده
روی رپلیکا با کاربر dbadmin اجرا کنید. پوشه نباید از قبل وجود داشته باشد. انتقال با SSH فعلی و کلید میزبان تأییدشده انجام میشود؛ بررسی کلید میزبان را خاموش نکنید.
پوستهٔ رپلیکا با dbadmin
( umask 077; mkdir "$HOME/academy-seed" )
پوشهٔ دریافت تازه با مالک dbadmin و دسترسی0700 ساخته شود.
قدم بعدی
انتقال فایل و هش از مسیر SSH
در پوستهٔ سرور اصلی با همان حساب مدیریتی dbadmin اجرا کنید. نوشتن از راه دور فایل قبلی را بازنویسی نمیکند. شکست خواندن یا SSH باعث توقف میشود. مجوز sudo خواندن فایلها باید از قبل برقرار یا احراز هویت محلی آن انجام شده باشد. اثرانگشت میزبان SSH باید پیشتر از مسیر مطمئن بررسی شده باشد.
پوستهٔ اصلی با dbadmin
(
set -euo pipefail
sudo -v
sudo cat /root/academy-seed/seed.sql | ssh -l dbadmin 10.20.0.11 'umask 077; set -C; cat > "$HOME/academy-seed/seed.sql"'
sudo cat /root/academy-seed/SHA256SUMS | ssh -l dbadmin 10.20.0.11 'umask 077; set -C; cat > "$HOME/academy-seed/SHA256SUMS"'
)
هر دو انتقال SSH موفق و نسخهٔ اصلی محافظتشده حفظ شود.
قدم بعدی
تأیید هش و بازیابی روی رپلیکای تازه
در پوستهٔ رپلیکا با dbadmin اجرا کنید. وجود دیتابیس مقصد، جدول کاربر دیگر، کانال تکثیر یا GTID اعمالشده باعث توقف میشود و چیزی پاک نمیشود. ابتدا هش بررسی میشود. ثبت باینریلاگ فقط در نشست بازیابی غیرفعال است تا ورود اولیه یک تاریخچهٔ رقیب نسازد؛ وضعیت فقطخواندنی سراسری روشن میماند. خطای ورود داده را با force یا اجرای دوباره روی دادهٔ نیمهکاره دور نزنید.
رپلیکا
(
set -euo pipefail
cd "$HOME/academy-seed"
sha256sum -c SHA256SUMS
test "$(sudo mariadb -NBe "SELECT COUNT(*) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='academy_lab';")" = 0
test "$(sudo mariadb -NBe "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys');")" = 0
channels=$(sudo mariadb -NBe 'SHOW SLAVE STATUS;')
test -z "$channels"
applied=$(sudo mariadb -NBe 'SELECT @@GLOBAL.gtid_slave_pos;')
test -z "$applied"
{ printf 'SET SESSION sql_log_bin=0;\n'; cat seed.sql; } | sudo mariadb
sudo mariadb -e 'SELECT @@read_only; SELECT * FROM academy_lab.replication_probe;'
)
هش و کنترل خالیبودن موفق؛ ردیف1 با متن consistent-seed و read_only برابر1 دیده شود.
قدم بعدی
تنظیم GTID ثبتشده در همان نسخهٔ داده
روی رپلیکا اجرا کنید. تنها خط GTID همان خروجی استخراج میشود و اگر تعداد یا قالب آن درست نباشد، کار متوقف خواهد شد. دامنه باید صفر، شناسهٔ مبدأ101 و شمارهٔ توالی مثبت باشد. از current_pos، موقعیت حدسی یا GTID جدیدتر سرور اصلی استفاده نکنید. این کنترل برای جریان تکدامنهٔ همین آزمایش است؛ تاریخچهٔ چندمبدأ به برنامهٔ جدا نیاز دارد.
رپلیکا
(
set -euo pipefail
cd "$HOME/academy-seed"
sha256sum -c SHA256SUMS
position=$(sed -n "s/^-- SET GLOBAL gtid_slave_pos='\(0-101-[1-9][0-9]*\)';$/\1/p" seed.sql)
if [[ ! "$position" =~ ^0-101-[1-9][0-9]*$ ]]; then
echo 'Missing, multiple or unexpected snapshot GTID; STOP' >&2; exit 1
fi
printf "SET GLOBAL gtid_slave_pos='%s';\n" "$position" | sudo mariadb
sudo mariadb -NBe 'SELECT @@GLOBAL.gtid_slave_pos;'
)
موقعیت gtid_slave_pos رپلیکا دقیقاً با تنها GTID داخل نسخهٔ تأییدشده یکسان باشد.