WIUNIX ACADEMY
رپلیکیشن PostgreSQL با Patroni؛ quorum، جابهجایی و بازیابی امن
صفحهٔ 3 از 6؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من11 مقدار قابلتغییر
قدم بعدی
تنظیم نود را بسازید و رمزها را خصوصی وارد کنید
این پنل فقط برای pg1 است؛ آرگومان انتهایی را روی pg2 به 2 و روی pg3 به 3 تغییر دهید. فهرست IP کلاستر را تغییر ندهید. در ویرایشگر حفاظتشده، هر چهار sentinel با پیشوند REPLACE را با رمزهای قوی و مستقل جایگزین کنید؛ رمز هر نقش در سه نود یکسان باشد. superuser در این آزمایش برای rewind هم دسترسی بالا دارد؛ تولید به طراحی جداگانه با حداقل دسترسی نیاز دارد. Patroni نقش LOGIN با مجوز REPLICATION میسازد؛ این نقش نباید superuser برنامه باشد. فایل حاوی رمز است؛ آن را چاپ، commit یا پیوست تیکت نکنید.
ماشین آزمایشی پایگاه داده؛ Bash با دسترسی مدیر
set -eu
sudo -u postgres python3 '/srv/academy-pg18/make-config.py' 1
sudo -u postgres nano '/srv/academy-pg18/patroni.yml'
sudo -u postgres patroni --validate-config '/srv/academy-pg18/patroni.yml'
فقط تنظیم تازه ساخته شده، همهٔ sentinelها خصوصی جایگزین و validation موفق است؛ دیتابیس هنوز روشن نشده است.
قدم بعدی
unit اختصاصی etcd را ذخیره کنید
unit بعدی را روی هر VM ذخیره کنید. این سرویس و مسیر داده مخصوص آزمایش است و سرویس etcd توزیع استفاده نمیشود. شروع کلاستر تازه، مسیر DCS انتخابشده را مقداردهی اولیه میکند؛ حالت new برای DCS موجود یا بازیابیشده مناسب نیست.
ماشین آزمایشی پایگاه داده؛ Bash با دسترسی مدیر
sudo nano /etc/systemd/system/academy-pg-etcd.service
unit کامل زیر ذخیره شود.
قدم بعدی
فایل: سرویس etcd
توقف این unit فقط همین رأیدهنده را متوقف میکند. در کلاستر سالم سهعضوی، توقف یکی اکثریت را حفظ میکند؛ توقف همزمان دو عضو quorum را از بین میبرد.
ماشین آزمایشی پایگاه داده؛ Bash با دسترسی مدیر
[Unit]
Description=Academy isolated PostgreSQL lab DCS
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=postgres
Group=postgres
UMask=0077
ExecStart=/opt/academy-etcd-3.7.2/etcd --config-file=/srv/academy-pg18/etcd.yml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
unit به باینری بررسیشده و تنظیم اختصاصی اشاره دارد.
قدم بعدی
ابتدا فقط سه رأیدهنده را روشن کنید
روی هر سه VM اجرا کنید و سپس پنل مدیر را به کار ببرید. تا سلامت endpoint، عضویت، TLS و دسترسی محدود تأیید نشده، Patroni را شروع نکنید. لاگ ممکن است آدرس خصوصی داشته باشد؛ محلی بررسی کنید.
ماشین آزمایشی پایگاه داده؛ Bash با دسترسی مدیر
sudo systemctl daemon-reload
sudo systemctl start academy-pg-etcd.service
sudo systemctl status academy-pg-etcd.service --no-pager
sudo journalctl -u academy-pg-etcd.service -n 40 --no-pager
سه رأیدهنده با TLS روشناند و PostgreSQL آزمایش هنوز اجرا نشده است.
قدم بعدی
دسترسی Patroni را به prefix خودش محدود کنید
فقط یکبار از shell حفاظتشدهٔ مدیر روی pg1 اجرا کنید. گواهی root.crt/root.key را با PKI خود در پوشهٔ تازهٔ مخصوص مدیر قرار دهید؛ کلید root به postgres داده نشود. کاربر و نقش root برای راهاندازی auth در etcd است. Patroni از gRPC gateway در etcd3 استفاده میکند؛ احراز هویت با CN گواهی در این مسیر ممکن نیست. علاوه بر mTLS، نام کاربری و رمز جداگانهٔ patroni را در فایل حفاظتشده تنظیم کنید. subject CN گواهی کلاینت gateway باید خالی باشد؛ etcd3.7 گواهی دارای CN را در gateway حتی با رمز رد میکند. گواهی مدیر root و peerها هویت خود را نگه میدارند. prefix با اسلش پایانی فقط متعلق به همین کلاستر است. DCS ممکن است فرادادهٔ کلاستر را نگه دارد؛ رمز احراز هویت در آن ذخیره نکنید. این پنل فقط برای DCS خالی است؛ وجود کاربران قبلی مانع ادامه است. پیش از RBAC نیز mTLS فعال است.
ماشین آزمایشی پایگاه داده؛ Bash با دسترسی مدیر
set -eu
sudo install -d -m 0700 '/srv/academy-pg18/admin'
# Provision root.crt and root.key here using the protected PKI channel.
sudo chmod 0600 '/srv/academy-pg18/admin/root.key'
dcs_admin() {
sudo env ETCDCTL_ENDPOINTS='https://10.77.18.11:2379,https://10.77.18.12:2379,https://10.77.18.13:2379' ETCDCTL_CACERT='/srv/academy-pg18/tls/ca.crt' ETCDCTL_CERT='/srv/academy-pg18/admin/root.crt' ETCDCTL_KEY='/srv/academy-pg18/admin/root.key' /opt/academy-etcd-3.7.2/etcdctl "$@"
}
dcs_admin endpoint health
dcs_admin member list --write-out=table
dcs_admin user list
dcs_admin user add root --no-password
dcs_admin role add root
dcs_admin user grant-role root root
dcs_admin role add academy-pg
dcs_admin role grant-permission academy-pg readwrite '/academy/academy_pg18/' --prefix=true
# Interactive: enter the DCS password also saved in the protected Patroni file.
dcs_admin user add patroni
dcs_admin user grant-role patroni academy-pg
dcs_admin auth enable
dcs_admin endpoint health
سه member ID سالم، auth فعال و دسترسی Patroni محدود به prefix تازه است.
قدم بعدی
پیش از bootstrap هویت محدود را امتحان کنید
روی pg1 با همان هویت سیستمعامل Patroni اجرا کنید. پیش از bootstrap، prefix خالی است. رمز DCS را در prompt هر فرمان وارد کنید. خواندن دوم باید با permission denied شکست بخورد. موفق شدن دسترسی بیرون prefix نقص مسدودکننده است؛ ادامه ندهید. این راهنما etcd3 دارد و تنظیم یا کلیدهای etcd v2 جایگزین آن نیستند.
ماشین آزمایشی پایگاه داده؛ Bash با دسترسی مدیر
sudo -u postgres env ETCDCTL_ENDPOINTS='https://10.77.18.11:2379' ETCDCTL_CACERT='/srv/academy-pg18/tls/ca.crt' ETCDCTL_CERT='/srv/academy-pg18/tls/patroni.crt' ETCDCTL_KEY='/srv/academy-pg18/tls/patroni.key' /opt/academy-etcd-3.7.2/etcdctl --user=patroni get '/academy/academy_pg18/' --prefix
sudo -u postgres env ETCDCTL_ENDPOINTS='https://10.77.18.11:2379' ETCDCTL_CACERT='/srv/academy-pg18/tls/ca.crt' ETCDCTL_CERT='/srv/academy-pg18/tls/patroni.crt' ETCDCTL_KEY='/srv/academy-pg18/tls/patroni.key' /opt/academy-etcd-3.7.2/etcdctl --user=patroni get /outside-academy-scope
خواندن اول موفق و خالی؛ خواندن دوم permission denied است.