<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mehdi Shavandi</title>
        <link>https://virgool.io/feed/@mhdi_shavandi</link>
        <description>DevOps Engineer</description>
        <language>fa</language>
        <pubDate>2026-06-17 05:02:27</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2986189/avatar/nb6IoG.png?height=120&amp;width=120</url>
            <title>Mehdi Shavandi</title>
            <link>https://virgool.io/@mhdi_shavandi</link>
        </image>

                    <item>
                <title>Mariadb + Galera + Haproxy</title>
                <link>https://virgool.io/@mhdi_shavandi/mariadb-galera-haproxy-hfjz2biiytya</link>
                <description>ماریا دی بی چیست؟ماریا دی بی یک پایگاه داده امن، سریع و رابطه‌ای یا همان RDBMS است که از همان تکنولوژی آشنا و قابل اعتماد  MySQL، استفاده می‌کند. به عبارت ساده‌تر باید بگوییم که ماریا دی بی، انشعاب جدیدی از پایگاه داده MySQL است و همه ویژگی‌های مثبت آن را به‌صورت کامل دارد.البته همان‌طور که احتمالا شما هم حدس می‌زنید، این انشعاب جدید با قابلیت‌ها و ویژگی‌های فوق‌العاده‌ای عرضه شده است که توسعه‌دهندگان و برنامه‌نویسان زیادی را به استفاده از ماریا دی بی، ترغیب می‌کند.پایگاه دادهMariaDB دارای چندین موتور ذخیره‌سازی است، بیش از 200 هزار کانکشن را پشتیبانی می‌کند و کاملا اوپن‌سورس است. سرعت عملکرد این پایگاه داده، 24 درصد بیش از دیتابیس مادر خود یعنیMySQL بوده و این موضوع در تست‌های مختلف، اثبات شده است.نکته بسیار مهمی که باید درباره MariaDB بدانید این است که این دیتابیس به‌عنوان یکی از پایگاه‌های دادهNewSQL دسته‌بندی می‌شود. این پایگاه‌های داده جدید، برخی از مهم‌ترین ویژگی‌های موجود در دیتابیس‌هایNoSQL را با مشخصه‌های پرکاربرد دیتابیس‌های مبتنی بر روابط، ترکیب می‌کنند. به این شکل، دیتابیس نهایی بالاترین عملکرد و بهترین مشخصه‌ها را به‌صورت هم‌زمان دارد.ماریا دی بی، شباهت‌های بسیار زیادی به MySQL دارد و مهم‌ترین ویژگی‌های آن را به ارث برده است. اگر الان با این سوال مواجه هستید که با وجود MySQL، چه نیازی به ماریا دی بی داریم، با ما به بخش بعدی بیایید تا تاریخچه ایجاد دیتابیس MariaDB و دلیل ایجاد آن را به شما هم بگوییم.Galera Clusterیک خوشه پایگاه داده Multi-Master همزمان است که بر اساس تکرار همزمان وMySQL وInnoDB است. هنگامی که  Galera Cluster در حال استفاده است، خواندن و نوشتن پایگاه داده می تواند به هر گره ای هدایت شود. هر گره منفرد را می توان بدون وقفه در عملیات و بدون استفاده از رویه های پیچیده failover از دست داد.در سطح بالایی، Galera Cluster از یک سرور پایگاه داده (به عنوان مثال MySQL یا MariaDB) تشکیل شده است که از پلاگین Galera Replication برای مدیریت تکرار استفاده می کند. برای دقیق تر، API پلاگین تکرار MySQL گسترش یافته است تا تمام اطلاعات و قلاب های مورد نیاز برای تکثیر همزمان Multi-Master واقعی را ارائه دهد. این API توسعه یافته Write-Set Replication API  یا wsrep API نامیده می شود.HAProxyاچ ای پروکسی که مخفف High Availability Proxy است، یک نرم افزار منبع باز محبوب TCP/HTTP Load Balancer و راه حل پروکسی است که می تواند بر روی Linux ، macOS و FreeBSD اجرا شود. رایج ترین کاربرد آن بهبود عملکرد و قابلیت اطمینان یک محیط سرور با توزیع بار کاری در چندین سرور (مانند وب، برنامه کاربردی، پایگاه داده) است. در بسیاری از محیط‌های پرمخاطب از جمله: GitHub، Imgur، Instagram و Twitter استفاده می‌شود.استفاده از فایل Docker Composedocker-compose.ymlversion: &amp;quot3&amp;quot
