ویرگول
ورودثبت نام
حمزه قائم پناه
حمزه قائم پناهمهندس نرم‌افزار و عاشق توسعه فردی - تکنیکال لید - اکس هم بنیان‌گذار و مدیرفنی و پرداکت استارتاپ کشمون
حمزه قائم پناه
حمزه قائم پناه
خواندن ۳ دقیقه·۱ سال پیش

PostgreSQL High Availability

هدف از دسترس‌پذیری بالا (HA)

دسترس‌پذیری بالا تضمین می‌کنه که سیستم پایگاه داده حتی در زمان خرابی‌ها، عملیاتی باقی می‌مونه و زمان پایین بودن و از دست دادن داده‌ها رو کاهش میده.

PostgreSQL High Availability
PostgreSQL High Availability

کلمات کلیدی برای PostgreSQL HA

  1. مفهوم Replication: یعنی یک نسخه اضافه از داده‌ها رو روی یک نود دیگه نگهداریم. به دو روش اصلی می‌تونیم این کار رو انجام بدیم:
    تکثیر هم‌زمان Synchronous Replication: اطمینان می‌ده که داده‌ها قبل از تایید تراکنش (commit) توی سرور اصلی و سرورهای ثانویه نوشته شده. این روش اطمینان خوبی ارائه می‌ده اما ممکنه باعث ایجاد تاخیر (lag) شود.
    تکثیر غیرهم‌زمان Asynchronous Replication: داده‌ها رو ابتدا توی سرور اصلی می‌نویسه و بعدش به صورت غیرهم‌زمان به سرورهای ثانویه منتقل می‌کنه. این روش سریعتره اما در صورت به مشکل‌خوردن، احتمال از دست دادن داده‌ها وجود داره.
  2. مفهوم Quorum Commit: حدنصابی که برای تایید نوشته شدن در نودهای ثانویه نیازه تا بگیم موفقیت‌آمیز بوده. این روش بین سرعت و اطمینان تعادل ایجاد می‌کنه. مثلا اگر سه سرور داریم، حدنصاب مناسب می‌تونه ۲ باشه، یعنی اگر ۲ سرور تایید بدن که نوشتن انجام شده، نوشتن رو موفق در نظر می‌گیریم.
  3. مفهوم Failover: به فرایندی می‌گیم که، موقع به مشکل خوردن سرور اصلی، یک سرور آماده جایگزین سرور اصلی بشه که سیستم به مشکل نخوره. این فرایند می‌تواند:
    انتقال دستی Manual Failover: نیاز به مداخله انسانی داره.
    انتقال خودکار Automatic Failover: به طور اتومات توسط ابزارهایی مانند repmgr، Patroni یا pg_auto_failover مدیریت می‌شه.
  4. مفهوم (Load Balancing): درخواست‌های خوندن را بین سرورهای آماده توزیع می‌کند تا عملکرد بهبود پیدا کنه و بار سرور اصلی کاهش بیابه.
  5. مفهوم Connection Pooling: ابزارهایی مانند PgBouncer یا Pgpool-II که کانکشن‌های پایگاه داده رو مدیریت می‌کنن که، به طوری که یکسری کانکشن باز و آماده رو مدیریت می‌کنن تا حجم زیاد درخواست‌ها رو بتونن از طریق اونها مدیریت کنن و مساله کمبود کانکشن رو تا حدی مدیریت کنن.
  6. مفهوم Single Point of Failure: در واقع وقتی سیستم وابسته به یک سرویس در یک نقطه باشه، در صورتی که اون نود یا سرویس با مشکل روبرو بشه و جایگزینی براش نباشه، اون رو یک نقطه شکست می‌گیم که کل سیستم رو می‌تونه دچار مشکل کنه.

پیاده‌سازی PostgreSQL HA روی سه نود

نمای کلی تنظیمات

  • سرور اصلی: سرور اصلی که تمام عملیات نوشتن را مدیریت می‌کند.
  • سرورهای رپلیکا: دو نسخه فقط خواندنی از سرور اصلی.
  • ابزار Docker: برای کانتینری کردن PostgreSQL و اطمینان از قابلیت حمل.
  • ابزار Repmgr: ابزاری محبوب برای مدیریت تکثیر و انتقال وظایف در PostgreSQL.

