دیتابیس مدیریت‌شده‌ی آروان‌کلاد سرویسی ابری برای ایجاد و مدیریت آسان دیتابیس‌هاست. هر کلاستر دیتابیس دارای محدودیت مشخصی در تعداد اتصال‌های هم‌زمان یا همان Conn‍e‍ction Limit است. زمانی که تعداد اتصال‌ها از این حد عبور کند، خطای Too Many Connections رخ می‌دهد. علت اصلی این خطا معمولن مدیریت نادرست کانکشن‌هاست، مثل باز گذاشتن اتصال و نبستن آن پس از استفاده.

در این راهنما، با میزان محدودیت هر فلیور، شیوه‌ی بررسی تعداد اتصال‌های فعال و رفع خطای Too Many Connections آشنا می‌شوید.

Connection Limit در دیتابیس ابری آروان‌کلاد

Connection Limit به معنای تعداد مجاز اتصال هم‌زمان به دیتابیس است. این مقدار برای هر فلیور بر اساس منابع سخت‌افزاری تعریف شده و در زمان ساخت دیتابیس در پنل آروان‌کلاد نمایش داده می‌شود.

توجه داشته باشید کانکشن‌های هم‌زمان شامل همه‌ی اتصال‌های بک‌اند اپلیکیشن، وب‌سایت، کلاینت‌های Command Line یا نرم‌افزارهای مدیریت دیتابیس می‌شود.

پس از ایجاد دیتابیس، می‌توانید وضعیت کانکشن‌ها را در تب مانیتورینگ هر کلاستر مشاهده کنید:

  • Connections: تعداد کانکشن‌های فعال فعلی

  • Max Used Connections: بیش‌ترین تعداد کانکشن هم‌زمان که در آن بازه‌ی زمانی استفاده شده

  • Max Connections: تعداد مجاز کانکشن هم‌زمان

جدول Connection Limit به‌تفکیک فلیور

در جدول زیر مقادیر Connection Limit برای انجین‌های PostgreSQL و MySQL آورده شده است.

   
  Flavor (CPU – RAM)  PostgreSQL  MySQL
1-250
2-2100250
2-4200250
4-8300800
4-124001100
6-164001500
8-166001500
6-248002500
8-329003200
12-4810003500
16-6410004100
20-9610005100
24-12810006100

اگر تعداد کانکشن‌های فعال به سقف ظرفیت برسد:

  • امکان اتصال جدید وجود ندارد.

  • باید کانکشن‌های غیرضروری بسته شوند.

نمونه خطاهای رایج مرتبط با Connection Limit

کاربران معمولن با خطاهای زیر مواجه می‌شوند:

  • ERROR 1040 (08004): Too many connections

  • PostgresException: 53300: remaining connection slots are reserved for roles with the SUPERUSER attribute

  • پر شدن Connection Pool و در دسترس نبودن دیتابیس

رفع خطای مرتبط با Connection Limit

برای رفع این خطاها و بستن کانکشن‌های غیرضروری می‌توانید بر اساس انجین دیتابیس‌تان (MySQL/PostgreSQL) از دستورهای زیر استفاده کنید.

توجه داشته باشید در چنین شرایطی که امکان اتصال جدید وجود ندارد، فقط از طریق اتصال‌های قبلی می‌توانید این دستورها را اجرا کنید. اگر به هیچ اتصال فعالی دسترسی ندارید، باید مشکل را برای رفع به تیم پشتیبانی آروان‌کلاد ارجاع دهید.

MySQL

ابتدا باید لیست کانکشن‌های باز دیتابیس را دریافت کنید. با این کار می توانید بررسی کنید که آیا دیتابیس به آستانه‌ی کانکشن‌های مجاز رسیده است یا خیر.

نمایش کانکشن‌ها:

SHOW PROCESSLIST;

خروجی این دستور نشان‌دهنده‌ی کانکشن‌ها، وضعیت آن‌ها، یوزری که آن کانکشن را ایجاد کرده و آدرس هاستی که کانکشن از روی آن برقرار شده، است.

پس از پیدا کردن کانکشن غیرضروری برای بستن آن در انجین MySQL از دستور زیر استفاده کنید.

بستن یک کانکشن خاص:

KILL <thread_id>;

به جای <thread_id> مقدار ستون Id از خروجی دستور قبل را قرار دهید.

توجه داشته باشید که بستن همه‌ی کانکشن‌ها می‌تواند باعث اختلال موقت در اپلیکیشن یا سرویس شود.

PostgreSQL

برای مشاهده‌ی کانکشن‌ها در انجین PostgreSQL از دستورهای زیر استفاده کنید:

SELECT pid, usename, datname, client_addr, state
FROM pg_stat_activity;

خروجی این دستور به شکل زیر خواهد بود که نشان‌دهنده‌ی کانکشن‌ها، وضعیت آن‌ها، آدرس کلاینتی که کانکشن را ایجاد کرده و نام کاربر مرتبط با آن است.

یا از دستور زیر برای دیدن وضعیت خلاصه‌ای از کانکشن‌ها استفاده کنید:

SELECT datname, count(*)
FROM pg_stat_activity
GROUP BY datname;

خروجی این کوئری به شکل زیر است و به‌طور خلاصه، تعداد کانکشن‌ها به دیتابیس‌های داخلی را نمایش می‌دهد.

برای بستن یک کانکشن خاص در انجین PostgreSQL از دستور زیر استفاده کنید:

SELECT pg_terminate_backend(<pid>);

به‌جای <pid> مقدار ستون pid کانکشن مورد نظر که قصد بستن آن را دارید قرار دهید.

خروجی دستور به شکل زیر خواهد بود:

هم‌چنین برای بستن همه‌ی کانکشن‌های یک دیتابیس (غیر از کانکشن فعلی) می‌توانید از دستور زیر استفاده کنید:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = '<DB_NAME>' AND pid <> pg_backend_pid();

توجه داشته باشید که بستن همه‌ی کانکشن‌ها می‌تواند باعث قطع شدن موقت سرویس شود.

راهکار پایدار خطاهای مرتبط با Connection

اگر مشکل شما با بستن کانکشن‌ها به‌طور موقت حل می‌شود ولی به شکل پایدار هم‌چنان به تعداد کانکشن بیش‌تری نیاز دارید باید از فلیور‌ی بزرگ‌تر استفاده کنید. چراکه افزایش Connection Limit به‌شکل دستی یا موقت امکان‌پذیر نیست.

شما همواره می‌توانید به‌کمک قابلیت «تغییر اندازه» فلیور کلاسترتان را بدون اختلال یا قطعی تغییر دهید و با افزایش ظرفیت، به منابع و کانکشن بیش‌تری دسترسی داشته باشید.