services:
#mariadb-1
mariadb1:
image: mariadb:10.5
container_name: mariadb1
ports:
- &amp;quot3306:3306&amp;quot
env_file: .env
environment:
- MARIADB_USER=${MARIADB_USER_1}
- MARIADB_PASSWORD=${MARIADB_PASSWORD_1}
- MARIADB_DATABASE=${MARIADB_DATABASE_1}
- MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
volumes:
- ./mariadb1/galera.cnf:/etc/mysql/mariadb.conf.d/galera.cnf
cap_add:
- all
networks:
- app_net
#mariadb-2
mariadb2:
image: mariadb:10.5
container_name: mariadb2
ports:
- &amp;quot3307:3306&amp;quot
env_file: .env
environment:
- MARIADB_USER=${MARIADB_USER_2}
- MARIADB_PASSWORD=${MARIADB_PASSWORD_2}
- MARIADB_DATABASE=${MARIADB_DATABASE_2}
- MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
volumes:
- ./mariadb2/galera.cnf:/etc/mysql/mariadb.conf.d/galera.cnf
cap_add:
- all
networks:
- app_net
#mariadb-2
mariadb3:
image: mariadb:10.5
container_name: mariadb3
ports:
- &amp;quot3308:3306&amp;quot
env_file: .env
volumes:
- ./mariadb3/galera.cnf:/etc/mysql/mariadb.conf.d/galera.cnf
environment:
- MARIADB_USER=${MARIADB_USER_3}
- MARIADB_PASSWORD=${MARIADB_PASSWORD_3}
- MARIADB_DATABASE=${MARIADB_DATABASE_3}
- MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
cap_add:
- all
networks:
- app_net
#proxysql
proxysql:
image: proxysql/proxysql:latest
container_name: proxysql
ports:
- &amp;quot6032:6032&amp;quot
- &amp;quot6070:6070&amp;quot
- &amp;quot6080:6080&amp;quot
cap_add:
- all
networks:
- app_net
haproxy:
image: haproxy:latest
container_name: haproxy
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
ports:
- &amp;quot3000:3000&amp;quot
networks:
- app_net
- web_net
networks:
web_net:
external: true
app_net:.env#mysql root password
MARIADB_ROOT_PASSWORD=Mariadb123123
#mariadb-1
MARIADB_USER_1=mariadb
MARIADB_PASSWORD_1=Mariadb123456
MARIADB_DATABASE_1=mariadb3
#mariadb-2
MARIADB_USER_2=mariadb
MARIADB_PASSWORD_2=Mariadb123456
MARIADB_DATABASE_2=mariadb3
#mariadb-3
MARIADB_USER_3=mariadb
MARIADB_PASSWORD_3=Mariadb123456
MARIADB_DATABASE_3=mariadb3mariadb1/galera.cnf[mysqld] 
bind-address=0.0.0.0 
default_storage_engine=InnoDB 
binlog_format=row 
innodb_autoinc_lock_mode=2
# Galera cluster configuration 
wsrep_on=ON 
wsrep_provider=/usr/lib/galera/libgalera_smm.so 
wsrep_cluster_address=&amp;quotgcomm://&amp;quot 
wsrep_cluster_name=&amp;quotMariaDB Galera Cluster&amp;quot 
wsrep_sst_method=rsync
# Cluster node configuration
 wsrep_node_address=&amp;quotmariadb1&amp;quot 
