دليل مفصل خطوة بخطوة - مماثلة كاملة (Full Replication)

🖥️ السيرفر الرئيسي (Master)
IP: 192.168.1.100
💾 السيرفر التابع (Standby)
IP: 192.168.1.101
📌 مسار التثبيت الافتراضي لـ PostgreSQL 18:
C:\Program Files\PostgreSQL\18\
مجلد البيانات: C:\Program Files\PostgreSQL\18\data\
اسم الخدمة في Windows: postgresql-x64-18

الخطوة 1: التجهيز على السيرفر الرئيسي (Master)

1.1 إنشاء مستخدم النسخ (Replication User)

افتح SQL Shell (psql) كمسؤول وسجل دخولك:

-- إنشاء دور خاص بالنسخ
CREATE ROLE replicator WITH LOGIN PASSWORD 'StrongPassword123' REPLICATION;
\q
1.2 تعديل ملف postgresql.conf

المسار: C:\Program Files\PostgreSQL\18\data\postgresql.conf

افتح الملف باستخدام Notepad بصلاحية المسؤول (Run as Administrator) وعدّل الإعدادات التالية:

# مستوى سجل الكتابة المسبقة (يجب أن يكون replica)
wal_level = replica

# الحد الأقصى لعدد عمليات الإرسال المتزامنة
max_wal_senders = 10

# الحد الأقصى لفتحات النسخ (Slots)
max_replication_slots = 10

# المساحة المحتفظ بها من WAL (10 جيجابايت)
wal_keep_size = 10240

# السماح بالاتصالات من جميع العناوين
listen_addresses = '*'

# اختياري: ضغط البيانات المرسلة
# wal_compression = on
1.3 تعديل ملف الصلاحيات pg_hba.conf

المسار: C:\Program Files\PostgreSQL\18\data\pg_hba.conf

أضف السطر التالي في نهاية الملف:

# TYPE  DATABASE     USER        ADDRESS          METHOD
host    replication  replicator  192.168.1.101/32 scram-sha-256
1.4 إعادة تشغيل خدمة PostgreSQL

افتح PowerShell كمسؤول ونفذ:

# إيقاف الخدمة
Stop-Service -Name postgresql-x64-18

# تشغيل الخدمة
Start-Service -Name postgresql-x64-18

# التحقق من الحالة
Get-Service postgresql-x64-18

أو عبر موجه الأوامر (CMD):

net stop postgresql-x64-18
net start postgresql-x64-18

الخطوة 2: إعداد السيرفر التابع (Standby)

2.1 إيقاف خدمة PostgreSQL على التابع
Stop-Service -Name postgresql-x64-18
2.2 حذف محتويات مجلد البيانات الحالي
⚠️ تحذير هام: هذا الإجراء يحذف جميع البيانات الموجودة على التابع. تأكد من عدم وجود بيانات مهمة.
# الانتقال لمجلد PostgreSQL
cd "C:\Program Files\PostgreSQL\18\"

# حذف محتويات مجلد data (تأكد أن الخدمة متوقفة)
Remove-Item -Path ".\data\*" -Recurse -Force
2.3 سحب النسخة الأساسية من الرئيسي باستخدام pg_basebackup

نفذ الأمر التالي في PowerShell كمسؤول. يجب تنفيذه كمستخدم postgres:

runas /user:postgres "C:\Program Files\PostgreSQL\18\bin\pg_basebackup.exe -h 192.168.1.100 -p 5432 -U replicator -D \"C:\Program Files\PostgreSQL\18\data\" -Fp -Xs -P -R -C"

سيُطلب منك:

  1. كلمة سر مستخدم postgres في Windows.
  2. كلمة سر مستخدم replicator في PostgreSQL (StrongPassword123).
شرح خيارات الأمر pg_basebackup
الخيارالوصف
-h 192.168.1.100عنوان السيرفر الرئيسي
-U replicatorاسم مستخدم النسخ
-D "..."مجلد الوجهة في التابع
-Xsسحب WAL مباشرة (Stream)
-Pإظهار شريط التقدم
-Rينشئ ملف standby.signal تلقائياً
-Cينشئ Replication Slot لمنع فقدان البيانات

الخطوة 3: تكوين التابع للعمل في وضع Standby

3.1 التأكد من وجود ملف standby.signal

إذا لم ينشئ الملف تلقائياً، أنشئه يدوياً:

New-Item -Path "C:\Program Files\PostgreSQL\18\data\standby.signal" -ItemType File
3.2 تفعيل وضع Hot Standby (اختياري لكن مفيد)

يسمح بتنفيذ استعلامات القراءة فقط على التابع. أضف في ملف postgresql.conf للتابع:

hot_standby = on
3.3 تشغيل خدمة التابع
Start-Service -Name postgresql-x64-18

الخطوة 4: اختبار المماثلة (Replication)

4.1 التحقق من حالة التابع

افتح SQL Shell على التابع ونفذ:

SELECT pg_is_in_recovery();

يجب أن تكون النتيجة t (true) - أي أن التابع في وضع الاسترداد.

4.2 اختبار كتابة وقراءة البيانات

على السيرفر الرئيسي (Master):

CREATE DATABASE test_repl;
\c test_repl
CREATE TABLE orders (id SERIAL PRIMARY KEY, product TEXT);
INSERT INTO orders (product) VALUES ('Laptop from Windows Master');

على السيرفر التابع (Standby):

\c test_repl
SELECT * FROM orders;

يجب أن ترى الصف الجديد يظهر فوراً.

أوامر مراقبة حالة النسخ

على الرئيسي - لمعرفة حالة التابع:

SELECT 
    application_name, 
    state, 
    sync_state, 
    pg_wal_lsn_diff(sent_lsn, write_lsn) AS write_lag_bytes,
    pg_wal_lsn_diff(write_lsn, flush_lsn) AS flush_lag_bytes
FROM pg_stat_replication;

على التابع - لمعرفة آخر تغيير مستلم:

SELECT 
    pg_last_wal_receive_lsn() AS last_received,
    pg_last_wal_replay_lsn() AS last_replayed;

ملاحظات هامة لنظام Windows

🔧 جدار الحماية (Windows Firewall)

يجب فتح منفذ 5432 TCP على كلا الجهازين. نفذ في PowerShell كمسؤول:

New-NetFirewallRule -DisplayName "PostgreSQL 18" -Direction Inbound -Protocol TCP -LocalPort 5432 -Action Allow

أو عبر موجه الأوامر:

netsh advfirewall firewall add rule name="PostgreSQL 18" dir=in action=allow protocol=TCP localport=5432

📁 صلاحيات المجلدات

تأكد أن مستخدم postgres (المستخدم المحلي في Windows) لديه صلاحيات Full Control على المجلد:

C:\Program Files\PostgreSQL\18\data

🛡️ مضاد الفيروسات وجدار الحماية

قد تتدخل بعض برامج الحماية وتمنع الاتصال. إذا فشل pg_basebackup أو بقيت المماثلة متوقفة، جرب تعطيل جدار الحماية مؤقتاً للاختبار.

✅ الخلاصة

بهذا الإعداد، أصبح لديك Replication كامل بين السيرفرين على Windows مع PostgreSQL 18. التابع سيبقى متزامناً طالما الاتصال قائم. إذا انقطع الاتصال، سيعيد المزامنة تلقائياً عند عودته طالما wal_keep_size كافٍ.

totop