امروزه، دیتابیسها نقش حیاتی در عملکرد اپلیکیشنها و وبسایتها ایفا میکنند. هر چه تعداد کاربران و درخواستها افزایش یابد، فشار بیشتری روی دیتابیس وارد میشود. یکی از راههای مقابله با این چالش، استفاده از connection pooling است. در این مقاله، به بررسی PgBouncer، ابزار قدرتمند connection pooler برای PostgreSQL میپردازیم و میبینیم چگونه میتواند به بهبود عملکرد دیتابیس شما کمک کند.
دیتابیس PostgreSQL چگونه کار میکند؟
در حالت عادی، PostgreSQL برای هر اتصال کلاینت یک پروسه جدید ایجاد میکند. این پروسهها که معمولاً backend نامیده میشوند، مسئول رسیدگی به درخواستهای کلاینت هستند. اگرچه این معماری پایداری و ایزولاسیون خوبی ارائه میدهد، اما ایجاد پروسههای متعدد برای هر اتصال، بهخصوص در مواقعی که اتصالات کوتاهمدت هستند، میتواند منابع سیستم را به شدت مصرف کند.
تصور کنید وبسایتی با تعداد زیادی کاربر دارید که هر بار که صفحهای را باز میکنند، اتصالی جدید به دیتابیس ایجاد میشود. این امر میتواند منجر به کاهش سرعت و افزایش بار روی سرور دیتابیس شود. این معماری به نام مدل Client-Server شناخته میشود و به دلیل محدودیتهای منابع CPU و حافظه سرور، مقیاسپذیری مناسبی ندارد.
Connection Pooling چیست؟
Connection pooling راهحلی برای مشکل ایجاد اتصالات متعدد است. با استفاده از این تکنیک، کلاینتها به جای اتصال مستقیم به دیتابیس، به یک پروکسی سرور متصل میشوند. این پروکسی سرور مجموعهای از اتصالات پایدار به دیتابیس را حفظ میکند و درخواستهای کلاینتها را بین آنها توزیع میکند. بدین ترتیب، هزینههای مربوط به ایجاد و حذف اتصالات مکرر کاهش یافته و عملکرد دیتابیس بهبود مییابد. در واقع کلاینتها به یک پروکسی متصل میشوند و این پروکسی اتصالات را به دیتابیس مدیریت میکند.
PgBouncer چیست؟
PgBouncer یک connection pooler سبُک و متنباز برای PostgreSQL است که بهعنوان پروکسی بین کلاینتها و دیتابیس عمل میکند. PgBouncer اتصالات را برای هر ترکیب کاربر و دیتابیس نگهداری میکند و آنها را به اتصالات ورودی جدید اختصاص میدهد. هنگامی که اتصال کلاینت بسته میشود، اتصال مجدداً به pool برمیگردد. این ابزار از پروتکلهای TCP و Unix domain sockets برای ارتباط با کلاینتها پشتیبانی میکند. همچنین، PgBouncer میتواند روی نود کلاینت، سرور دیتابیس یا به عنوان خوشهای مستقل پیادهسازی شود.

