پستگرس
پستگرس یک سیستم پایگاه داده شی- رابطه ای قدرتمند و منبع باز است که از زبان SQL همراه با بسیاری از ویژگی ها استفاده میشه و گسترش مییابد که با خیال راحت پیچیده ترین حجم کاری داده ها را ذخیره و مقیاس می کند. منشاء PostgreSQL به سال 1986 به عنوان بخشی از پروژه POSTGRES در دانشگاه کالیفرنیا Berkeley برمی گردد و بیش از 35 سال توسعه فعال بر روی پلت فرم اصلی دارد.
پستگرس به دلیل معماری اثبات شده، قابلیت اطمینان، یکپارچگی داده ها، مجموعه ویژگی های قوی، توسعه پذیری و تعهد جامعه منبع باز پشت نرم افزار برای ارائه مداوم راه حل های کارآمد و نوآورانه، شهرت زیادی به دست آورده است. PostgreSQL بر روی تمام سیستم عامل های اصلی اجرا می شود، از سال 2001 با ACID سازگار است و دارای افزونه های قدرتمندی مانند توسعه دهنده پایگاه داده جغرافیایی محبوب PostGIS است. جای تعجب نیست که PostgreSQL به پایگاه داده منبع باز رابطه ای منتخب برای بسیاری از افراد و سازمان ها تبدیل شده است.
:Repmgr
یک ابزار محبوب برای مدیریت تکرار و خطای Postgresql است که توسط Ndquadrant2 (اکنون EDB) در سال 2010 معرفی شد.
فرآیند راه اندازی و مدیریت پایگاه های داده با در دسترس بودن بالا (HA) و مقیاس پذیری مورد نیاز را بسیار ساده می کند. این به DBA ها و مدیران سیستم کمک می کند تا با استفاده از قابلیت Hot Standby معرفی شده در Postgresql 9، مجموعه ای از پایگاه های داده Postgresql را مدیریت کنند.
فرآیند مدیریت و مدیریت روزانه را ساده میکند، بهرهوری را افزایش میدهد، قابلیتهای تکرار داخلی را تکمیل میکند و هزینههای کلی یک خوشه Postgresql را کاهش میدهد:
از طریق مخازن بسته EDB و همچنین مخازن جامعه PGDG در دسترس است. شما می توانید از مدیران بسته استاندارد Yum و Apt برای نصب Repmgr با نمونه Postgresql استفاده کنید.
:HAProxy
که مخفف High Availability Proxy است، یک نرم افزار منبع باز محبوب TCP/HTTP Load Balancer و راه حل پروکسی است که می تواند بر روی Linux ، macOS و FreeBSD اجرا شود. رایج ترین کاربرد آن بهبود عملکرد و قابلیت اطمینان یک محیط سرور با توزیع بار کاری در چندین سرور (مانند وب، برنامه کاربردی، پایگاه داده) است. در بسیاری از محیطهای پرمخاطب از جمله: GitHub Imgur، Instagram و Twitter استفاده میشود.
در این قسمت از این پست، من سه سرور postgres را با استفاده از docker compose مستقر بالا میارم. سپس HAProxy را در جلوی آنها قرار می دهم، HAProxy ترافیک اصلی و پراکسی به این سرور را تشخیص می دهد. معماری به این شکل است:
من از ایمیج بیتنامی استفاده خواهم میکنم، آنها همه ابزار مورد نیاز را برای ما جمع کردن.
https://hub.docker.com/r/bitnami/postgresql-repmgr
version: '3.9' networks: web_net: external: true app_net: external: false volumes: pg_0_data: pg_1_data: pg_2_data: x-version-common: &service-common image: docker.io/bitnami/postgresql-repmgr:15 restart: always x-common-env: &common-env REPMGR_PASSWORD: repmgr REPMGR_PARTNER_NODES: pg-0,pg-1,pg-2:5432 REPMGR_PORT_NUMBER: 5432 REPMGR_PRIMARY_HOST: pg-0 REPMGR_PRIMARY_PORT: 5432 POSTGRESQL_POSTGRES_PASSWORD: postgres POSTGRESQL_USERNAME: postgres POSTGRESQL_PASSWORD: postgres POSTGRESQL_DATABASE: postgres POSTGRESQL_SHARED_PRELOAD_LIBRARIES: pgaudit, pg_stat_statements POSTGRESQL_SYNCHRONOUS_COMMIT_MODE: remote_write POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS: 2 services: pg-0: <<: *service-common networks: - app_net volumes: - pg_0_data:/bitnami/postgresql environment: <<: *common-env REPMGR_NODE_NAME: pg-0 REPMGR_NODE_NETWORK_NAME: pg-0 pg-1: <<: *service-common networks: - app_net volumes: - pg_1_data:/bitnami/postgresql environment: <<: *common-env REPMGR_NODE_NAME: pg-1 REPMGR_NODE_NETWORK_NAME: pg-1 pg-2: <<: *service-common networks: - app_net volumes: - pg_2_data:/bitnami/postgresql environment: <<: *common-env REPMGR_NODE_NAME: pg-2 REPMGR_NODE_NETWORK_NAME: pg-2 haproxy: #image: haproxy build: . container_name: haproxy restart: always networks: - app_net - web_net mem_limit: 8192m ports: - '3000:3000' # - '${POSTGRES_PRIV_IP}:5432:5432' privileged: true volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
من برای انتقال کانفیگ haproxy از والیوم استفاده کردم در کنار فایل کامپوز داکر باید فایل به صورت زیر باشه.
محتوای haproxy.cfg
global maxconn 4096 ulimit-n 30000 external-check insecure-fork-wanted log stdout format raw daemon notice resolvers docker nameserver dns1 127.0.0.11:53 hold valid 10s defaults log global mode tcp option tcplog option dontlognull option tcp-check option srvtcpka http-reuse aggressive timeout client 180m timeout server 180m timeout connect 2s1 listen stats bind *:3000 mode http stats enable stats uri / stats refresh 2s listen primary bind *:5432 maxconn 2048 option external-check external-check command /opt/services/postgres/primary-check.sh default-server resolvers docker init-addr none check inter 2s fall 1 rise 2 slowstart 4000 server pg-0 pg-0:5432 maxconn 1024 check inter 1s server pg-1 pg-1:5432 maxconn 1024 check inter 1s server pg-2 pg-2:5432 maxconn 1024 check inter 1s listen standy bind *:5433 maxconn 2048 option external-check balance roundrobin external-check command /opt/services/postgres/standby-check.sh default-server resolvers docker init-addr none check inter 2s fall 1 rise 2 slowstart 4000 server pg-0 pg-0:5432 maxconn 1024 check inter 1s server pg-1 pg-1:5432 maxconn 1024 check inter 1s server pg-2 pg-2:5432 maxconn 1024 check inter 1s
در پیکربندی haproxy.cfg ، من دستورات خارجی برای بررسی سلامت سرویس ها تعریف کردم تا بتوانم تشخیص بدم کدام سرویس مستر است و همچنین آماده به کار است. من از تابع () pg_is_in_recovery استفاده کردم، می توانید آن را در اینجا بررسی کنید.
https://pgpedia.info/p/pg_is_in_recovery.html
البته این دوتا فایل باید با نام های مشخص شده در کنار پروژه ساخته بشه و این کانفیک ها قرار داده بشه.
primary-check.sh به این شکل است.
#!/bin/bash VIP=$1 VPT=$2 RIP=$3 PG_MONITOR_USER=postgres PG_MONITOR_PASS=postgres PG_MONITOR_DB=postgres if [ "$4" == "" ]; then RPT=$VPT else RPT=$4 fi STATUS=$(PGPASSWORD="$PG_MONITOR_PASS" /usr/bin/psql -qtAX -c "select pg_is_in_recovery()" -h "$RIP" -p "$RPT" --dbname="$PG_MONITOR_DB" --username="$PG_MONITOR_USER") #echo "$@ status=$STATUS" if [[ "$STATUS" == "f" ]] then exit 0 else exit 1 fi
standby-check.sh به این شکل است.
#!/bin/bash VIP=$1 VPT=$2 RIP=$3 PG_MONITOR_USER=postgres PG_MONITOR_PASS=postgres PG_MONITOR_DB=postgres if [ "$4" == "" ]; then RPT=$VPT else RPT=$4 fi STATUS=$(PGPASSWORD="$PG_MONITOR_PASS" /usr/bin/psql -qtAX -c "select pg_is_in_recovery()" -h "$RIP" -p "$RPT" --dbname="$PG_MONITOR_DB" --username="$PG_MONITOR_USER") if [[ "$STATUS" == "t" ]] then exit 0 else exit 1 fi
البته برای کپی این کانفیک ها داخل haproxy من داکر فایلی نوشتم این فایلم باید کنار فایل های دیگه باشه.
Dockerfile
# Use an HAProxy base image FROM haproxy:2.8.3 # Switch to root user for package installation USER root # Install PostgreSQL and other necessary packages RUN apt-get update && apt-get install -y postgresql-client # copy bash file to the iamge COPY standby-check.sh /opt/services/postgres/standby-check.sh COPY primary-check.sh /opt/services/postgres/primary-check.sh # Set permissions to 777 for your two files RUN chmod 777 /opt/services/postgres/primary-check.sh && chmod 777 /opt/services/postgres/standby-check.sh
نکته: تمامی این فایل کانفیگ ها باید کنار هم باشه .
نکته: docker compose pull اول ایمج ها دانلود بشه بعد docker network create web_net و بعد docker compose up -d
نکته:احتمالا کانفیگ فایل عا رو از این جا کپی کرده باشید ایندنت ها رعایت نمیشه داخل گیت هاب ام میزارم.
https://github.com/MehdiShavandi/postgres-cluster
امیدوارم تونسته باشم برای کلاستر دیتابیس پستگرس کمکی کرده باشم.