wsrep_node_name=&amp;quotmariadb1&amp;quotmariadb2/galera.cnf[mysqld] 
bind-address=0.0.0.0 
default_storage_engine=InnoDB 
binlog_format=row 
innodb_autoinc_lock_mode=2
# Galera cluster configuration 
wsrep_on=ON 
wsrep_provider=/usr/lib/galera/libgalera_smm.so 
wsrep_cluster_address=&amp;quotgcomm://mariadb1,mariadb2,mariadb3&amp;quot 
wsrep_cluster_name=&amp;quotMariaDB Galera Cluster&amp;quot 
wsrep_sst_method=rsync  
# Cluster node configuration 
wsrep_node_address=&amp;quotmariadb2&amp;quot 
wsrep_node_name=&amp;quotmariadb2&amp;quotmariadb3/galera.cnf[mysqld] 
bind-address=0.0.0.0 
default_storage_engine=InnoDB 
binlog_format=row 
innodb_autoinc_lock_mode=2  
# Galera cluster configuration 
wsrep_on=ON 
wsrep_provider=/usr/lib/galera/libgalera_smm.so 
wsrep_cluster_address=&amp;quotgcomm://mariadb1,mariadb2,mariadb3&amp;quot 
wsrep_cluster_name=&amp;quotMariaDB Galera Cluster&amp;quot 
wsrep_sst_method=rsync  
# Cluster node configuration 
wsrep_node_address=&amp;quotmariadb3&amp;quot 
wsrep_node_name=&amp;quotmariadb3&amp;quothaproxy.cfgglobal
log 127.0.0.1 local0
maxconn 4096
user haproxy
group haproxy
defaults
log global
mode tcp
option tcplog
timeout connect 10s
timeout client 30s
timeout server 30s
listen stats
bind *:3000
mode http
stats enable
stats uri /
stats refresh 2s
frontend mariadb-galera
bind *:3306
mode tcp
option tcplog
default_backend galera_nodes
backend galera_nodes
option tcpka
balance leastconn
server mariadb1 mariadb1:3306 check
server mariadb2 mariadb2:3306 check
server mariadb3 mariadb3:3306 checkنکته: تمامی این فایل کانفیگ ها باید کنار هم  و در مسیر خودشون باشن .نکته: docker compose pull اول ایمج ها دانلود بشه بعد docker network create web_net و بعد docker compose up -dبعداز بالا اومدن وهلسی شدن کانتینرها mariadb1/galera.cnf باید کانفیگش به صورت زیرmariadb1/galera.cnf[mysqld] 
bind-address=0.0.0.0 
default_storage_engine=InnoDB 
binlog_format=row 
innodb_autoinc_lock_mode=2
# Galera cluster configuration 
wsrep_on=ON 
wsrep_provider=/usr/lib/galera/libgalera_smm.so 
wsrep_cluster_address=&amp;quotgcomm://mariadb1,mariadb2,mariadb3&amp;quot 
wsrep_cluster_name=&amp;quotMariaDB Galera Cluster&amp;quot 
wsrep_sst_method=rsync
# Cluster node configuration 
wsrep_node_address=&amp;quotmariadb1&amp;quot 
wsrep_node_name=&amp;quotmariadb1&amp;quotو مجدد  docker compose up -d زده بشه نکته:احتمالا کانفیگ فایل عا رو از این جا کپی کرده باشید ایندنت ها رعایت نمیشه داخل گیت هاب ام میزارم.https://github.com/MehdiShavandi/mariadb-clusterامیدوارم تونسته باشم برای کلاستر دیتابیس ماریا دی بی کمکی کرده باشم.</description>
                <category>Mehdi Shavandi</category>
                <author>Mehdi Shavandi</author>
                <pubDate>Tue, 19 Dec 2023 11:03:28 +0330</pubDate>
            </item>
                    <item>
                <title>Redis + Sentinel + Haproxy</title>
                <link>https://virgool.io/@mhdi_shavandi/redis-sentinel-haproxy-qu4gowqji5or</link>
                <description>ردیس چیست؟کلمه Redis مخفف عبارت Remote Dictionary Server است. به بیان ساده‌تر پایگاه داده ردیس نوعی ساختمان داده است که اطلاعات را در RAM نگهداری می‌کند. این کار باعث می‌شود که سرعت دسترسی به اطلاعات بسیار بالاتر رود. بالا بودن سرعت بزرگترین مزیت و تفاوت اصلی دیتابیس redis با دیگر پایگاه های داده است. با توجه به اینکه اطلاعات در ردیس داخل RAM‌ نگهداری می‌شود، آن را In-Memory Database  می‌نامند.از محل ذخیره‌سازی اطلاعات در ردیس مشخص است که این پایگاه داده یک محل ذخیره‌سازی موقت است. این پایگاه داده مناسب برای اطلاعاتی است که بسیار پرکاربرد هستند و لازم است تا مدام از سرور فراخوانده شوند. در این حالت اطلاعات به طور موقت روی RAM ذخیره شده و به سرعت به کاربر منتقل می‌شود. این روش هم رضایت کاربر را بهتر حاصل می‌کند و هم مدیر سایت به منابع کمتری برای سرویس‌دهی احتیاج خواهد داشت.Redis Sentinelسیستمی است که برای کمک به مدیریت نمونه هایRedis طراحی شده است. چهار وظیفه زیر را انجام می دهد:1- نظارت : Sentinel  دائماً بررسی می‌کند که آیا نمونه‌های master و slave شما مطابق انتظار کار می‌کنند.2- اعلان : Sentinel  می‌تواند از طریق یک API به مدیر سیستم یا برنامه رایانه‌ای دیگر اطلاع دهد که مشکلی در یکی از نمونه‌های Redis،  نظارت شده وجود دارد.3- خرابی خودکار : اگر یک Master طبق انتظار کار نمی کند، Sentinel  می تواند یک فرآیند Failover را شروع کند که در آن یک Slave به Master ارتقا می یابد، سایر Slave های اضافی برای استفاده از Master جدید مجددا پیکربندی می شوند و برنامه های کاربردی با استفاده از سرور Redis در مورد آدرس جدید برای استفاده در هنگام استفاده از آن مطلع می شوند.4- ارائه دهنده پیکربندی : Sentinel به عنوان منبع قدرت برای کشف خدمات مشتری عمل می کند: مشتریان به Sentinels متصل می شوند تا آدرس Master فعلی Redisرا که مسئول یک سرویس معین است بپرسند. اگر یک شکست رخ دهد، Sentinelsآدرس جدید را گزارش می‌کند.HAProxyاچ ای پروکسی که مخفف High Availability Proxy است، یک نرم افزار منبع باز محبوبTCP/HTTP Load Balancer و راه حل پروکسی است که می تواند بر روی Linux ،  macOS و FreeBSD اجرا شود. رایج ترین کاربرد آن بهبود عملکرد و قابلیت اطمینان یک محیط سرور با توزیع بار کاری در چندین سرور (مانند وب، برنامه کاربردی، پایگاه داده) است. در بسیاری از محیط‌های پرمخاطب از جمله: GitHub، Imgur،  Instagram و Twitter استفاده می‌شود.استفاده از فایل Docker Composeکامپوز فایل زیر شامل 3 سرویس ردیس که 1 سرویس Master و 2 سرویس Slaveمیباشد.3 سرویس Sentinel وجود دارد و 1 سرویس HAProxydocker-compose.yamlversion: &#039;2&#039;
