WIUNIX ACADEMY
PgBouncer در حالت تراکنشی؛ بررسی سازگاری برنامه و صف اتصال
صفحهٔ 2 از 3؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من5 مقدار قابلتغییر
ظرفیت را برای مجموع همهٔ اتصالها حساب کنید
default_pool_size سقف کل اتصالها نیست؛ برای هر زوج database و user اعمال میشود. poolهای ذخیره، اتصال مستقیم مدیریت و برنامههای دیگر را نیز حساب کنید و برای رسیدگی به خطا ظرفیت خالی بگذارید.
کلاینتی که داخل تراکنش بیکار مانده، اتصال سمت سرور را اشغال میکند. افزایش تعداد اتصالها ممکن است رقابت CPU و دیسک را بیشتر کند، بیآنکه خروجی مفید بالا برود. پیش از افزایش ظرفیت، مدت تراکنشها، انتظار در صف و میزان اشباع دیتابیس را ببینید.
قدم بعدی
از تنظیمات نسخهٔ خصوصی بگیرید و فقط مسیر مجاز را تغییر دهید
این مرحله با مسئول مجاز تغییر تنظیمات روی میزبان PgBouncer انجام میشود. اگر نسخهٔ قبلی از قبل وجود دارد، متوقف شوید تا روی شواهد قبلی ننویسید. قطعهٔ بعدی نمونهٔ مقدارهاست، نه فایلی برای جایگزینی کل تنظیمات.
در یک نمونهٔ اختصاصیِ آزمایش میتوانید تنظیم سراسری را بررسی کنید. اگر نمونه مشترک است، تغییر pool_mode میتواند مسیرهای بدون تنظیم اختصاصی را هم درگیر کند؛ آن را بدون تعیین دامنه اعمال نکنید. حساب، TLS، listener و تنظیمات نامرتبط را حفظ کنید و مجوز فایل را برای آسانشدن ویرایش عوض نکنید.
میزبان PgBouncer آزمایشی؛ مسئول مجاز تغییر تنظیمات
test ! -e '/etc/pgbouncer/pgbouncer.ini.before-transaction' || exit 1
(umask 077; cp --no-preserve=mode -- '/etc/pgbouncer/pgbouncer.ini' '/etc/pgbouncer/pgbouncer.ini.before-transaction') || exit 1
nano '/etc/pgbouncer/pgbouncer.ini'نسخهٔ قبل محفوظ است و فقط تنظیمات همان نمونه یا مسیر آزمایشی ویرایش شدهاند.
این مقدارها را در بخش موجود ادغام کنید
کلیدها را داخل بخش pgbouncer فعلی قرار دهید؛ بخش تکراری نسازید. ظرفیت غیرصفر، رهگیری دستورهای آماده در پروتکل را فعال میکند. اگر برای user یا database مقدار جدا دارید، نتیجهٔ مؤثر را پس از بارگذاری مجدد از خود سرویس بخوانید. تعداد اتصالها نیز باید با محاسبهٔ بخش قبل سازگار باشد.
[pgbouncer]
pool_mode = transaction
max_prepared_statements = 100
default_pool_size = 10قدم بعدی
تنظیم را دوباره بارگذاری و نتیجه را از سرویس بخوانید
با اتصال مدیریتی موجود RELOAD را درخواست کنید و سپس تنظیمات و poolها را ببینید. موفقیت RELOAD به معنی تازهشدن چرخهٔ همهٔ connectionهای برنامه نیست. اگر برنامه نیاز به بستن و ساختن دوبارهٔ pool خود دارد، این کار را فقط در محیط آزمایش و از مسیر معمول همان برنامه انجام دهید.
خطای تنظیمات در لاگ خصوصی PgBouncer را پیش از آزمون درایور برطرف کنید؛ مشاهدهٔ فایل روی دیسک، شاهد اعمالشدن تغییر نیست.
رایانهٔ مدیریت محیط آزمایشی
/usr/lib/postgresql/18/bin/psql -X -v ON_ERROR_STOP=1 'service=academy_pool_admin' -c 'RELOAD;' -c 'SHOW CONFIG;' -c 'SHOW DATABASES;' -c 'SHOW POOLS;'مسیر منتخب در حالت تراکنشی است و ظرفیت رهگیری دستورهای آماده در تنظیم مؤثر، صفر نیست.
قدم بعدی
دستور آماده را با همان نوع درایور برنامه آزمایش کنید
این نمونه با Psycopg 3.2 یا جدیدتر، PgBouncer 1.22 یا جدیدتر و libpq 17 یا جدیدتر در کلاینت آماده اجرا میشود. ابتدا نسخهٔ واقعی را چاپ میکند؛ با ترکیب قدیمیتر ادامه ندهید. کد فقط یک عبارت خواندنی و پارامتردار را چند بار آماده و اجرا میکند و شناسهٔ پردازش سمت سرور را میگیرد.
ثابتماندن PID در بار کم خطا نیست؛ ممکن است همان اتصال دوباره آزاد شده باشد. موفقیت این نمونه نیز سازگاری کل برنامه را ثابت نمیکند. تراکنشهای همزمان، نوع پارامترها، تغییر schema، بازیافت اتصال و مسیر خطای برنامه را جدا بسنجید. اجرای PREPARE در psql جای آزمون پروتکلِ درایور را نمیگیرد.
کلاینت آزمایشی برنامه با درایور سازگارِ نصبشده
python3 - <<'PY'
import psycopg
from psycopg import pq
print("Psycopg", psycopg.__version__, "libpq", pq.version())
assert pq.version() >= 170000, "This recipe requires libpq17+"
with psycopg.connect(service='academy_pool_app', autocommit=True) as c:
for n in range(20):
with c.transaction():
row = c.execute('SELECT pg_backend_pid(), %s::integer + 1', (n,), prepare=True).fetchone()
assert row[1] == n + 1
print(row)
PYهمهٔ نتیجهها درستاند و خطای دستور آمادهٔ گمشده یا تکراری رخ نداده است؛ هنوز آزمون کامل برنامه باقی میماند.
قدم بعدی
صف انتظار را کنار زمان تراکنشها بخوانید
این نماها را هنگام بار کاری شبیه شرایط عادی برنامهٔ آزمایش بخوانید. اگر cl_waiting بالا میرود و اتصالهای سمت سرور مشغولاند، تقاضا از ظرفیت فعلی خدمتدهی بیشتر است. ابتدا تراکنش طولانی و اشباع دیتابیس را پیدا کنید؛ زیادکردن pool پاسخ خودکار نیست.
نرخ و مدت انتظار را در یک بازه مقایسه کنید. تعداد کلاینت یا یک تصویر لحظهای، بهتنهایی میزان کار مفید را نشان نمیدهد. تغییر نوع نتیجهٔ کوئری پس از DDL نیز میتواند نیازمند هماهنگی با برنامه و تازهکردن اتصالهای آن باشد.
رایانهٔ مدیریت محیط آزمایشی
/usr/lib/postgresql/18/bin/psql -X 'service=academy_pool_admin' -c 'SHOW POOLS;' -c 'SHOW STATS;' -c 'SHOW CLIENTS;' -c 'SHOW SERVERS;'برای گلوگاه احتمالی، شواهدی از انتظار صف، اتصالهای فعال و مدت تراکنش در اختیار دارید.