Mehdi Shavandi
Mehdi Shavandi
خواندن ۴ دقیقه·۱ سال پیش

Mariadb + Galera + Haproxy

ماریا دی بی چیست؟

ماریا دی بی یک پایگاه داده امن، سریع و رابطه‌ای یا همان 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 Compose

docker-compose.yml

version: &quot3&quot services: #mariadb-1 mariadb1: image: mariadb:10.5 container_name: mariadb1 ports: - &quot3306:3306&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: - &quot3307:3306&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: - &quot3308:3306&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: - &quot6032:6032&quot - &quot6070:6070&quot - &quot6080:6080&quot cap_add: - all networks: - app_net haproxy: image: haproxy:latest container_name: haproxy volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg ports: - &quot3000:3000&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=mariadb3

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=&quotgcomm://&quot wsrep_cluster_name=&quotMariaDB Galera Cluster&quot wsrep_sst_method=rsync # Cluster node configuration wsrep_node_address=&quotmariadb1&quot wsrep_node_name=&quotmariadb1&quot

mariadb2/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=&quotgcomm://mariadb1,mariadb2,mariadb3&quot wsrep_cluster_name=&quotMariaDB Galera Cluster&quot wsrep_sst_method=rsync # Cluster node configuration wsrep_node_address=&quotmariadb2&quot wsrep_node_name=&quotmariadb2&quot

mariadb3/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=&quotgcomm://mariadb1,mariadb2,mariadb3&quot wsrep_cluster_name=&quotMariaDB Galera Cluster&quot wsrep_sst_method=rsync # Cluster node configuration wsrep_node_address=&quotmariadb3&quot wsrep_node_name=&quotmariadb3&quot

haproxy.cfg

global 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=&quotgcomm://mariadb1,mariadb2,mariadb3&quot wsrep_cluster_name=&quotMariaDB Galera Cluster&quot wsrep_sst_method=rsync # Cluster node configuration wsrep_node_address=&quotmariadb1&quot wsrep_node_name=&quotmariadb1&quot

و مجدد docker compose up -d زده بشه

نکته:احتمالا کانفیگ فایل عا رو از این جا کپی کرده باشید ایندنت ها رعایت نمیشه داخل گیت هاب ام میزارم.

https://github.com/MehdiShavandi/mariadb-cluster

امیدوارم تونسته باشم برای کلاستر دیتابیس ماریا دی بی کمکی کرده باشم.

mariadbgalerahaproxycluster mariadbکلاستر ماریا دی بی
DevOps Engineer
شاید از این پست‌ها خوشتان بیاید