[{"data":1,"prerenderedAt":153},["ShallowReactive",2],{"seo-verification":3,"blog-توافر-postgresql-عال-مع-patroni-على-خادم-vps-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":24,"featuredImage":26,"bgImage":27,"posterImage":28,"relatedSolution":26,"intro":29,"sections":30,"ctaTitle":103,"ctaBody":104,"ctaButton":105,"ctaUrl":106,"relatedPosts":107},290,"توافر-postgresql-عال-مع-patroni-على-خادم-vps",{"fr":10,"en":11,"ar":8},"postgresql-haute-disponibilite-patroni-vps","postgresql-high-availability-with-patroni-on-vps","توافر PostgreSQL عالٍ مع Patroni على خادم VPS","كلستر PostgreSQL بثلاثة عُقد مع Patroni 4.1 وetcd 3.6: تحوّل تلقائي خلال 30 ثانية، نسخ متزامن، بدون خدمة مُدارة.",12,0,false,"2026-08-21T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},6,"قواعد البيانات","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[25],{"id":19,"name":20,"slug":21,"color":22,"icon":23},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fpostgresql-haute-disponibilite-patroni-vps-poster.svg","لا يتحمّل تطبيق SaaS متعدد المستأجرين أو أي تطبيق حسّاس أي انقطاع في قاعدة البيانات. Amazon RDS وAurora يحلّان المشكلة، لكن نموذج فوترتهما يكبر مع الحِمل. يوفّر Patroni 4.1 مع etcd 3.6 نفس مستوى التوافر على ثلاثة خوادم VPS بصلاحية root: تحوّل تلقائي في أقل من 30 ثانية، نسخ متزامن قابل للضبط، وواجهة REST API للتحكم في الكلستر من الطرفية. يشمل هذا الدليل التثبيت الكامل، وعرض التحوّل، والعمليات اليومية.",[31,35,45,48,51,59,87,90,93,97,100],{"type":32,"title":33,"body":34},"h2","لماذا التوافر العالي لـ PostgreSQL على VPS وليس RDS","يتعامل ‏Amazon RDS Multi-AZ‏ مع التحوّل بكفاءة، لكن نموذج تسعيره مصمَّم لتنمو الفاتورة بشكل غير خطي: التخزين، وIOPS المُخصَّصة، والاتصالات المتزامنة، وتكرار Multi-AZ كلها تُفوتَر بشكل منفصل. لخدمة SaaS ذات قاعدة بيانات متنامية، يتجاوز الفارق بسرعة تكلفة خادم VPS مخصَّص.\n\nعلى ثلاثة خوادم VPS بصلاحية root، يوفّر Patroni الخدمة ذاتها: قائد واحد يقبل الكتابة، ونسختان متزامنتان أو غير متزامنتين تتبعانه، وetcd يحتفظ بالنصاب. إن سقط القائد، يكشف Patroni الغياب عبر اتفاقية إيجار ‏etcd‏ (TTL قابل للضبط، عادةً 30 ثانية) ويُرقّي النسخة الأحدث. لا تدخّل بشري، ولا تحديث DNS يدوي إن كان موزّع الأحمال مثل \u003Ca href=\"\u002Fblog\u002Fdeployer-avec-haproxy-vps\">HAProxy\u003C\u002Fa> يشير إلى نقطة نهاية صحة Patroni.",{"type":36,"title":37,"items":38},"ul","ما يقدّمه هذا الكلستر",[39,40,41,42,43,44],"**تحوّل تلقائي خلال 30 ثانية** — يكشف Patroni فقدان القائد بانتهاء اتفاقية ‏etcd‏ ويُرقّي دون تدخّل.","**نسخ متزامن قابل للضبط** — `synchronous_mode: true` يضمن عدم فقدان أي معاملة مؤكَّدة عند تعطّل القائد.","**REST API مدمجة** — `GET \u002Fleader` و`GET \u002Fhealth` و`POST \u002Fswitchover`: استعلام الكلستر وإدارته دون عميل PostgreSQL.","**تكلفة ثابتة وقابلة للتنبؤ** — ثلاثة خوادم VPS بموارد محدّدة، بدون مفاجآت في الفاتورة.","**إضافات حرّة** — `pg_hba.conf` و`postgresql.conf` و`pgvector` و`PostGIS`: لا قيود تفرضها خدمة مُدارة.","**نسخ احتياطي مركزي** — يتكامل pgBackRest 2.59 بشكل أصلي مع Patroni لنسخ احتياطي تدريجي من النسخة المتماثلة.",{"type":32,"title":46,"body":47},"معمارية الكلستر: ثلاث عُقد، نصاب واحد","يرتكز الكلستر على ثلاث طبقات:\n\n**etcd** يحتفظ بسجل الإعداد الموزَّع (DCS). هو من يملك اتفاقية إيجار القائد. إن لم يجدّد قائد Patroni هذه الاتفاقية خلال مهلة TTL، أطلقها etcd وتنافس عليها العُقد الاحتياطية بالانتخاب. مع ثلاث عُقد etcd (واحدة لكل VPS)، يتحمّل النصابُ فقدانَ عُقدة واحدة دون خسارة التوافر.\n\n**Patroni** يعمل على كل VPS جنبًا إلى جنب مع PostgreSQL. يتولّى تهيئة الكلستر، وإعداد `postgresql.conf` و`pg_hba.conf`، وتتبّع تأخّر النسخ، والتحوّل. يعرض REST API على المنفذ 8008.\n\n**PostgreSQL** تديره Patroni بالكامل — لا تُعدّل `postgresql.conf` مباشرةً؛ كل تغيير يمر عبر `patronictl edit-config` ليبقى متزامنًا على العُقد الثلاث.\n\nتدفّق النسخ: يستقبل القائد الكتابة على شكل WAL، وتتصل النسخ عبر `pg_basebackup` عند أول تشغيل ثم تتابع تدفّق WAL باستمرار. في الوضع المتزامن، ينتظر القائد تأكيد نسخة واحدة على الأقل قبل إرجاع `COMMIT` للعميل.",{"type":32,"title":49,"body":50},"المتطلبات: الموارد والشبكة","كُتب هذا الدليل باستخدام Patroni 4.1.5 وetcd 3.6.6 وPostgreSQL 17 على Debian 12.",{"type":36,"title":52,"items":53},"الحد الأدنى الموصى به من الموارد لكل عُقدة",[54,55,56,57,58],"**2 vCPU \u002F 4 جيجابايت RAM** — كافٍ للبدء؛ خطّط لـ 8 جيجابايت RAM بمجرد تجاوز قاعدة البيانات بضعة جيجابايتات في `shared_buffers`.","**SSD NVMe** — النسخ WAL حسّاس لزمن انتظار الكتابة؛ القرص الدوّار يُدهور تأخّر النسخ.","**شبكة خاصة بين العُقد الثلاث** — يجب ألا يمر تواصل etcd وPatroni مع PostgreSQL عبر الإنترنت.","**IPv4 مخصَّصة** — للوصول الخارجي للعملاء ولـ `pg_hba.conf` الخاص بالنسخ المتماثلة.","**NTP مُزامَن (chrony) — انجراف \u003C 1 ثانية** — يرفض etcd النصابَ إن انجرفت ساعة عُقدة أكثر من ثانية. هذا الفخ الأكثر شيوعًا على خوادم VPS.",{"type":60,"title":61,"steps":62},"steps","التثبيت: من الصفر إلى كلستر يعمل",[63,66,69,72,75,78,81,84],{"title":64,"body":65},"مزامنة الساعة على العُقد الثلاث","على كل عُقدة، ثبّت `chrony` وفعّله قبل أي خطوة أخرى:\n\n```bash\napt install -y chrony\nsystemctl enable --now chronyd\nchronyc tracking\n```\n\nتأكّد أن `System time offset` أقل من 0.1 ثانية. أي انجراف يتجاوز ثانية يتسبّب في انتهاء مهلة etcd وحلقات انتخاب لا تنتهي.",{"title":67,"body":68},"تثبيت etcd 3.6 على العُقد الثلاث","عرّف متغيرات البيئة الخاصة بكل عُقدة (استبدل `NODE1_IP` و`NODE2_IP` و`NODE3_IP` بعناوين IP الخاصة):\n\n```bash\nETCD_VER=v3.6.6\ncurl -L https:\u002F\u002Fgithub.com\u002Fetcd-io\u002Fetcd\u002Freleases\u002Fdownload\u002F${ETCD_VER}\u002Fetcd-${ETCD_VER}-linux-amd64.tar.gz \\\n  | tar xz -C \u002Fusr\u002Flocal\u002Fbin --strip-components=1 etcd-${ETCD_VER}-linux-amd64\u002Fetcd \\\n                                                   etcd-${ETCD_VER}-linux-amd64\u002Fetcdctl\n```\n\nأنشئ `\u002Fetc\u002Fetcd\u002Fetcd.conf.yml` على كل عُقدة (مثال لـ `pg-node1`):\n\n```bash\nname: pg-node1\ndata-dir: \u002Fvar\u002Flib\u002Fetcd\nlisten-peer-urls: http:\u002F\u002FNODE1_IP:2380\nlisten-client-urls: http:\u002F\u002FNODE1_IP:2379,http:\u002F\u002F127.0.0.1:2379\ninitial-advertise-peer-urls: http:\u002F\u002FNODE1_IP:2380\nadvertise-client-urls: http:\u002F\u002FNODE1_IP:2379\ninitial-cluster: pg-node1=http:\u002F\u002FNODE1_IP:2380,pg-node2=http:\u002F\u002FNODE2_IP:2380,pg-node3=http:\u002F\u002FNODE3_IP:2380\ninitial-cluster-token: pg-cluster-token\ninitial-cluster-state: new\n```\n\nأنشئ وحدة systemd، فعّل etcd وشغّله على العُقد الثلاث قبل المتابعة.",{"title":70,"body":71},"التحقق من نصاب etcd","من أي عُقدة:\n\n```bash\netcdctl --endpoints=http:\u002F\u002FNODE1_IP:2379,http:\u002F\u002FNODE2_IP:2379,http:\u002F\u002FNODE3_IP:2379 \\\n  endpoint status --write-out=table\n```\n\nانتظر ظهور ثلاثة صفوف — أحدها يُظهر `IS LEADER` بقيمة true والآخران false — وأن يكون `ERRORS` فارغًا. إن غابت عُقدة، تحقّق من جدار الحماية على المنفذين 2379 و2380.",{"title":73,"body":74},"تثبيت PostgreSQL وPatroni","على العُقد الثلاث:\n\n```bash\n# PostgreSQL من مستودع PGDG الرسمي\napt install -y curl ca-certificates\ncurl -fsSL https:\u002F\u002Fwww.postgresql.org\u002Fmedia\u002Fkeys\u002FACCC4CF8.asc | gpg --dearmor -o \u002Fetc\u002Fapt\u002Ftrusted.gpg.d\u002Fpostgresql.gpg\necho \"deb https:\u002F\u002Fapt.postgresql.org\u002Fpub\u002Frepos\u002Fapt bookworm-pgdg main\" > \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fpgdg.list\napt update && apt install -y postgresql-17\n\n# Patroni ومُشغّل etcd\npip3 install patroni[etcd3] psycopg2-binary\n```\n\nأوقف PostgreSQL — يتولّى Patroni تهيئة الكلستر:\n\n```bash\nsystemctl stop postgresql\nsystemctl disable postgresql\n```",{"title":76,"body":77},"إعداد Patroni على كل عُقدة","أنشئ `\u002Fetc\u002Fpatroni\u002Fpatroni.yml` (مثال لـ `pg-node1`):\n\n```yaml\nscope: pg-cluster\nnamespace: \u002Fservice\u002F\nname: pg-node1\n\nrestapi:\n  listen: NODE1_IP:8008\n  connect_address: NODE1_IP:8008\n\netcd3:\n  hosts: NODE1_IP:2379,NODE2_IP:2379,NODE3_IP:2379\n\nbootstrap:\n  dcs:\n    ttl: 30\n    loop_wait: 10\n    retry_timeout: 10\n    maximum_lag_on_failover: 1048576\n    synchronous_mode: true\n    synchronous_node_count: 1\n    postgresql:\n      use_pg_rewind: true\n      use_slots: true\n      parameters:\n        wal_level: replica\n        hot_standby: \"on\"\n        wal_keep_size: 128MB\n        max_wal_senders: 10\n        max_replication_slots: 10\n\n  initdb:\n    - encoding: UTF8\n    - data-checksums\n\n  pg_hba:\n    - host replication replicator 0.0.0.0\u002F0 scram-sha-256\n    - host all all 0.0.0.0\u002F0 scram-sha-256\n\npostgresql:\n  listen: NODE1_IP:5432\n  connect_address: NODE1_IP:5432\n  data_dir: \u002Fvar\u002Flib\u002Fpostgresql\u002F17\u002Fmain\n  bin_dir: \u002Fusr\u002Flib\u002Fpostgresql\u002F17\u002Fbin\n  authentication:\n    replication:\n      username: replicator\n      password: 'كلمة_مرور_النسخ'\n    superuser:\n      username: postgres\n      password: 'كلمة_مرور_postgres'\n```\n\nعدّل `NODE1_IP` لكل عُقدة.",{"title":79,"body":80},"تشغيل Patroni وتهيئة الكلستر","أنشئ وحدة systemd في `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fpatroni.service`:\n\n```ini\n[Unit]\nDescription=Patroni PostgreSQL HA\nAfter=network.target etcd.service\nRequires=etcd.service\n\n[Service]\nType=simple\nUser=postgres\nExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fpatroni \u002Fetc\u002Fpatroni\u002Fpatroni.yml\nRestart=on-failure\nRestartSec=5s\n\n[Install]\nWantedBy=multi-user.target\n```\n\nشغّل أوّلًا على `pg-node1` (ستقوم هذه العُقدة بـ `initdb` وستصبح القائد)، ثم على العُقدتين الأخريين بفاصل بضع ثوانٍ:\n\n```bash\nsystemctl daemon-reload\nsystemctl enable --now patroni\n```\n\nتابع التهيئة:\n\n```bash\npatronictl -c \u002Fetc\u002Fpatroni\u002Fpatroni.yml list\n```",{"title":82,"body":83},"التحقق من الحالة الأولية للكلستر","المخرجات المتوقعة بعد اكتمال التهيئة:\n\n```bash\n+ Cluster: pg-cluster (7234567890123456789) +---------+----+-----------+\n| Member    | Host             | Role         | State   | TL | Lag in MB |\n+-----------+------------------+--------------+---------+----+-----------+\n| pg-node1  | NODE1_IP:5432    | Leader       | running |  1 |           |\n| pg-node2  | NODE2_IP:5432    | Sync Standby | running |  1 | 0         |\n| pg-node3  | NODE3_IP:5432    | Replica      | running |  1 | 0         |\n+-----------+------------------+--------------+---------+----+-----------+\n```\n\nتظهر `pg-node2` بوصفها `Sync Standby`: كل معاملة مؤكَّدة على القائد مضمونة على هذه العُقدة قبل إرجاع `COMMIT` للعميل.",{"title":85,"body":86},"إعداد pg_hba.conf عبر Patroni","لا تُعدّل `pg_hba.conf` مباشرةً. استخدم `patronictl edit-config` لإضافة قواعد الوصول في قسم `pg_hba` — يُوزّع Patroni الإعداد على جميع العُقد ويُعيد تحميل PostgreSQL تلقائيًا:\n\n```bash\npatronictl -c \u002Fetc\u002Fpatroni\u002Fpatroni.yml edit-config\n```\n\nأضف قواعدك في كتلة YAML الخاصة بـ `pg_hba`. على VPS، `host all all 0.0.0.0\u002F0 scram-sha-256` هي نقطة البداية التي يمكن تضييقها وفق شبكتك الخاصة.",{"type":32,"title":88,"body":89},"التحوّل التلقائي والتحوّل المُخطَّط: عرض تطبيقي","**تحوّل مُحاكى — إيقاف مفاجئ للقائد.**\n\nقبل الإيقاف، سجّل حالة الكلستر:\n\n```bash\npatronictl -c \u002Fetc\u002Fpatroni\u002Fpatroni.yml list\n# → pg-node1 هو Leader، pg-node2 هو Sync Standby\n```\n\nأوقف Patroni على القائد:\n\n```bash\nsystemctl stop patroni   # على pg-node1\n```\n\nتابع الترقية على أحد العُقد الاحتياطية:\n\n```bash\npatronictl -c \u002Fetc\u002Fpatroni\u002Fpatroni.yml list\n# → (بعد 10 إلى 30 ثانية)\n# pg-node2 : Leader  | running | TL 2\n# pg-node3 : Replica | running | TL 2 | 0 MB\n# pg-node1 : stopped\n```\n\nينتظر Patroni انتهاء اتفاقية إيجار etcd (TTL = 30 ث)، ثم تحصل `pg-node2` (النسخة المتزامنة) على الاتفاقية وتُرقّي نفسها. التأخّر الفعلي بين 10 و30 ثانية تبعًا لقيمة `loop_wait`.\n\n**تحوّل مُخطَّط — تبديل بدون انقطاع.**\n\nللصيانة المجدوَلة، فضّل `switchover` الذي ينتظر حتى تلحق العُقدة المستهدفة بالقائد قبل التبديل:\n\n```bash\npatronictl -c \u002Fetc\u002Fpatroni\u002Fpatroni.yml switchover pg-cluster \\\n  --master pg-node1 --candidate pg-node2\n```\n\nينتظر Patroni حتى يصبح التأخّر صفرًا، يُشير إلى `pg-node2` بالترقية، ثم تُعيد `pg-node1` الاتصال كنسخة متماثلة. المدة الفعلية: أقل من 5 ثوانٍ في الظروف الطبيعية.\n\n**REST API للحالة.**\n\nبدون عميل PostgreSQL، استعلم الحالة من موزّع الأحمال أو سكريبت المراقبة:\n\n```bash\ncurl -s http:\u002F\u002FNODE1_IP:8008\u002Fleader    # 200 = هذه هي العُقدة القائدة\ncurl -s http:\u002F\u002FNODE2_IP:8008\u002Freplica   # 200 = نسخة متماثلة سليمة\ncurl -s http:\u002F\u002FNODE1_IP:8008\u002Fhealth    # JSON: state, role, lag\n```\n\nيمكن لـ HAProxy توجيه فحوصات الصحة نحو `\u002Fleader` و`\u002Freplica` لتوجيه الكتابة والقراءة على العُقد الصحيحة. راجع دليل \u003Ca href=\"\u002Fblog\u002Fdeployer-avec-haproxy-vps\">HAProxy على VPS\u003C\u002Fa> للتوصيل الكامل.",{"type":32,"title":91,"body":92},"العمليات اليومية","**النسخ الاحتياطي مع pgBackRest 2.59.**\n\nثبّت pgBackRest على العُقد الثلاث وحدّد مستودعًا مشتركًا (تخزين كائنات S3، أو NFS، أو مجلد محلي مخصَّص). يسحب الإعداد الموصى به النسخ الاحتياطية من النسخة المتماثلة لتفادي تحميل القائد:\n\n```bash\npgbackrest --stanza=pg-cluster --type=full backup\n```\n\nفعّل الضغط والنسخ الاحتياطي التدريجي اليومي في `pgbackrest.conf` (`repo1-retention-full=7`). راجع دليل \u003Ca href=\"\u002Fblog\u002Fsauvegardes-restic-vps\">النسخ الاحتياطي على VPS\u003C\u002Fa> للاستراتيجيات التكميلية.\n\n**مراقبة الكلستر.**\n\n`patronictl list` يُظهر التأخّر بالميجابايت لكل نسخة متماثلة. أنشئ تنبيهًا عند تجاوز التأخّر عتبة محدّدة (مثلًا 50 ميجابايت): يشير ذلك إلى نسخة بطيئة أو مشكلة شبكة. تُعيد نقطة النهاية `GET \u002Fpatroni` بيانات JSON كاملة تشمل `xlog_location` و`replication_state`.\n\n**التوسّع العمودي.**\n\nلزيادة موارد عُقدة: أوقف Patroni عليها (تتحوّل إلى نسخة منفصلة)، أعد تحجيم الـ VPS، وأعد التشغيل. تعيد Patroni الاتصال وتلحق بالتأخّر تلقائيًا عبر `pg_rewind` أو `pg_basebackup` حسب حجم الفجوة.\n\n**مقايضة `synchronous_commit`.**\n\nمع `synchronous_mode: true`، ينتظر كل `COMMIT` تأكيد العُقدة المتزامنة. على شبكة خاصة محلية، يتراوح التأخّر المُضاف بين 0.2 و1 ميلي ثانية. على شبكة أوسع (عُقد في مراكز بيانات مختلفة)، قد يؤثّر هذا التأخّر في التطبيقات كثيفة الكتابة. في هذه الحالة، انتقل إلى `synchronous_mode: false` مع النسخ غير المتزامن: ستفقد ضمان عدم فقدان البيانات عند تعطّل القائد، لكن الكتابة ستبقى سريعة. هذه مقايضة يجب توثيقها صراحةً في إعداداتك.",{"type":94,"title":95,"body":96},"tip","التصليب: TLS متبادل بين العُقد","بشكل افتراضي، يسير تواصل etcd واتصالات النسخ لـ PostgreSQL بدون تشفير عبر الشبكة الخاصة. على شبكة مشتركة أو بيئة متعددة المستأجرين، فعّل TLS المتبادل.\n\nلـ etcd، أنشئ CA وشهادات لكل عُقدة، ثم أضف في `etcd.conf.yml`:\n\n```yaml\nclient-transport-security:\n  cert-file: \u002Fetc\u002Fetcd\u002Ftls\u002Fserver.crt\n  key-file: \u002Fetc\u002Fetcd\u002Ftls\u002Fserver.key\n  trusted-ca-file: \u002Fetc\u002Fetcd\u002Ftls\u002Fca.crt\n  client-cert-auth: true\npeer-transport-security:\n  cert-file: \u002Fetc\u002Fetcd\u002Ftls\u002Fpeer.crt\n  key-file: \u002Fetc\u002Fetcd\u002Ftls\u002Fpeer.key\n  trusted-ca-file: \u002Fetc\u002Fetcd\u002Ftls\u002Fca.crt\n  peer-client-cert-auth: true\n```\n\nلنسخ PostgreSQL، استخدم `sslmode=verify-full` في معاملات اتصال `primary_conninfo` الخاصة بـ Patroni. تتحقق كل نسخة متماثلة بذلك من شهادة القائد.",{"type":32,"title":98,"body":99},"استكشاف الأخطاء: أكثر خمسة أخطاء شيوعًا","**1. فقدان نصاب etcd — الكلستر يرفض انتخاب قائد.**\n\nالعَرَض: يُظهر `patronictl list` جميع العُقد بحالة `running` لكن بلا `Leader`. السبب: عُقدة etcd غير قابلة للوصول والنصاب (2 من 3) لم يعد مكتملًا. تحقق بـ `etcdctl endpoint status` — ستظهر العُقدة المعطوبة بدون استجابة أو بخطأ اتصال. أصلح العُقدة أو أزلها مؤقتًا من الكلستر (`etcdctl member remove`).\n\n**2. انجراف NTP — حلقة انتخابات.**\n\nالعَرَض: يتغير القائد كل 30 ثانية، وتُظهر سجلات Patroni `failed to update leader key`. السبب: ساعة إحدى العُقد تنجرف بأكثر من ثانية. تحقق بـ `chronyc tracking` على كل عُقدة وأصلح قبل إعادة تشغيل Patroni.\n\n**3. احتمال تشقّق الدماغ — `pg_rewind` يرفض التطبيق.**\n\nالعَرَض: قائد سابق يُعاد تشغيله وPatroni يرفض إعادة دمجه كنسخة متماثلة مع الخطأ `could not connect to the target server: pg_rewind target server must be in standby mode`. استمر الخادم في الكتابة بعد فقدان الاتفاقية. الحل: `pg_rewind --target-pgdata=\u002Fvar\u002Flib\u002Fpostgresql\u002F17\u002Fmain --source-server='host=NEW_LEADER_IP ...'`، ثم أعد تشغيل Patroni.\n\n**4. رفض اتصال النظير — إدخال مفقود في `pg_hba.conf`.**\n\nالعَرَض: تُهيَّأ النسخ لكنها تفشل مع `FATAL: no pg_hba.conf entry for replication connection`. القاعدة `host replication replicator 0.0.0.0\u002F0 scram-sha-256` غائبة من قسم `pg_hba` في `patroni.yml`. أضفها عبر `patronictl edit-config` — ليس مباشرةً في `pg_hba.conf`.\n\n**5. تأخّر متواصل بعد التحوّل — `max_wal_senders` غير كافٍ.**\n\nالعَرَض: تُظهر النسخة تأخّرًا لا يتناقص بعد الترقية. السبب الشائع: `max_wal_senders` منخفض للغاية (القيمة الافتراضية 10 في بعض الإصدارات) وفتحة النسخ مكتظة. ارفعه إلى 20 عبر `patronictl edit-config` (المعامل `max_wal_senders`) وأعد التحميل.",{"type":32,"title":101,"body":102},"كلستر يُدار ولا يُرتجَل","يغطي Patroni 4.1 مع etcd 3.6 معظم ما تقدّمه الخدمة المُدارة على صعيد التوافر: انتخاب تلقائي، نسخ متزامن، API للإدارة. الفرق هو التحكّم: صلاحية root، إضافات حرّة، تكلفة ثابتة، والقدرة على تشخيص العُقدة المتعثّرة بدلًا من انتظار دعم طرف ثالث.\n\nالمتطلب التشغيلي ليس تعقيد Patroni — الإجراء أعلاه يُظهر أنه قابل للإدارة. إنه الانضباط على ثلاثة محاور: NTP مُزامَن، نسخ احتياطية تُتحقَّق منها بانتظام، وكتيّب تشغيل للتحوّل يُختبَر قبل وقوع العطل.\n\nللبدء، يحتاج كلستر Patroni بثلاث عُقد إلى ثلاثة خوادم VPS بصلاحية root وIPv4 مخصَّصة وشبكة خاصة. راجع دليل التثبيت الأساسي \u003Ca href=\"\u002Fblog\u002Fheberger-postgresql-vps\">PostgreSQL على VPS\u003C\u002Fa> والمقارنة \u003Ca href=\"\u002Fblog\u002Fpostgresql-self-hosted-vs-rds\">الاستضافة الذاتية مقابل Amazon RDS\u003C\u002Fa> لاختيار النهج المناسب لحِملك.","ثلاثة خوادم VPS لكلستر Patroni","يحتاج كلستر PostgreSQL Patroni بثلاث عُقد إلى ثلاثة خوادم VPS بصلاحية root وIPv4 مخصَّصة وشبكة خاصة. جميع قوالب VPS من ServOrbit توفّر صلاحية root كاملة وشبكة خاصة بين المثيلات.","‏VPS Cloud ServOrbit‏","\u002Fvps-cloud",[108,125,140],{"id":109,"slug":110,"slugs":111,"title":114,"excerpt":115,"readTime":116,"views":15,"isPinned":16,"publishedAt":117,"category":118,"categories":119,"featuredImage":26,"bgImage":27,"posterImage":121,"relatedSolution":122},56,"postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها",{"fr":112,"en":113,"ar":110},"heberger-postgresql-vps","postgresql-on-a-vps-a-reliable-and-controlled-database","PostgreSQL على خادم VPS: قاعدة بيانات موثوقة ومُتحكَّم بها","استضف PostgreSQL على خادم VPS: وحدات التخزين والنسخ الاحتياطية والوصول الشبكي المحدود والإعداد السليم لتطبيقاتك.",4,"2026-04-25T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[120],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":123,"appSlug":124},"قواعد-البيانات","postgresql-stack",{"id":126,"slug":127,"slugs":128,"title":131,"excerpt":132,"readTime":133,"views":134,"isPinned":16,"publishedAt":135,"category":136,"categories":137,"featuredImage":26,"bgImage":27,"posterImage":139,"relatedSolution":26},239,"postgresql-sur-vps-vs-amazon-rds-مقارنة-التكلفة-2026",{"fr":129,"en":130,"ar":127},"postgresql-self-hosted-vs-rds","self-hosted-postgresql-vs-amazon-rds-roi-comparison","PostgreSQL sur VPS vs Amazon RDS : مقارنة التكلفة 2026","‫التكلفة الحقيقية لـ PostgreSQL على VPS مقابل Amazon RDS في 2026: أرقام، إعداد، استكشاف أخطاء ودليل هجرة.",9,2,"2026-08-09T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[138],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fpostgresql-self-hosted-vs-rds-poster.svg",{"id":141,"slug":142,"slugs":143,"title":146,"excerpt":147,"readTime":116,"views":15,"isPinned":16,"publishedAt":148,"category":149,"categories":150,"featuredImage":26,"bgImage":27,"posterImage":152,"relatedSolution":26},225,"postgresql-ونهاية-الدعم-تخطيط-الترقية-الكبرى",{"fr":144,"en":145,"ar":142},"postgresql-fin-de-vie-planifier-montee-version","postgresql-end-of-life-plan-your-major-upgrade","‏PostgreSQL ونهاية الدعم: تخطيط الترقية الكبرى","‏يدعم PostgreSQL كل إصدار رئيسي خمس سنوات، وينتهي الدعم في نوفمبر. اعرف إصدارك وخطّط للترقية دون فقدان البيانات.","2026-08-05T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":23},[151],{"id":19,"name":20,"slug":21,"color":22,"icon":23},"\u002Fblog\u002Fcovers\u002Fpostgresql-fin-de-vie-planifier-montee-version-poster.svg",1787580949222]