networks:
web_net:
external: true
app_net:
external: false
services:
redis:
image: &#039;bitnami/redis:latest&#039;
environment:
- REDIS_REPLICATION_MODE=master
- REDIS_PASSWORD=str0ng_passw0rd
networks:
- app_net
redis-slave-1:
image: &#039;bitnami/redis:latest&#039;
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis
- REDIS_MASTER_PASSWORD=str0ng_passw0rd
- REDIS_PASSWORD=str0ng_passw0rd
depends_on:
- redis
networks:
- app_net
redis-slave-2:
image: &#039;bitnami/redis:latest&#039;
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis
- REDIS_MASTER_PASSWORD=str0ng_passw0rd
- REDIS_PASSWORD=str0ng_passw0rd
depends_on:
- redis
- redis-slave-1
networks:
- app_net
redis-sentinel-1:
image: &#039;bitnami/redis-sentinel:latest&#039;
environment:
- REDIS_MASTER_PASSWORD=str0ng_passw0rd
depends_on:
- redis
- redis-slave-1
- redis-slave-2
networks:
- app_net
redis-sentinel-2:
image: &#039;bitnami/redis-sentinel:latest&#039;
environment:
- REDIS_MASTER_PASSWORD=str0ng_passw0rd
depends_on:
- redis
- redis-slave-1
- redis-slave-2
networks:
- app_net
redis-sentinel-3:
image: &#039;bitnami/redis-sentinel:latest&#039;
environment:
- REDIS_MASTER_PASSWORD=str0ng_passw0rd
depends_on:
- redis
- redis-slave-1
- redis-slave-2
networks:
- app_net
haproxy:
image: haproxy:latest
container_name: haproxy
restart: always
ports:
- &#039;3000:3000&#039;
#- &#039;${REDIS_PRIV_IP}:6379:6379&#039;
depends_on:
- redis
- redis-slave-1
- redis-slave-2
- redis-sentinel-1
- redis-sentinel-2
- redis-sentinel-3
networks:
- web_net
- app_net
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfghaproxy.cfgglobal
daemon
maxconn 256
defaults
mode tcp
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http
bind :3000
default_backend stats
backend stats
mode http
stats enable
stats enable
stats uri /
stats refresh 1s
stats show-legends
stats admin if TRUE
frontend redis-read
bind *:6380
default_backend redis-online
frontend redis-write
bind *:6379
default_backend redis-primary
backend redis-online
balance roundrobin
server redis redis:6379  maxconn 1024 check inter 3s
server redis-slave-1 redis-slave-1:6379 maxconn 1024 check inter 3s
server redis-slave-2 redis-slave-2:6379 maxconn 1024 check inter 3s
backend redis-primary
mode tcp
option tcp-check
tcp-check send AUTH\ str0ng_passw0rd\r\n
tcp-check expect string +OK
tcp-check send PING\r\n
tcp-check expect string +PONG
tcp-check send info\ replication\r\n
tcp-check expect string role:master
tcp-check send QUIT\r\n
tcp-check expect string +OK
server redis redis:6379  maxconn 1024 check inter 3s
server redis-slave-1 redis-slave-1:6379 maxconn 1024 check inter 3s
server redis-slave-2 redis-slave-2:6379 maxconn 1024 check inter 3s
نکته: تمامی این فایل کانفیگ ها باید کنار هم باشه .نکته: docker compose pull اول ایمج ها دانلود بشه بعد docker network create web_net و بعد docker compose up -dنکته:احتمالا کانفیگ فایل عا رو از این جا کپی کرده باشید ایندنت ها رعایت نمیشه داخل گیت هاب ام میزارم.https://github.com/MehdiShavandi/redis-clusterامیدوارم تونسته باشم برای کلاستر دیتابیس ردیس کمکی کرده باشم.</description>
                <category>Mehdi Shavandi</category>
                <author>Mehdi Shavandi</author>
                <pubDate>Tue, 19 Dec 2023 09:45:53 +0330</pubDate>
            </item>
                    <item>
                <title>Postgresql + Repmgr + Haproxy</title>
                <link>https://virgool.io/@mhdi_shavandi/postgresql-repmgr-haproxy-iwbbgvkriuog</link>
                <description>پستگرسپستگرس یک سیستم پایگاه داده شی- رابطه ای قدرتمند و منبع باز است که از زبان SQL همراه با بسیاری از ویژگی ها استفاده میشه و گسترش مییابد که با خیال راحت پیچیده ترین حجم کاری داده ها را ذخیره و مقیاس می کند. منشاء PostgreSQL به سال 1986 به عنوان بخشی از پروژه POSTGRES در دانشگاه کالیفرنیا Berkeley برمی گردد و بیش از 35 سال توسعه فعال بر روی پلت فرم اصلی دارد.پستگرس به دلیل معماری اثبات شده، قابلیت اطمینان، یکپارچگی داده ها، مجموعه ویژگی های قوی، توسعه پذیری و تعهد جامعه منبع باز پشت نرم افزار برای ارائه مداوم راه حل های کارآمد و نوآورانه، شهرت زیادی به دست آورده است. PostgreSQL بر روی تمام سیستم عامل های اصلی اجرا می شود، از سال 2001 با ACID سازگار است و دارای افزونه های قدرتمندی مانند توسعه دهنده پایگاه داده جغرافیایی محبوب PostGIS است. جای تعجب نیست که PostgreSQL به پایگاه داده منبع باز رابطه ای منتخب برای بسیاری از افراد و سازمان ها تبدیل شده است.:Repmgrیک ابزار محبوب برای مدیریت تکرار و خطای Postgresql است که توسط Ndquadrant2 (اکنون EDB) در سال 2010 معرفی شد.فرآیند راه اندازی و مدیریت پایگاه های داده با در دسترس بودن بالا (HA) و مقیاس پذیری مورد نیاز را بسیار ساده می کند. این به DBA ها و مدیران سیستم کمک می کند تا با استفاده از قابلیت Hot Standby معرفی شده در Postgresql 9، مجموعه ای از پایگاه های داده Postgresql را مدیریت کنند.فرآیند مدیریت و مدیریت روزانه را ساده می‌کند، بهره‌وری را افزایش می‌دهد، قابلیت‌های تکرار داخلی را تکمیل می‌کند و هزینه‌های کلی یک خوشه Postgresql را کاهش می‌دهد: نظارت بر فرآیند تکرارارائه پشتیبانی از عملیات HA مانند تعویض و خرابی.از طریق مخازن بسته 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: &#039;3.9&#039;
