زیر کاپوت پستگرس
وقتی میگوییم «سرور PostgreSQL» در واقع منظورمان یک کلاستر است: یک پوشهی داده (data directory) که یک پروسهی اصلی به نام postmaster روی یک پورت آن را سرویس میدهد. یک کلاستر چند database دارد، هر database چند schema و هر schema جدولها و ویوها و توابع. roleها (کاربران) در سطح کلاستر تعریف میشوند و در همهی دیتابیسها مشترکاند.
مدل پروسه
برای هر اتصال کلاینت، postmaster یک پروسهی جدید (backend) fork میکند. هر backend چند مگابایت حافظهی خصوصی دارد؛ به همین دلیل هزار اتصال همزمان برای پستگرس سنگین است و در فصل ۷ PgBouncer را میبینیم. در کنار backendها پروسههای پسزمینه کار میکنند:
| پروسه | وظیفه |
|---|---|
| checkpointer | صفحههای تغییرکردهی حافظه را در فواصل منظم روی دیسک مینویسد |
| background writer | نوشتن تدریجی صفحههای کثیف تا backendها معطل نشوند |
| walwriter | نوشتن Write-Ahead Log؛ ضامن دوام تراکنش پس از commit |
| autovacuum launcher | راهاندازی workerهای VACUUM و ANALYZE |
| walsender / walreceiver | ارسال و دریافت WAL در Replication |
هر تغییر اول در WAL (پوشهی pg_wal) ثبت میشود و بعد در فایل جدول. اگر برق برود، هنگام بالا آمدن WAL دوباره اجرا میشود. بکاپ فیزیکی و Replication هم هر دو روی همین WAL سوارند.
دو فایل پیکربندی اصلی
postgresql.conf رفتار سرور را تعیین میکند و pg_hba.conf میگوید چه کسی از کجا و با چه روشی حق اتصال دارد. پستگرس pg_hba را از بالا به پایین میخواند و اولین خط منطبق تصمیم میگیرد.
# postgresql.conf
listen_addresses = 'localhost,10.0.0.5' # پیشفرض فقط localhost
port = 5432
password_encryption = scram-sha-256
ssl = on
timezone = 'UTC'
# pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all scram-sha-256
hostssl carpet app_user 10.0.0.0/24 scram-sha-256
host all all 0.0.0.0/0 reject
peer یعنی نام کاربر سیستمعامل باید با نام role یکی باشد (فقط برای اتصال سوکت محلی)؛ scram-sha-256 روش امن رمز است و از نسخهی 14 پیشفرض است. md5 قدیمی و در نسخهی 18 منسوخ اعلام شده است.
SHOW config_file;
SHOW hba_file;
SELECT name, setting, unit, context FROM pg_settings WHERE name IN ('shared_buffers','work_mem');
ALTER SYSTEM SET log_min_duration_statement = '500ms';
SELECT pg_reload_conf();
SELECT line_number, type, database, user_name, auth_method, error FROM pg_hba_file_rules;
نکتههایی که کمتر کسی میداند
- ستون
contextدر pg_settings میگوید تغییر چه لازم دارد:postmasterیعنی restart،sighupیعنی reload کافی است،userیعنی در هر نشست با SET قابل تغییر است. ALTER SYSTEMدر فایلpostgresql.auto.confمینویسد که بعد از postgresql.conf خوانده میشود و بر آن غلبه میکند؛ اگر تغییرتان در conf اثر نمیکند، اول این فایل را ببینید.- قبل از reload، نمای
pg_hba_file_rulesخطاهای نحوی pg_hba را در ستون error نشان میدهد؛ یک خط اشتباه میتواند همه را پشت در نگه دارد. - ترتیب خطوط pg_hba مهم است: یک خط
host all all 0.0.0.0/0 rejectبالای بقیه، همهی اتصالهای TCP را میبندد حتی اگر پایینتر خط مجاز داشته باشید. - برای تغییر رمز postgres بعد از عوض کردن روش به scram، رمز را دوباره با
\passwordدر psql تنظیم کنید؛ هش md5 قدیمی با scram قابل تأیید نیست.