مقدمه
Streaming Replication یکی از محبوبترین روشها برای مقیاسپذیری افقی دیتابیسهای رابطهای است. در این روش، دو یا چند نسخه از یک کلاستر دیتابیس روی ماشینهای جداگانه اجرا میشوند. یکی از این کلاسترها به عنوان Primary شناخته میشود و عملیات خواندن و نوشتن را انجام میدهد؛ سایر کلاسترها که Replica نام دارند، فقط عملیات خواندن را سرویسدهی میکنند.
همچنین میتوانید از Streaming Replication برای افزایش High Availability استفاده کنید. اگر سرور یا کلاستر اصلی به هر دلیلی از دسترس خارج شود، Replicaها میتوانند همچنان درخواستهای خواندن را پاسخ دهند یا یکی از Replicaها به Primary جدید تبدیل شود.
PostgreSQL یکی از محبوبترین دیتابیسهای رابطهای است که از هر دو نوع Replication یعنی Logical و Physical پشتیبانی میکند. در Logical Replication تغییرات سطح بالا از Primary به Replica منتقل میشوند و حتی میتوان فقط یک دیتابیس یا جدول خاص را Replicate کرد. اما در Physical Replication، تغییرات فایل WAL یا همان Write-Ahead Logging منتقل میشوند و در نتیجه تمام تغییرات کلاستر اصلی روی Replica اعمال خواهد شد.
در این آموزش، نحوه راهاندازی Physical Streaming Replication در PostgreSQL 12 روی Ubuntu 20.04 را با استفاده از دو سرور جداگانه یاد میگیرید. یکی از سرورها به عنوان Primary و دیگری به عنوان Replica عمل خواهد کرد.
پیشنیازها
قبل از شروع این آموزش، موارد زیر باید آماده باشند:
- دو سرور Ubuntu 20.04 جداگانه
- یکی به عنوان Primary
- دیگری به عنوان Replica
- یک کاربر غیر Root با دسترسی sudo روی هر دو سرور
- فعال بودن فایروال و باز بودن پورتهای:
- HTTP/HTTPS
- پورت 5432 (پورت پیشفرض PostgreSQL)
- نصب PostgreSQL 12 روی هر دو سرور
مرحله اول — تنظیم Primary برای پذیرش اتصال
به صورت پیشفرض PostgreSQL فقط روی localhost یا همان 127.0.0.1 گوش میدهد. برای اینکه Replica بتواند به Primary متصل شود، باید تنظیمات listen_addresses را تغییر دهید.
روی سرور Primary فایل تنظیمات PostgreSQL را باز کنید:
sudo nano /etc/postgresql/12/main/postgresql.conf
مقدار listen_addresses را پیدا کرده و آن را از localhost به IP سرور Primary تغییر دهید:
listen_addresses = 'your_primary_IP_address'
همچنین علامت # ابتدای خط را حذف کنید.
فایل را ذخیره کرده و خارج شوید.
اکنون PostgreSQL آماده پذیرش اتصال از سایر ماشینها خواهد بود.
مرحله دوم — ساخت Role مخصوص Replication
در این مرحله باید یک Role مخصوص Replication ایجاد کنید تا Replica با استفاده از آن به Primary متصل شود.
ابتدا وارد محیط PostgreSQL شوید:
sudo -u postgres psql
سپس Role را ایجاد کنید:
CREATE ROLE test WITH REPLICATION PASSWORD 'testpassword' LOGIN;
خروجی:
CREATE ROLE
این دستور یک Role به نام test میسازد که مجوز Replication دارد.
اکنون از محیط PostgreSQL خارج شوید:
\q
سپس فایل pg_hba.conf را باز کنید:
sudo nano /etc/postgresql/12/main/pg_hba.conf
این خط را به انتهای فایل اضافه کنید:
host replication test your-replica-IP/32 md5
این تنظیم اجازه میدهد Replica با استفاده از Role ساختهشده به دیتابیس Replication متصل شود.
در نهایت PostgreSQL را ریاستارت کنید:
sudo systemctl restart postgresql@12-main
مرحله سوم — گرفتن Backup از Primary روی Replica
در Physical Replication باید یک نسخه کامل از فایلهای دیتابیس Primary روی Replica کپی شود.
ابتدا محتوای دیتادایرکتوری Replica را حذف کنید:
sudo -u postgres rm -r /var/lib/postgresql/12/main/*
اگر به هر دلیلی خطا دریافت کردید، کل پوشه را حذف و دوباره ایجاد کنید:
sudo -u postgres rm -r /var/lib/postgresql/12/main
sudo -u postgres mkdir /var/lib/postgresql/12/main
sudo -u postgres chmod 700 /var/lib/postgresql/12/main
اکنون با استفاده از pg_basebackup از Primary بکاپ بگیرید:
sudo -u postgres pg_basebackup -h primary-ip-addr -p 5432 -U test -D /var/lib/postgresql/12/main/ -Fp -Xs -R
توضیح پارامترها
-h
آدرس IP سرور Primary-p
پورت PostgreSQL-U
نام Role مربوط به Replication-D
مسیر ذخیره Backup-Fp
خروجی به صورت Plain Format-Xs
انتقال WAL همزمان با Backup-R
قرار دادن Replica در حالت Standby
پس از اجرای دستور، رمز عبور Role را وارد کنید.
بسته به حجم دیتابیس، این فرآیند ممکن است کمی زمان ببرد.
مرحله چهارم — راهاندازی Replica و تست Replication
اکنون Replica را ریاستارت کنید:
sudo systemctl restart postgresql@12-main
اگر همه چیز درست تنظیم شده باشد، Replica به صورت خودکار به Primary متصل میشود.
روی سرور Primary وارد PostgreSQL شوید:
sudo -u postgres psql
سپس وضعیت Replication را بررسی کنید:
SELECT client_addr, state FROM pg_stat_replication;
خروجی مشابه زیر خواهد بود:
client_addr | state
------------------+-----------
your_replica_IP | streaming
اگر وضعیت streaming نمایش داده شود یعنی Replication با موفقیت فعال شده است.
نتیجهگیری
اکنون دو سرور Ubuntu 20.04 دارید که روی هرکدام PostgreSQL 12 اجرا شده و بین آنها Physical Streaming Replication برقرار است.
از این پس هر تغییری که روی Primary انجام شود، روی Replica نیز اعمال خواهد شد.
همچنین در صورت نیاز میتوانید Replicaهای بیشتری به ساختار خود اضافه کنید تا توان پاسخگویی سیستم افزایش پیدا کند.
نظرات کاربران