فصل ۱: شروع — نصب، معماری و ابزارها

معماری: کلاستر، پروسه‌ها، postgresql.conf و pg_hba.conf

زیر کاپوت پستگرس

وقتی می‌گوییم «سرور 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 قابل تأیید نیست.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.