ProxySQL چیست؟
در معماریهای مدرن، Database معمولاً یکی از مهمترین و حساسترین اجزای زیرساخت یک Application است. با افزایش تعداد کاربران، درخواستها و سرویسها، فشار روی Database نیز افزایش پیدا میکند و در بسیاری از پروژهها دیگر استفاده از یک MySQL Server به تنهایی پاسخگوی نیازهای Performance، Availability و Scalability نخواهد بود.
در چنین شرایطی یکی از راهکارهای رایج، استفاده از چند Database Server و توزیع ترافیک میان آنها است. اما این سؤال مطرح میشود که Application چگونه باید بین چند Database مختلف تصمیمگیری کند؟ کدام Query باید به Primary ارسال شود و کدام Query میتواند روی Replica اجرا شود؟ اگر یکی از Replicaها از دسترس خارج شد چه اتفاقی میافتد؟ و آیا میتوان بدون تغییر Application، منطق مسیریابی Queryها را مدیریت کرد؟
ProxySQL دقیقاً برای حل بخش مهمی از این مشکلات طراحی شده است.
ProxySQL یک High-Performance MySQL Proxy است که بین Application و MySQL Database Serverها قرار میگیرد و میتواند ترافیک Database را بر اساس قوانین مختلف مدیریت، مسیریابی و توزیع کند.
Application
│
▼
┌───────────────┐
│ ProxySQL │
└───────┬───────┘
│
┌────┴────┐
▼ ▼
MySQL MySQL
Primary Replica
یکی از مهمترین قابلیتهای ProxySQL، امکان پیادهسازی Read/Write Splitting و توزیع Queryها میان چند MySQL Server است؛ اما قابلیتهای آن به Load Balancing محدود نمیشود.
ProxySQL میتواند برای Query Routing، Connection Pooling، Query Filtering، Query Caching، Health Checking، Failover، Read/Write Splitting و مدیریت ترافیک MySQL نیز مورد استفاده قرار گیرد.
ProxySQL چگونه کار میکند؟
ProxySQL در معماری Application به عنوان یک لایه واسط بین Client و Database قرار میگیرد.
┌───────────────────────┐
│ Application │
│ │
│ Laravel / PHP / Java │
│ Node.js / Python ... │
└───────────┬───────────┘
│
│ MySQL Connection
▼
┌───────────────────────┐
│ ProxySQL │
│ │
│ Query Routing │
│ Load Balancing │
│ Connection Pooling │
│ Health Checking │
│ Query Rules │
└───────────┬───────────┘
│
┌─────┴─────┐
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ MySQL │ │ MySQL │
│ Primary │ │ Replica │
└──────────┘ └──────────┘
Application همچنان با یک Endpoint به Database متصل میشود و ProxySQL در پشت این Endpoint تصمیم میگیرد هر Connection یا Query را به کدام MySQL Server ارسال کند.
این موضوع یک مزیت معماری مهم دارد: Application لزوماً نباید از توپولوژی واقعی Database Cluster اطلاع داشته باشد.
به عنوان مثال Application میتواند همیشه به این Endpoint متصل شود:
mysql.example.com:6033
و ProxySQL در پشت این Endpoint تصمیم بگیرد که Query به MySQL Primary یا یکی از Replicaها ارسال شود.
چرا به ProxySQL نیاز داریم؟
برای درک بهتر کاربرد ProxySQL، ابتدا باید محدودیتهای اتصال مستقیم Application به MySQL را بررسی کنیم.
در سادهترین معماری، Application مستقیماً به یک Database Server متصل است:
Application
│
▼
MySQL
این معماری برای بسیاری از پروژههای کوچک کاملاً مناسب است. اما با رشد Application، مشکلاتی مانند موارد زیر ممکن است ایجاد شوند:
- افزایش تعداد Connectionها
- افزایش تعداد Queryها
- افزایش CPU و Memory مصرفی MySQL
- افزایش Disk I/O
- افزایش Read Traffic
- نیاز به High Availability
- نیاز به Failover
- نیاز به Read Replica
- نیاز به Query Routing
- نیاز به کنترل بهتر Connectionها
در این مرحله میتوان Database را به چند Server تقسیم کرد:
Application
│
┌────────┴────────┐
▼ ▼
MySQL Primary MySQL Replica
اما حالا Application باید بداند کدام Query را به کدام Server ارسال کند. همین موضوع میتواند پیچیدگی زیادی به Application Code اضافه کند.
ProxySQL این پیچیدگی را به یک لایه مستقل در Infrastructure منتقل میکند.
ProxySQL و Read/Write Splitting
یکی از معروفترین کاربردهای ProxySQL، تفکیک Queryهای Read و Write است.
در بسیاری از Applicationها تعداد Queryهای خواندن بسیار بیشتر از Queryهای نوشتن است. برای مثال ممکن است یک فروشگاه اینترنتی در هر ثانیه هزاران Query برای نمایش محصولات، صفحات و اطلاعات کاربران اجرا کند، در حالی که تعداد عملیات Write بسیار کمتر باشد.
در چنین شرایطی میتوان یک MySQL Primary برای Write و چند Replica برای Read داشت.
Application
│
▼
ProxySQL
│
┌──────────┴──────────┐
│ │
▼ ▼
Write Queries Read Queries
│ │
▼ ▼
┌──────────┐ ┌──────────┬──────────┐
│ Primary │ │ Replica1 │ Replica2 │
└──────────┘ └──────────┴──────────┘
در این معماری Queryهایی که داده را تغییر میدهند به Primary ارسال میشوند و Queryهای Read میتوانند میان Replicaها توزیع شوند.
مثال Queryهای Write
INSERT INTO users (...);
UPDATE users SET ...;
DELETE FROM users WHERE ...;
این Queryها معمولاً باید به Primary ارسال شوند.
مثال Queryهای Read
SELECT * FROM users;
SELECT id, name FROM products;
SELECT COUNT(*) FROM orders;
این Queryها میتوانند در شرایط مناسب روی Replicaها اجرا شوند.
ProxySQL میتواند با استفاده از Query Rules این مسیریابی را انجام دهد.
Read Replica چیست؟
برای درک بهتر معماری ProxySQL باید مفهوم Read Replica را نیز بشناسیم.
در معماری Replication، یک MySQL Server معمولاً به عنوان Primary فعالیت میکند و تغییرات Database را به Replicaهای دیگر منتقل میکند.
Primary
│
Replication
┌────────┴────────┐
▼ ▼
Replica 1 Replica 2
Replicaها معمولاً برای Read Traffic استفاده میشوند و باعث میشوند بخشی از بار خواندن از Primary خارج شود.
اما Replication به تنهایی باعث نمیشود Application بتواند به صورت هوشمند از Replicaها استفاده کند. یک لایه مانند ProxySQL میتواند این Replicaها را به Application ارائه کند و Queryها را بر اساس قوانین مشخص میان آنها توزیع کند.
ProxySQL Load Balancing چگونه انجام میشود؟
ProxySQL میتواند چند Backend MySQL Server را در قالب مجموعههایی به نام Hostgroup مدیریت کند.
به عنوان مثال میتوانیم چنین ساختاری داشته باشیم:
Hostgroup 10
│
└── Primary Servers
Hostgroup 20
│
├── Replica 1
├── Replica 2
└── Replica 3
سپس Queryهای Write به Hostgroup مربوط به Primary و Queryهای Read به Hostgroup مربوط به Replicaها ارسال میشوند.
ProxySQL
│
┌────────────┴────────────┐
│ │
HG 10 HG 20
Write Read
│ │
▼ ┌───────┼───────┐
Primary ▼ ▼ ▼
Replica1 Replica2 Replica3
این ساختار باعث میشود منطق مسیریابی Database از Application جدا شود.
Hostgroup در ProxySQL چیست؟
Hostgroup یکی از مفاهیم کلیدی ProxySQL است.
Hostgroup را میتوان به صورت یک گروه منطقی از MySQL Serverها در نظر گرفت که نقش مشابهی در معماری دارند.
برای مثال:
Writer Hostgroup
├── mysql-primary-01
└── mysql-primary-02
Reader Hostgroup
├── mysql-replica-01
├── mysql-replica-02
└── mysql-replica-03
ProxySQL میتواند بر اساس Query Rule، User، Schema یا سایر ویژگیها تصمیم بگیرد Query به کدام Hostgroup ارسال شود.
Query Rules در ProxySQL
یکی از قابلیتهای قدرتمند ProxySQL، Query Rules است.
Query Rules به ProxySQL اجازه میدهند بر اساس ویژگیهای Query، رفتار متفاوتی با آن داشته باشد.
برای مثال میتوان گفت:
- تمام SELECTها به Replica ارسال شوند.
- تمام INSERTها به Primary ارسال شوند.
- Queryهای مربوط به یک Database خاص به Server مشخصی بروند.
- Queryهای خاصی Block شوند.
- Queryهای مشخصی Cache شوند.
- Queryهای سنگین به مسیر متفاوتی ارسال شوند.
به این ترتیب ProxySQL فقط یک Load Balancer ساده نیست، بلکه میتواند یک لایه هوشمند برای مدیریت ترافیک Database باشد.
ProxySQL فقط برای Read/Write Splitting نیست
گاهی ProxySQL را صرفاً به عنوان ابزاری برای Read/Write Splitting معرفی میکنند، اما این تصویر کاملی از قابلیتهای آن نیست.
ProxySQL میتواند در چندین حوزه مختلف مورد استفاده قرار گیرد:
- Database Load Balancing
- Read/Write Splitting
- Query Routing
- Connection Pooling
- Connection Management
- Query Filtering
- Query Caching
- Health Checking
- Failover
- High Availability
- Database Traffic Management
به همین دلیل ProxySQL در معماریهای بزرگ MySQL میتواند نقش مهمی در لایه Database Infrastructure داشته باشد.
ProxySQL و Connection Pooling
یکی دیگر از قابلیتهای مهم ProxySQL، مدیریت Connectionها است.
ایجاد و نگهداری Connectionهای MySQL هزینه دارد و اگر Application تعداد بسیار زیادی Connection ایجاد کند، ممکن است Database تحت فشار قرار گیرد.
بدون ProxySQL:
Application
├── Connection 1 ──► MySQL
├── Connection 2 ──► MySQL
├── Connection 3 ──► MySQL
├── Connection 4 ──► MySQL
├── Connection 5 ──► MySQL
└── ...
ProxySQL میتواند در این میان قرار بگیرد و Connectionهای Backend را بهتر مدیریت کند:
Applications
│
▼
ProxySQL
│
│ Connection Pool
│
▼
MySQL
این موضوع مخصوصاً در معماریهایی که تعداد زیادی Application Instance یا Microservice وجود دارد اهمیت بیشتری پیدا میکند.
ProxySQL در معماری Microservices
در معماری Microservices ممکن است تعداد زیادی سرویس به یک MySQL Cluster یا مجموعهای از MySQL Serverها متصل باشند.
Service A ─┐
Service B ─┤
Service C ─┤
Service D ─┼──► ProxySQL ───► MySQL Cluster
Service E ─┤
Service F ─┘
در چنین معماریای ProxySQL میتواند یک نقطه مرکزی برای مدیریت Database Traffic ایجاد کند.
مزیت این روش این است که تغییرات مربوط به Topology Database الزاماً نیازمند تغییر در تمام Microserviceها نیست.
ProxySQL و High Availability
خود ProxySQL نیز باید در معماریهای Production از نظر Availability مورد توجه قرار گیرد.
اگر فقط یک ProxySQL Server داشته باشیم، آن Server میتواند به یک Single Point of Failure تبدیل شود.
Applications
│
▼
ProxySQL
│
X
Single Point
Failure
برای جلوگیری از این مشکل میتوان چند ProxySQL Instance اجرا کرد.
Applications
│
Load Balancer
/ \
▼ ▼
ProxySQL 1 ProxySQL 2
│ │
└────┬────┘
▼
MySQL Cluster
در محیطهای حساس، معماری ProxySQL باید خودش نیز Highly Available طراحی شود.
ProxySQL و Failover در MySQL
یکی از مهمترین دلایل استفاده از ProxySQL در محیطهای Production، امکان مدیریت بهتر Failover است. در یک معماری Database، اگر Primary Server از دسترس خارج شود، Application نباید الزاماً به صورت مستقیم با این مشکل مواجه شود.
ProxySQL میتواند وضعیت Backend Serverها را بررسی کند و در صورت تغییر وضعیت آنها، مسیر ترافیک را تغییر دهد.
Application
│
▼
ProxySQL
│
┌───────┴───────┐
│ │
▼ ▼
Primary Replica
MySQL MySQL
│
Failure
X
│
▼
Failover / Routing
البته ProxySQL به تنهایی یک سیستم کامل برای Database Failover نیست و در معماریهای پیچیده باید آن را در کنار ابزارهای مدیریت Topology و High Availability مانند MySQL InnoDB Cluster، Group Replication، Orchestrator یا راهکارهای مشابه استفاده کرد.
Health Check در ProxySQL
ProxySQL میتواند وضعیت Backendهای MySQL را بررسی کند تا مشخص شود هر Server در چه وضعیتی قرار دارد.
برای مثال اگر یکی از Replicaها Down شود، ProxySQL میتواند آن Server را از مسیر Load Balancing خارج کند تا Queryهای جدید به Serverهای سالم ارسال شوند.
ProxySQL
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
Replica 1 Replica 2 Replica 3
UP DOWN UP
│ X │
│ │ │
└────────────┴─────────────┘
│
▼
Healthy Servers
این قابلیت باعث میشود Application مجبور نباشد وضعیت تکتک Database Serverها را مدیریت کند.
ProxySQL و Query Caching
ProxySQL قابلیت Query Caching نیز دارد و میتواند نتیجه برخی Queryها را برای مدت مشخصی Cache کند.
Application
│
▼
ProxySQL
│
├── Cache Hit ──────► Return Result
│
└── Cache Miss ─────► MySQL
در صورت Cache Hit، Query دیگر به MySQL ارسال نمیشود و نتیجه از Cache بازگردانده میشود.
این قابلیت در برخی Workloadها میتواند باعث کاهش فشار روی Database شود، اما استفاده از Query Cache باید با دقت انجام شود.
اگر دادهها مرتب تغییر کنند، Cache ممکن است باعث بازگشت اطلاعات قدیمی شود. بنابراین Query Caching بیشتر برای Queryهایی مناسب است که دادههای آنها نسبتاً پایدار هستند و میتوان برای آنها یک سیاست مشخص برای Cache Invalidation تعریف کرد.
ProxySQL و Query Filtering
یکی دیگر از قابلیتهای جالب ProxySQL امکان تعریف قوانین برای Queryهای خاص است.
برای مثال میتوان Queryهایی را که الگوی مشخصی دارند شناسایی و رفتار متفاوتی با آنها داشت.
Incoming Query
│
▼
Query Rules
│
┌────┼───────────────┐
▼ ▼ ▼
Allow Route Cache Block
به عنوان مثال ممکن است بخواهیم یک Query خاص که بیش از حد سنگین است از اجرای مستقیم روی Production Database جلوگیری کنیم یا آن را به یک مسیر خاص هدایت کنیم.
این قابلیت در محیطهای بزرگ میتواند برای کنترل رفتار Applicationها و جلوگیری از برخی الگوهای نامناسب Query بسیار مفید باشد.
ProxySQL و Query Routing بر اساس User
ProxySQL میتواند Routing را فقط بر اساس متن Query انجام ندهد و از اطلاعات دیگری مانند User، Schema و سایر مشخصات Connection نیز استفاده کند.
برای مثال میتوان کاربران مختلف را به مسیرهای متفاوتی هدایت کرد.
ProxySQL
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
App User Report User Admin User
│ │ │
▼ ▼ ▼
Primary Replica Primary
این قابلیت مخصوصاً در محیطهایی که Application، Reporting و سرویسهای مدیریتی همزمان به Database متصل هستند میتواند مفید باشد.
ProxySQL در معماری Laravel و PHP
ProxySQL وابسته به زبان برنامهنویسی خاصی نیست و هر Applicationای که از MySQL Protocol استفاده کند میتواند از آن استفاده کند.
برای مثال در یک Application مبتنی بر Laravel میتوان Connection Database را به ProxySQL متصل کرد.
Laravel Application
│
▼
ProxySQL
│
┌────┴────┐
▼ ▼
Primary Replicas
از دید Laravel، ProxySQL مانند یک MySQL Endpoint معمولی دیده میشود.
به عنوان مثال Application میتواند به جای اتصال مستقیم به MySQL، از Host مربوط به ProxySQL استفاده کند.
DB_HOST=proxysql.internal
DB_PORT=6033
در این حالت منطق مسیریابی در Infrastructure قرار میگیرد و Application نیازی ندارد آدرس تکتک Replicaها را بداند.
ProxySQL و Kubernetes
ProxySQL را میتوان در معماریهای Kubernetes نیز مورد استفاده قرار داد.
برای مثال میتوان ProxySQL را به صورت Deployment اجرا کرد و یک Kubernetes Service برای آن ایجاد کرد.
Kubernetes
│
┌──────────┴──────────┐
│ │
Application Pods Application Pods
│ │
└──────────┬──────────┘
▼
ProxySQL Service
│
┌─────────┴─────────┐
▼ ▼
MySQL Primary MySQL Replicas
این معماری در صورتی مناسب است که Database نیز به شکل مناسبی در Kubernetes یا خارج از آن مدیریت شده باشد.
با این حال، قرار دادن ProxySQL داخل Kubernetes به معنی آن نیست که Database نیز الزاماً باید داخل Kubernetes باشد. در بسیاری از معماریهای Enterprise، Kubernetes فقط محیط اجرای Application و ProxySQL است و MySQL روی Serverهای اختصاصی یا Virtual Machineهای خارج از Cluster اجرا میشود.
آیا ProxySQL باید داخل Kubernetes باشد؟
خیر. ProxySQL میتواند در چند مدل مختلف Deploy شود.
- روی Bare Metal
- روی Virtual Machine
- داخل Docker
- داخل Kubernetes
- روی Serverهای اختصاصی Database Infrastructure
انتخاب بهترین مدل به معماری سازمان و نحوه مدیریت Database بستگی دارد.
اگر کل Application Stack روی Kubernetes قرار دارد، اجرای ProxySQL داخل Kubernetes میتواند ساده و منطقی باشد. اما اگر MySQL خارج از Kubernetes مدیریت میشود و نیاز به کنترل مستقل روی Database Layer وجود دارد، اجرای ProxySQL روی VM یا Bare Metal نیز گزینه بسیار مناسبی است.
ProxySQL در معماری Private Cloud
ProxySQL میتواند در Private Cloudهایی که تعداد زیادی Application و Database دارند نقش مهمی ایفا کند.
Private Cloud
│
┌───────────┴───────────┐
│ │
Kubernetes VM / Bare Metal
│ │
▼ ▼
Applications MySQL
│ │
└───────────┬───────────┘
▼
ProxySQL
│
┌──────────┼──────────┐
▼ ▼ ▼
MySQL 1 MySQL 2 MySQL 3
در چنین محیطی ProxySQL میتواند یک لایه استاندارد برای دسترسی Applicationها به Database ایجاد کند و پیچیدگی مربوط به Topology را از Applicationها پنهان کند.
ProxySQL و Monitoring
مانند هر Component دیگری در Infrastructure، ProxySQL نیز باید Monitoring شود.
برخی Metricهای مهم عبارتاند از:
- تعداد Active Connectionها
- تعداد Queryها
- Query Latency
- Query Error Rate
- Connection Error
- Backend Availability
- Connection Pool Usage
- Traffic Volume
- Cache Hit Rate
- Query Execution Time
این اطلاعات به تیم DevOps و Database Administrator (DBA) کمک میکنند تا بفهمند مشکل Performance در کدام بخش قرار دارد.
Application
│
▼
ProxySQL
│
├── Metrics
├── Query Statistics
├── Backend Health
└── Connection Statistics
│
▼
Monitoring
│
┌─────┴─────┐
▼ ▼
Prometheus Grafana
ProxySQL و Prometheus
در محیطهای Monitoring مدرن میتوان Metricهای ProxySQL را به Prometheus منتقل کرد و در Grafana نمایش داد.
در این حالت میتوان Dashboardهایی برای بررسی وضعیت Database Traffic طراحی کرد.
برای مثال میتوان مشاهده کرد که چه درصدی از Queryها به Primary و چه درصدی به Replicaها ارسال شدهاند.
Total Queries
│
├──────────────► Primary
│
└──────────────► Replicas
Primary Load: ████████████
Replica Load: ████████████████████
این اطلاعات برای Capacity Planning نیز بسیار مفید هستند.
ProxySQL و Performance Optimization
ProxySQL میتواند به بهبود Performance کمک کند، اما نباید آن را جایگزین Database Optimization دانست.
اگر یک Query بسیار سنگین باشد، صرفاً قرار دادن ProxySQL در مقابل MySQL مشکل اصلی را حل نمیکند.
در Performance Optimization باید لایههای مختلف بررسی شوند:
Application
│
▼
ProxySQL
│
▼
MySQL
│
├── CPU
├── Memory
├── Disk I/O
├── Indexes
└── Query Execution
ProxySQL میتواند ترافیک را بهتر مدیریت کند، اما مشکلاتی مانند Index نامناسب، Queryهای inefficient، Schema Design ضعیف یا کمبود منابع Server همچنان باید در خود Database حل شوند.
آیا ProxySQL خودش Database است؟
خیر.
ProxySQL یک Database Server نیست و دادههای Application را مانند MySQL ذخیره نمیکند. وظیفه اصلی آن مدیریت ارتباط و ترافیک بین Clientها و MySQL Serverها است.
Application
│
▼
ProxySQL
│
▼
MySQL
│
▼
Application Data
به بیان ساده، ProxySQL را میتوان یک Traffic Management Layer برای MySQL در نظر گرفت.
تفاوت ProxySQL با MySQL Router
ProxySQL و MySQL Router هر دو میتوانند در معماری MySQL بین Application و Database قرار بگیرند، اما هدف و قابلیتهای آنها کاملاً یکسان نیست.
| ویژگی | ProxySQL | MySQL Router |
|---|---|---|
| MySQL Proxy | بله | بله |
| Read/Write Splitting | قابلیت گسترده | بسته به معماری |
| Query Rules | بسیار قدرتمند | محدودتر |
| Query Routing | پیشرفته | تمرکز بیشتر روی MySQL Topology |
| Query Caching | بله | خیر |
| Connection Management | پیشرفته | بله |
| Integration با MySQL | عمومی | بسیار قوی با MySQL Ecosystem |
اگر هدف اصلی شما کنترل دقیق Queryها، Routing و Load Balancing است، ProxySQL معمولاً انعطافپذیری بیشتری ارائه میدهد.
اگر معماری شما مبتنی بر MySQL InnoDB Cluster است و میخواهید از ابزار رسمی MySQL برای Routing استفاده کنید، MySQL Router نیز میتواند انتخاب بسیار مناسبی باشد.
تفاوت ProxySQL با HAProxy
HAProxy یک Load Balancer عمومی است که میتواند برای TCP و HTTP مورد استفاده قرار گیرد، در حالی که ProxySQL به صورت تخصصی برای MySQL طراحی شده است.
| ویژگی | ProxySQL | HAProxy |
|---|---|---|
| تمرکز اصلی | MySQL | General Load Balancing |
| Query Routing | بله | خیر |
| Read/Write Splitting | بله | به صورت Native ندارد |
| HTTP Load Balancing | خیر | بله |
| TCP Load Balancing | بله | بله |
| MySQL Awareness | بالا | عمومی |
بنابراین اگر صرفاً به TCP Load Balancing نیاز داشته باشیم، HAProxy میتواند گزینه مناسبی باشد؛ اما اگر نیاز به درک و مدیریت Queryهای MySQL داشته باشیم، ProxySQL امکانات تخصصیتری ارائه میدهد.
آیا ProxySQL باعث افزایش سرعت MySQL میشود؟
پاسخ کوتاه این است: گاهی اوقات بله، اما ProxySQL به خودی خود MySQL را سریعتر نمیکند.
ProxySQL میتواند با توزیع Read Traffic، کاهش Connection Overhead، Query Routing و در برخی شرایط Query Caching باعث کاهش فشار روی Database شود.
اما اگر مشکل اصلی Application یک Query بسیار inefficient باشد، ProxySQL نمیتواند آن Query را به صورت جادویی سریع کند.
چه زمانی استفاده از ProxySQL منطقی است؟
ProxySQL زمانی ارزش بیشتری پیدا میکند که Database شما از یک Server ساده فراتر رفته باشد.
برخی سناریوهای مناسب عبارتاند از:
- استفاده از MySQL Replication
- وجود چند Read Replica
- نیاز به Read/Write Splitting
- تعداد زیاد Connection
- نیاز به Query Routing
- نیاز به Failover
- نیاز به Database Traffic Management
- وجود چند Application Server
- معماری Microservices
- Private Cloud و زیرساخت Enterprise
چه زمانی ProxySQL لازم نیست؟
اگر Application کوچک است و فقط یک MySQL Server دارید، استفاده از ProxySQL ممکن است پیچیدگی غیرضروری ایجاد کند.
Application
│
▼
MySQL
در چنین معماریای اضافه کردن ProxySQL لزوماً مزیت قابل توجهی ایجاد نمیکند.
ProxySQL زمانی معنا پیدا میکند که یک مسئله واقعی در زمینه Database Traffic، Scale کردن، Availability یا Routing داشته باشیم.
معماری پیشنهادی ProxySQL برای Production
برای یک معماری Production متوسط میتوان از ساختار زیر استفاده کرد:
Users
│
▼
Application
│
▼
┌─────────────┐
│ LoadBalancer│
└──────┬──────┘
│
┌────────┴────────┐
▼ ▼
ProxySQL 1 ProxySQL 2
│ │
└────────┬────────┘
▼
MySQL Layer
│
┌─────────────┼─────────────┐
▼ ▼ ▼
Primary Replica 1 Replica 2
│
└──────── Replication ────────►
در این معماری، علاوه بر MySQL، خود ProxySQL نیز به صورت Highly Available اجرا میشود.
این ساختار میتواند پایه مناسبی برای یک Database Infrastructure مقیاسپذیر باشد.
نکته مهم درباره Read/Write Splitting
Read/Write Splitting اگر بدون درک رفتار Application پیادهسازی شود، میتواند باعث ایجاد Bugهای بسیار ظریفی شود.
یکی از مهمترین مشکلات، Replication Lag است.
فرض کنید Application یک Record را روی Primary ایجاد میکند و بلافاصله بعد از آن همان Record را با یک SELECT درخواست میکند.
INSERT
│
▼
Primary
│
│ Replication
│
▼
Replica
SELECT
│
▼
Replica
اگر Replication هنوز به Replica نرسیده باشد، SELECT ممکن است Record جدید را پیدا نکند.
این مسئله میتواند باعث رفتارهای غیرمنتظره در Application شود.
بنابراین Read/Write Splitting صرفاً یک موضوع Infrastructure نیست و باید با منطق Application و نیازهای Consistency آن نیز هماهنگ شود.
Replication Lag چیست؟
Replication Lag به فاصله زمانی بین اعمال یک تغییر روی Primary و رسیدن همان تغییر به Replica اشاره دارد.
Primary
│
│ Write
▼
Update Row
│
│
│ Replication Lag
│
▼
Replica
│
▼
Updated Row
اگر این Lag زیاد شود، استفاده از Replica برای Read میتواند باعث بازگشت دادههای قدیمی شود.
به همین دلیل در معماریهای حساس باید وضعیت Replication نیز Monitoring شود.
ProxySQL و Consistency
یکی از مهمترین نکات در طراحی Read/Write Splitting، انتخاب صحیح Queryهایی است که اجازه دارند روی Replica اجرا شوند.
همه SELECTها الزاماً مناسب اجرای روی Replica نیستند.
در بعضی سناریوها Application انتظار دارد نتیجه یک Write بلافاصله در Read بعدی قابل مشاهده باشد. در چنین شرایطی ممکن است لازم باشد Query به Primary ارسال شود.
بنابراین طراحی Query Rules باید با در نظر گرفتن Consistency Requirements انجام شود.
ProxySQL و Security
از آنجا که ProxySQL در مسیر ارتباطی بین Application و Database قرار میگیرد، امنیت آن باید به اندازه خود MySQL جدی گرفته شود.
قرار دادن ProxySQL روی یک Server عمومی و باز گذاشتن Port آن برای Internet میتواند ریسک امنیتی قابل توجهی ایجاد کند.
در یک معماری Production بهتر است ProxySQL در یک Network Segment امن و نزدیک به Application و Database قرار داشته باشد.
Internet
│
▼
┌───────────┐
│ Firewall │
└─────┬─────┘
│
▼
Application
│
▼
ProxySQL
│
▼
Private Network
│
┌─────────┼─────────┐
▼ ▼ ▼
MySQL 1 MySQL 2 MySQL 3
در این معماری Database Serverها نباید مستقیماً از Internet قابل دسترسی باشند و فقط ProxySQL یا سرویسهای مجاز باید امکان برقراری ارتباط با آنها را داشته باشند.
Authentication در ProxySQL
ProxySQL میتواند اطلاعات مربوط به Userهای MySQL را مدیریت کند و Connectionهای Application را به Backendهای MySQL منتقل کند.
بهتر است برای سرویسهای مختلف Userهای جداگانه تعریف شود.
Application A
│
└── app_user
Application B
│
└── reporting_user
Monitoring
│
└── monitoring_user
استفاده از یک User مشترک برای تمام Applicationها باعث میشود کنترل دسترسی، Audit و مدیریت Credentialها دشوارتر شود.
اصل Least Privilege در ProxySQL
مانند سایر اجزای Infrastructure، در ProxySQL نیز باید از اصل Least Privilege استفاده شود.
هر Application باید فقط دسترسیهایی را داشته باشد که واقعاً به آن نیاز دارد.
برای مثال یک سرویس Reporting که فقط اطلاعات را میخواند نباید دسترسی Write روی Database داشته باشد.
Reporting Service
│
▼
ProxySQL
│
▼
Read Only
│
▼
Replicas
این طراحی علاوه بر امنیت، احتمال اجرای اشتباه Queryهای مخرب یا ناخواسته روی Primary را نیز کاهش میدهد.
ProxySQL و TLS
در محیطهایی که ارتباط بین Application، ProxySQL و MySQL از Networkهای غیرقابل اعتماد عبور میکند، استفاده از TLS اهمیت زیادی دارد.
Application
│
│ TLS
▼
ProxySQL
│
│ TLS
▼
MySQL
در محیطهای حساس میتوان Encryption را در تمام مسیر ارتباطی فعال کرد تا Credentialها و اطلاعات Database در مسیر انتقال قابل مشاهده نباشند.
ProxySQL و Secret Management
Credentialهای Database نباید مستقیماً داخل Source Code یا Configurationهای عمومی ذخیره شوند.
در محیطهای مدرن بهتر است Secretها توسط ابزارهای تخصصی مدیریت شوند.
- Kubernetes Secrets
- HashiCorp Vault
- Cloud Secret Managerها
- Secret Management در CI/CD
برای مثال در Kubernetes میتوان Credentialهای ProxySQL را از طریق Secret مدیریت کرد.
Kubernetes Secret
│
▼
ProxySQL
│
▼
MySQL
ProxySQL و Observability
در معماریهای Production، Monitoring به تنهایی کافی نیست. برای Troubleshooting مؤثر باید Metrics، Logs و Traces در کنار یکدیگر بررسی شوند.
ProxySQL میتواند در این معماری به عنوان یکی از نقاط مهم Observability در Database Traffic دیده شود.
Application
│
▼
ProxySQL
/ | \
/ | \
Metrics Logs Traffic
│ │ │
▼ ▼ ▼
Prometheus Loki Analysis
│ │
└───┬───┘
▼
Grafana
با این روش میتوان در زمان بروز مشکل بررسی کرد که آیا مشکل از Application، ProxySQL، Network یا خود Database است.
چه Metricهایی برای ProxySQL مهم هستند؟
برخی از مهمترین Metricها و اطلاعاتی که بهتر است در Dashboard قرار بگیرند عبارتاند از:
- تعداد Queryهای دریافتشده
- تعداد Queryهای موفق و ناموفق
- Query Latency
- Connection Count
- Active Connections
- Backend Connection Usage
- Traffic حجم ورودی و خروجی
- Cache Hit Ratio
- Backend Availability
- Replication Lag
- Query Error Rate
ترکیب این اطلاعات میتواند دید بسیار خوبی از وضعیت Database Traffic ایجاد کند.
ProxySQL و Logging
Logs نیز برای بررسی مشکلات Runtime بسیار مهم هستند.
برای مثال اگر Application با خطای Database Connection مواجه شود، میتوان بررسی کرد که آیا Connection در ProxySQL ایجاد شده، Query به Backend ارسال شده یا Backend در آن لحظه در دسترس نبوده است.
Application Error
│
▼
ProxySQL Logs
│
├── Connection Error
├── Backend Error
├── Routing Issue
└── Authentication Error
در معماریهای بزرگ بهتر است Logs مربوط به ProxySQL نیز به یک سیستم Centralized Logging مانند Loki یا Elasticsearch منتقل شوند.
ProxySQL در معماری Multi-Database
در سازمانهای بزرگ ممکن است چندین کلاستر دیتابیس مختلف وجود داشته باشد.
برای مثال:
ProxySQL
│
┌───────────────┼────────────────┐
│ │ │
▼ ▼ ▼
Cluster A Cluster B Cluster C
MySQL MySQL MySQL
با استفاده از Query Rules و Routing مناسب میتوان Databaseهای مختلف را بر اساس Schema، User یا Query به مسیرهای متفاوت هدایت کرد.
این قابلیت برای محیطهایی که چند Application یا چند Tenant دارند نیز میتواند مفید باشد.
ProxySQL و Multi-Tenancy
در معماریهای Multi-Tenant ممکن است Tenantهای مختلف روی Databaseهای جداگانه یا Clusterهای مختلف قرار داشته باشند.
Application
│
▼
ProxySQL
│
┌───────────┼───────────┐
▼ ▼ ▼
Tenant A Tenant B Tenant C
│ │ │
▼ ▼ ▼
MySQL A MySQL B MySQL C
ProxySQL میتواند در چنین معماریهایی به عنوان لایه Routing عمل کند، البته پیادهسازی صحیح Multi-Tenancy نیازمند طراحی دقیق Authentication، Authorization، Data Isolation و Database Topology است.
ProxySQL و Disaster Recovery
در معماریهای Disaster Recovery (بازیابی از بحران)، ProxySQL میتواند بخشی از مسیر Failover بین Primary و Secondary Data Center باشد.
Primary DC
│
ProxySQL
│
MySQL
│
Replication
│
▼
Secondary DC
│
ProxySQL
│
MySQL
در صورت از دست رفتن Data Center اصلی، Traffic میتواند به سمت Database موجود در سایت Disaster Recovery منتقل شود.
البته این سناریو به یک طراحی کامل DR نیاز دارد و ProxySQL به تنهایی Disaster Recovery ایجاد نمیکند.
ProxySQL و Backup
ProxySQL جایگزین Backup نیست.
اگر Database چند Replica داشته باشد، داشتن چند Copy از دادهها به معنی داشتن Backup واقعی نیست.
Replication معمولاً برای Availability و Scaling استفاده میشود، در حالی که Backup برای Recovery از خطاهای منطقی، حذف تصادفی داده، Corruption و سایر مشکلات مورد نیاز است.
MySQL Primary
│
┌─────────┴─────────┐
▼ ▼
Replica 1 Replica 2
│
│
▼
Backup
│
▼
Backup Storage
ProxySQL و Kubernetes Service
اگر ProxySQL داخل کوبرنتیس اجرا شود، بهتر است Applicationها مستقیماً به Podهای ProxySQL متصل نشوند.
به جای آن میتوان از Kubernetes Service استفاده کرد.
Application Pod
│
▼
ProxySQL Service
│
┌──┴──┐
▼ ▼
ProxySQL Pod 1
ProxySQL Pod 2
این روش باعث میشود Application از وضعیت واقعی Podها مستقل باشد و Kubernetes وظیفه Service Discovery و Load Balancing را انجام دهد.
ProxySQL در Docker
ProxySQL را میتوان به سادگی در Docker نیز اجرا کرد.
Docker Network
│
┌────┴─────┐
▼ ▼
ProxySQL MySQL
Container Container
این مدل برای Development، Load Testing و برخی Deploymentهای کوچک مناسب است.
برای Production باید مواردی مانند Persistent Configuration، مانیتورینگ، مدیرت لاگ، امنیت و هاردنینگ (Hardening) و پیادهسازی معماری High Availability نیز در نظر گرفته شوند.
آیا ProxySQL برای PostgreSQL مناسب است؟
خیر. ProxySQL به صورت تخصصی برای MySQL و پروتکلهای مرتبط با آن طراحی شده است.
اگر Database اصلی شما PostgreSQL است، باید از ابزارهای مخصوص PostgreSQL مانند PgBouncer، Pgpool-II یا راهکارهای مناسب دیگر استفاده کنید.
| Database | ابزارهای رایج |
|---|---|
| MySQL | ProxySQL، MySQL Router |
| PostgreSQL | PgBouncer، Pgpool-II |
| Redis | Redis Sentinel، Redis Cluster |
ProxySQL در مقابل Database Load Balancerهای عمومی
یکی از نکات مهم در انتخاب ابزار این است که Database Load Balancing با Load Balancing معمولی Application تفاوت دارد.
یک Load Balancer عمومی معمولاً بر اساس IP، Port، Connection یا Health Check تصمیم میگیرد Traffic را به کدام Server ارسال کند.
اما ProxySQL میتواند تا سطح Query نیز رفتار متفاوتی داشته باشد.
Generic Load Balancer
│
├── Server A
├── Server B
└── Server C
ProxySQL
│
├── SELECT ───► Replica
├── INSERT ───► Primary
├── UPDATE ───► Primary
├── Report ───► Reporting DB
└── Cached ───► Cache
این تفاوت مهمترین دلیل استفاده از ProxySQL در بسیاری از معماریهای MySQL است.
مزایای ProxySQL
ProxySQL مزایای متعددی برای معماریهای MySQL فراهم میکند:
- Read/Write Splitting
- Database Load Balancing
- Query Routing
- Connection Pooling
- Health Checking
- Failover Management
- Query Filtering
- Query Caching
- کاهش وابستگی Application به Topology Database
- امکان مدیریت متمرکز Database Traffic
- قابلیت اجرای معماریهای High Availability
معایب و چالشهای ProxySQL
با وجود مزایای زیاد، ProxySQL نیز بدون چالش نیست.
پیچیدگی معماری
اضافه کردن ProxySQL یک لایه جدید به Infrastructure اضافه میکند و تیم باید رفتار و Configuration آن را به خوبی بشناسد.
Single Point of Failure
اگر فقط یک ProxySQL Instance وجود داشته باشد، خود ProxySQL تبدیل به نقطه شکست خواهد شد.
پیچیدگی Read/Write Splitting
Read/Write Splitting باید با در نظر گرفتن Replication Lag و Consistency طراحی شود.
نیاز به Monitoring
ProxySQL باید مانند هر Component زیرساختی دیگری Monitoring و Alerting شود.
نیاز به دانش Database
برای استفاده حرفهای از ProxySQL، شناخت MySQL، Replication، Query Optimization و Database Architecture ضروری است.
بهترین روشهای استفاده از ProxySQL در Production
اگر قصد استفاده از ProxySQL در یک محیط Production را دارید، رعایت اصول زیر توصیه میشود:
- ProxySQL را Highly Available اجرا کنید.
- Database Serverها را مستقیماً در معرض Internet قرار ندهید.
- Read/Write Splitting را با در نظر گرفتن Replication Lag طراحی کنید.
- Credentialهای Database را به صورت امن مدیریت کنید.
- Metricها و Logs را به سیستم Monitoring مرکزی ارسال کنید.
- برای Backend Serverها Health Check مناسب داشته باشید.
- Query Rules را مستند و Version Control کنید.
- از Query Caching بدون بررسی Consistency استفاده نکنید.
- Backup و Disaster Recovery را مستقل از Replication طراحی کنید.
- تغییرات ProxySQL را ابتدا در Staging آزمایش کنید.
چه زمانی ProxySQL انتخاب مناسبی است؟
اگر یک Application کوچک دارید که فقط به یک MySQL Server متصل است، احتمالاً ProxySQL ارزش پیچیدگی اضافی را ندارد.
اما اگر معماری شما شامل چند MySQL Server، Read Replica، Replication، کوبرنتیز، Microservices یا تعداد زیادی Application باشد، ProxySQL میتواند بسیار ارزشمند باشد.
Single MySQL
│
▼
Application
│
│
└── ProxySQL معمولاً ضروری نیست
Multiple MySQL
│
▼
ProxySQL
│
├── Primary
├── Replica
├── Replica
└── Reporting
جمعبندی
ProxySQL یکی از ابزارهای قدرتمند برای مدیریت ترافیک MySQL در معماریهای مدرن است. این ابزار بین Application و MySQL قرار میگیرد و میتواند وظایفی مانند Query Routing، Load Balancing، Read/Write Splitting، Connection Management، Health Checking و Query Caching را انجام دهد.
یکی از مهمترین کاربردهای ProxySQL، توزیع Read Traffic میان چند Replica و ارسال Write Traffic به Primary است. این قابلیت میتواند فشار روی Database اصلی را کاهش دهد و امکان Scale کردن Read Workload را فراهم کند.
با این حال، ProxySQL جایگزین Database Replication، بکاپ یا High Availability نیست. در یک معماری حرفهای باید ProxySQL را در کنار تکنولوژیهایی مانند MySQL Replication، Group Replication، InnoDB Cluster و سیستمهای Monitoring و Backup استفاده کرد.
همچنین Read/Write Splitting باید با دقت طراحی شود، زیرا مسائلی مانند Replication Lag و Consistency میتوانند باعث ایجاد رفتارهای غیرمنتظره در Application شوند.
در نهایت، اگر MySQL شما از یک Server ساده فراتر رفته و به معماری شامل چند Database Server، Replica، Microservice، کوبرنتیس یا ابر خصوصی تبدیل شده است، ProxySQL میتواند یک لایه بسیار ارزشمند برای مدیریت و کنترل Database Traffic باشد.
سوالات متداول
ProxySQL چیست؟
ProxySQL یک MySQL Proxy و لایه مدیریت ترافیک دیتابیس است که بین Application و MySQL Serverها قرار میگیرد و قابلیتهایی مانند Query Routing، Load Balancing، Read/Write Splitting و Connection Management را ارائه میدهد.
آیا ProxySQL یک دیتابیس است؟
خیر. ProxySQL Database Server نیست و برای ذخیره دادههای Application استفاده نمیشود. این ابزار Traffic و Connectionهای میان Application و MySQL را مدیریت میکند.
مهمترین کاربرد ProxySQL چیست؟
یکی از مهمترین کاربردهای ProxySQL، Read/Write Splitting و توزیع Queryهای Read میان چند MySQL Replica است؛ اما قابلیتهای آن شامل Query Routing، Health Check، Connection Pooling، Failover و Query Caching نیز میشود.
آیا ProxySQL برای MySQL مناسب است؟
بله. ProxySQL به صورت تخصصی برای MySQL و محیطهای مبتنی بر MySQL طراحی شده و در معماریهای دارای Replication و چند Database Server کاربرد زیادی دارد.
آیا ProxySQL از PostgreSQL پشتیبانی میکند؟
خیر. ProxySQL برای MySQL طراحی شده است. برای PostgreSQL ابزارهایی مانند PgBouncer و Pgpool-II گزینههای رایجتری هستند.
تفاوت ProxySQL و HAProxy چیست؟
HAProxy یک Load Balancer عمومی است، در حالی که ProxySQL به صورت تخصصی برای MySQL طراحی شده و میتواند Queryها را بررسی و بر اساس نوع Query، User، Schema و Ruleهای تعریفشده مسیریابی کند.
تفاوت ProxySQL و MySQL Router چیست؟
MySQL Router ابزار رسمی MySQL برای Routing در معماریهای MySQL است و مخصوصاً با InnoDB Cluster یکپارچگی بالایی دارد. ProxySQL امکانات گستردهتری برای Query Rules، Query Routing، Load Balancing و Traffic Management ارائه میدهد.
آیا ProxySQL باعث افزایش سرعت MySQL میشود؟
ProxySQL مستقیماً MySQL را سریعتر نمیکند، اما با توزیع Read Traffic، مدیریت Connectionها، Routing و در برخی سناریوها Query Caching میتواند فشار روی Database را کاهش داده و Performance کلی سیستم را بهبود دهد.
آیا ProxySQL برای Kubernetes مناسب است؟
بله. ProxySQL میتواند داخل کوبرنتیز یا خارج از آن اجرا شود و Applicationهای Kubernetes میتوانند از طریق یک Service به ProxySQL متصل شوند.
آیا ProxySQL جایگزین MySQL Replication است؟
خیر. ProxySQL وظیفه مدیریت و مسیریابی Traffic را بر عهده دارد، در حالی که Replication وظیفه انتقال تغییرات داده میان MySQL Serverها را انجام میدهد.
آیا ProxySQL جایگزین Backup است؟
خیر. داشتن Replica به معنی داشتن Backup نیست. برای Recovery از حذف اشتباه داده، Corruption و سایر مشکلات باید Backup مستقل و قابل بازیابی داشته باشید.
آیا استفاده از ProxySQL برای همه پروژهها ضروری است؟
خیر. برای پروژههای کوچک با یک MySQL Server، اتصال مستقیم Application به Database معمولاً سادهتر و مناسبتر است. ProxySQL زمانی ارزش بیشتری پیدا میکند که نیاز به چند Database Server، Read Replica، Load Balancing، Query Routing یا High Availability وجود داشته باشد.
آیا ProxySQL از Read/Write Splitting پشتیبانی میکند؟
بله. Read/Write Splitting یکی از مهمترین قابلیتهای ProxySQL است و میتوان Queryهای Read را به Replicaها و Queryهای Write را به Primary ارسال کرد.
آیا Read/Write Splitting همیشه امن است؟
خیر. Replication Lag میتواند باعث شود یک Query Read بلافاصله بعد از Write اطلاعات قدیمی دریافت کند. بنابراین Read/Write Splitting باید بر اساس نیازهای Consistency و رفتار Application طراحی شود.
ProxySQL از چه Portهایی استفاده میکند؟
ProxySQL معمولاً از Port مربوط به MySQL Traffic برای دریافت Connectionهای Client استفاده میکند و یک Port مدیریتی نیز برای Administration دارد. Portهای دقیق باید بر اساس Configuration محیط شما بررسی شوند.
آیا ProxySQL Open Source است؟
بله. ProxySQL یک پروژه Open Source است و میتوان آن را در زیرساختهای Self-hosted، Private Cloud و محیطهای محیط Enterprise استفاده کرد.
آیا ProxySQL برای Private Cloud مناسب است؟
بله. ProxySQL میتواند در Private Cloudهایی که چندین Application، MySQL Cluster، Kubernetes یا Virtual Machine دارند به عنوان لایه مدیریت Database Traffic مورد استفاده قرار گیرد.
آیا ProxySQL از Connection Pooling پشتیبانی میکند؟
بله. ProxySQL میتواند Connectionهای Backend را مدیریت کند و در برخی معماریها باعث کاهش فشار ناشی از ایجاد و نگهداری تعداد زیاد Connection روی MySQL شود.
آیا ProxySQL میتواند Query را Cache کند؟
بله. ProxySQL قابلیت Query Caching دارد، اما استفاده از آن باید با توجه به ماهیت داده و نیازهای Consistency انجام شود تا اطلاعات قدیمی به Application بازگردانده نشود.
آیا ProxySQL یک Single Point of Failure است؟
اگر فقط یک Instance از ProxySQL اجرا شود، بله. برای محیطهای Production بهتر است چند ProxySQL Instance در یک معماری Highly Available اجرا شوند.
آیا ProxySQL برای معماری Microservices مناسب است؟
بله. ProxySQL میتواند یک لایه متمرکز برای مدیریت Connection و Database Traffic میان تعداد زیادی Microservice ایجاد کند و وابستگی سرویسها به Topology واقعی MySQL را کاهش دهد.
بهترین جای ProxySQL در معماری Infrastructure کجاست؟
ProxySQL معمولاً بین Application و MySQL قرار میگیرد. بسته به معماری میتوان آن را روی VM، Bare Metal، Docker یا Kubernetes اجرا کرد.
به یک DBA حرفهای برای مدیریت و بهینهسازی دیتابیس نیاز دارید؟
مدیریت صحیح Database فقط به راهاندازی MySQL یا PostgreSQL محدود نمیشود. Performance Tuning، بهینهسازی Queryها و Indexها، طراحی Replication، افزایش Availability، مانیتورینگ و رفع Bottleneckهای دیتابیس همگی نیازمند دانش و تجربه تخصصی DBA هستند.
اگر دیتابیس شما با مشکلاتی مانند کندی Queryها، مصرف بالای منابع، افزایش Connectionها، مشکلات Replication یا محدودیت در مقیاسپذیری مواجه است، تیم DBA آلتیمیت کلاد میتواند در مدیریت، پایش و بهینهسازی زیرساخت Database در کنار شما باشد.
مشاهده خدمات DBA