networks:
web_net:
external: true
app_net:
external: false
volumes:
pg_0_data:
pg_1_data:
pg_2_data:
x-version-common:
&amp;service-common
image: docker.io/bitnami/postgresql-repmgr:15
restart: always
x-common-env:
&amp;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:
&lt;&lt;: *service-common
networks:
- app_net
volumes:
- pg_0_data:/bitnami/postgresql
environment:
&lt;&lt;: *common-env
REPMGR_NODE_NAME: pg-0
REPMGR_NODE_NETWORK_NAME: pg-0
pg-1:
&lt;&lt;: *service-common
networks:
- app_net
volumes:
- pg_1_data:/bitnami/postgresql
environment:
&lt;&lt;: *common-env
REPMGR_NODE_NAME: pg-1
REPMGR_NODE_NETWORK_NAME: pg-1
pg-2:
&lt;&lt;: *service-common
networks:
- app_net
volumes:
- pg_2_data:/bitnami/postgresql
environment:
&lt;&lt;: *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:
 - &#039;3000:3000&#039;
# - &#039;${POSTGRES_PRIV_IP}:5432:5432&#039;
privileged: true
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfgمن برای انتقال کانفیگ haproxy از والیوم استفاده کردم در کنار فایل کامپوز داکر باید فایل به صورت زیر باشه.محتوای haproxy.cfgglobal
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 [ &amp;quot$4&amp;quot == &amp;quot&amp;quot ]; then
RPT=$VPT
else
RPT=$4
fi
STATUS=$(PGPASSWORD=&amp;quot$PG_MONITOR_PASS&amp;quot /usr/bin/psql -qtAX -c &amp;quotselect pg_is_in_recovery()&amp;quot -h &amp;quot$RIP&amp;quot -p &amp;quot$RPT&amp;quot --dbname=&amp;quot$PG_MONITOR_DB&amp;quot --username=&amp;quot$PG_MONITOR_USER&amp;quot)
#echo &amp;quot$@ status=$STATUS&amp;quot
if [[ &amp;quot$STATUS&amp;quot == &amp;quotf&amp;quot ]]
then
exit 0
else
exit 1
fistandby-check.sh به این شکل است.#!/bin/bash
VIP=$1
VPT=$2
RIP=$3
PG_MONITOR_USER=postgres
PG_MONITOR_PASS=postgres
PG_MONITOR_DB=postgres
if [ &amp;quot$4&amp;quot == &amp;quot&amp;quot ]; then
RPT=$VPT
else
RPT=$4
fi
STATUS=$(PGPASSWORD=&amp;quot$PG_MONITOR_PASS&amp;quot /usr/bin/psql -qtAX -c &amp;quotselect pg_is_in_recovery()&amp;quot -h &amp;quot$RIP&amp;quot -p &amp;quot$RPT&amp;quot --dbname=&amp;quot$PG_MONITOR_DB&amp;quot --username=&amp;quot$PG_MONITOR_USER&amp;quot)
if [[ &amp;quot$STATUS&amp;quot == &amp;quott&amp;quot ]]
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 &amp;&amp; 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  &amp;&amp; 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امیدوارم تونسته باشم برای کلاستر دیتابیس پستگرس کمکی کرده باشم.</description>
                <category>Mehdi Shavandi</category>
                <author>Mehdi Shavandi</author>
                <pubDate>Fri, 15 Dec 2023 12:39:15 +0330</pubDate>
            </item>
            </channel>
</rss>