مزایای استفاده از PgBouncer
استفاده از PgBouncer مزایای متعددی دارد:
- کاهش بار روی دیتابیس: با مدیریت اتصالات، PgBouncer از ایجاد اتصالات زیاد و مکرر به دیتابیس جلوگیری میکند و در نتیجه بار روی سرور دیتابیس کاهش پیدا میکند.
- بهبود زمان پاسخگویی: با استفاده از یک pool از اتصالات آماده، زمان پاسخگویی به درخواستها کاهش مییابد و اپلیکیشنها سریعتر عمل میکنند.
- مقیاسپذیری بهتر: PgBouncer به دیتابیس اجازه میدهد تا تعداد بیشتری از اتصالات کلاینتها را بدون افزایش فشار روی منابع سرور مدیریت کند.
- کارایی بالاتر: با کاهش سربار ایجاد و حذف اتصالات، عملکرد کلی سیستم بهبود مییابد.
نصب و پیکربندی PgBouncer
نصب PgBouncer بسیار آسان است. شما میتوانید آن را با استفاده از دستورات زیر در سیستم عاملهای مختلف نصب کنید:
# RedHat/CentOS/..
$ sudo yum install pgbouncer
# Debian/Ubuntu/..
$ sudo apt-get install pgbouncer
PgBouncer بر اساس یک فایل پیکربندی اصلی کار میکند که معمولاً در مسیر /etc/pgbouncer/pgbouncer.ini قرار دارد. در این فایل، شما میتوانید تنظیمات مربوط به اتصالات دیتابیس، کاربران مجاز و سایر پارامترها را پیکربندی کنید. در فایل pgbouncer.ini، موارد زیر را تنظیم کنید:
- بخش databases: مشخص کردن مشخصات اتصال به دیتابیس PostgreSQL، مانند host، port و نام دیتابیس.
- بخش pgbouncer: تنظیم پارامترهایی مانند listen_addr (آدرس IP که PgBouncer به آن گوش میدهد)، listen_port (شماره پورتی که PgBouncer به آن گوش میدهد)، auth_file (فایل حاوی نام کاربری و رمز عبور کاربران مجاز) و admin_users (کاربران ادمین).
- تنظیمات مربوط به نحوه مدیریت poolها: مانند pool_mode که تعیین میکند اتصال چه زمانی به pool برگردانده شود.
- تنظیم محدودیت اتصال: مانند max_client_conn که تعداد کل کلاینتهایی که میتوانند به PgBouncer متصل شوند را مشخص میکند.
- تنظیمات احراز هویت: مانند auth_type که تعیین میکند چگونه کاربران احراز هویت شوند.
- تعیین کاربرهای ادمین: در بخش admin_users میتوان کاربرهایی را مشخص کرد که اجازه تغییر تنظیمات PgBouncer را دارند.
- فایل userlist.txt: در این فایل، نام کاربری و هش رمز عبور کاربران مجاز برای اتصال به PgBouncer را ذخیره میکنید. برای ایجاد هش رمز عبور میتوانید از دستورات مربوط به سیستم عامل استفاده کنید.
پس از پیکربندی PgBouncer، میتوانید آن را بهعنوان یک سرویس systemd راهاندازی کنید یا بهصورت دستی اجرا کنید. برای اعمال تغییرات در تنظیمات، میتوانید از دستور sudo service pgbouncer restart استفاده کنید.
نحوه اتصال به دیتابیس از طریق PgBouncer
پس از نصب و پیکربندی PgBouncer، کلاینتها به جای اتصال مستقیم به پورت پیشفرض PostgreSQL (5432)، به پورت PgBouncer (معمولاً 6432) متصل میشوند. به عنوان مثال، برای اتصال با استفاده از psql:
psql -U your_username -p 6432 -h your_host your_database
PgBouncer اتصالات را به pool دیتابیس هدایت میکند و درخواستهای شما را اجرا میکند.
مدیریت و مانیتورینگ PgBouncer
PgBouncer امکانات مدیریتی و مانیتورینگ متعددی را ارائه میدهد. کاربران ادمین میتوانند به یک دیتابیس مجازی به نام «pgbouncer» متصل شده و دستورات مختلفی را برای کنترل سرور و مشاهده آمار صادر کنند. برخی از این دستورات عبارتند از:
- RELOAD: بارگیری مجدد تنظیمات PgBouncer
- DISABLE db1: غیرفعال کردن دیتابیس db1
- ENABLE db1: فعال کردن دیتابیس db1
- SHOW FDS: نمایش فایل دسکریپتورهای باز
- SHOW POOLS: نمایش آمار مربوط به poolها
- مشاهده آمار مربوط به هر دیتابیس: شامل زمان اجرای کوئریها و زمان انتظار کلاینتها.
- مشاهده آمار مربوط به هر pool: شامل تعداد کلاینتهای فعال و منتظر و تعداد اتصالات سرور فعال و غیرفعال.
این امکانات به شما کمک میکنند تا عملکرد PgBouncer را مانیتور کرده و در صورت لزوم تغییراتی اعمال کنید.
تست عملکرد PgBouncer
برای مقایسه عملکرد دیتابیس با و بدون PgBouncer، میتوانید از ابزار pgbench استفاده کنید. این ابزار به شما امکان میدهد تا تعداد زیادی کلاینت را شبیهسازی کرده و عملکرد دیتابیس را تحت بار زیاد بررسی کنید.
نتایج تست نشان میدهد که استفاده از PgBouncer باعث کاهش میانگین زمان پاسخگویی و افزایش تعداد تراکنشهای در ثانیه میشود. در واقع، زمانی که تعداد کلاینتها زیاد است و سرور دیتابیس نمیتواند همه آنها را مدیریت کند، PgBouncer میتواند بهخوبی به مدیریت اتصالات کمک کند و جلوی بروز خطا را بگیرد. همچنین، PgBouncer میتواند سربار مربوط به ایجاد اتصالات جدید را کاهش دهد و در نتیجه عملکرد کلی سیستم را بهبود بخشد.
سناریوهای پیادهسازی PgBouncer
PgBouncer را میتوان در سناریوهای مختلفی پیادهسازی کرد:
- روی node سرور دیتابیس: در این حالت، PgBouncer روی همان سروری نصب میشود که PostgreSQL نصب شده است. کلاینتها به جای اتصال مستقیم به پورت PostgreSQL، به پورت PgBouncer متصل میشوند.
- روی نود کلاینت: در این حالت، PgBouncer روی هر نود کلاینت نصب میشود. به عنوان مثال، هر نود وب که با PHP کار می کند میتواند به یک PgBouncer محلی متصل شود.
- بهعنوان یک خوشه مستقل: در این حالت، مجموعهای از نودهای PgBouncer مستقل در یک خوشه قرار میگیرند و با یک load balancer مانند HAProxy در دسترس قرار میگیرند. این روش بیشترین انعطاف پذیری را دارد ولی پیچیدگی بیشتری نیز دارد.
جمعبندی
PgBouncer ابزاری قدرتمند و کارآمد برای connection pooling در PostgreSQL است. با استفاده از این ابزار، میتوانید بار روی سرور دیتابیس خود را کاهش داده و عملکرد اپلیکیشنهایتان را بهبود ببخشید. نصب و پیکربندی PgBouncer بسیار ساده است و مزایای متعددی را به همراه دارد. اگر شما نیز با مشکل اتصالات زیاد به دیتابیس PostgreSQL مواجه هستید، حتماً استفاده از PgBouncer را در نظر بگیرید.
با استفاده از امکانات مانیتورینگ PgBouncer میتوانید عملکرد آن را بهطور مداوم بررسی کنید و از تاثیر مثبت آن بر عملکرد اپلیکیشن خود اطمینان حاصل کنید. همانطور که دیدید، این ابزار برای هر پروژهای که از PostgreSQL استفاده میکند مفید است و میتواند کمک شایانی به بهبود کارایی دیتابیس و در نتیجه کارایی نرم افزار شما بکند.