نحوه عملکرد

  1. نود اصلی: نوشتن‌ها رو قبول می‌کنه و داده‌ها را به نودهای آماده (replica - secondary) منتقل می‌کنه.
  2. نودهای ثانویه: عملیات خوندن می‌تونه از روی اینا انجام بشه.
  3. اگر نود اصلی خراب بشه،repmgr به طور خودکار یکی از نودهای آماده رو به عنوان نود اصلی ارتقا می‌ده.

پیکربندی Docker Compose

این داکر کامپوز رو روی سه سرور بالا میاریم، توجه داشته باشیم که متغیرهای env هر سرور متفاوت هستن و باید فایل .env در کنار فایل داکر کامپوز هر یک از این سه سرور موجود باشه:

version: '2' services: db: container_name: postgres_db image: 192.168.0.33:5000/postgresql-repmgr:17 ports: - 5432:5432 volumes: - db-data:/bitnami/postgresql environment: - POSTGRESQL_POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRESQL_USERNAME=${DB_USER} - POSTGRESQL_PASSWORD=${DB_PASS} - POSTGRESQL_DATABASE=${DB_NAME} - REPMGR_PASSWORD=${REPMGR_PASSWORD} - REPMGR_PRIMARY_HOST=${DB_MASTER_IP} - REPMGR_PARTNER_NODES=${DB_MASTER_IP},${DB_SLAVE1_IP},${DB_SLAVE2_IP} - REPMGR_NODE_NAME=${REPMGR_NODE_NAME} - REPMGR_NODE_NETWORK_NAME=${DB_CURRENT_SERVER_IP} - REPMGR_NODE_ID=${REPMGR_NODE_ID} - REPMGR_FAILOVER=automatic - REPMGR_PROMOTE_COMMAND='repmgr standby promote' - REPMGR_FOLLOW_COMMAND='repmgr standby follow' - POSTGRESQL_EXTRA_FLAGS=--synchronous_standby_names=&quot2 (${DB_SLAVE1_IP}, ${DB_SLAVE2_IP})&quot networks: - net-backend volumes: db-data: networks: net-backend: name: net-backend driver: bridge

نمونه فایل env:

REDIS_MASTER_IP=192.168.0.44 REDIS_CURRENT_SLAVE_IP=192.168.0.45 DB_CURRENT_SERVER_IP=192.168.0.1 DB_MASTER_IP=192.168.0.1 DB_SLAVE1_IP=192.168.0.2 DB_SLAVE2_IP=192.168.0.3 DB_USER=postgres DB_PASS=pass DB_NAME=my_db REPMGR_PASSWORD=repmgrpass POSTGRES_PASSWORD=postgrespass REPMGR_NODE_NAME=node-0 # Change for each node: node-1, node-2 REPMGR_NODE_ID=1 # Change for each node: 2, 3

توضیح پیکربندی

  • بخش Image: تصویر PostgreSQL با repmgr برای مدیریت HA مشخص شده.
  • متغیرهای محیطی: تنظیمات PostgreSQL و repmgr مانند اطلاعات کاربری، نودهای ثانویه و رفتار انتقال وظایف را پیکربندی می‌کنه.
  • بخش Volumes: داده‌های پایگاه داده را در برابر راه‌اندازی مجدد کانتینر پایدار نگه می‌داره.
  • بخش Network: اطمینان از ارتباط تمام نودها در یک شبکه.
  • بخش Synchronous Standby: اطمینان از هم‌زمان بودن دو نود آماده برای حداقل کردن از دست دادن داده.
High Availabilitypostgresqlپستگرس
۰
۰
حمزه قائم پناه
حمزه قائم پناه
مهندس نرم‌افزار و عاشق توسعه فردی - تکنیکال لید - اکس هم بنیان‌گذار و مدیرفنی و پرداکت استارتاپ کشمون
شاید از این پست‌ها خوشتان بیاید