سلام
امیدوارم خوب باشید.
اگر پست های قبلی رو ندیدید توصیه میکنم حتما یه سر بزنید که توی درک این پست بهتون کمک بکنه.
گام اول تولید فایل های certificate هست که با openssl میسازیمشون
# Generate the root CA key and certificate openssl genpkey -algorithm RSA -out rootCA.key -pkeyopt rsa_keygen_bits:2048 openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt -subj "/CN=My Root CA"
# Generate the server key and CSR (Certificate Signing Request) openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048 openssl req -new -key server.key -out server.csr -subj "/CN=myserver.com"
# Sign the server CSR with the root CA certificate to get the server certificate openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256
بعد از ساختن فایل ها باید دسترسی فایل ها رو ادیت بکنیم.
ما میخوایم از فایل های rootCA.crt و server.crt و server.key استفاده بکنیم.
فایل server.key فقط باید دسترسی خوندن و نوشتن توسط یوزرش رو داشته باشه که میشه کد ۶۰۰ و دو فایل server.crt و rootCA.crt علاوه بر اون باید دسترسی خوندن توسط بقیه رو هم داشته باشن که کدش میشه ۶۴۴.
همچنین ما باید owner فایل ها رو هم درست بکنیم . اگر داخل کانتینتر بخوایم استفاده بکنیم از یوزر postgres چون استفاده میشه باید فایل ها رو برای postgres بکنیم.
من این سرتیفیکیت ها رو داخل پوشه ssl درون /var/lib/postgresql/data قرار میدم.
chown -R postgres:postgres /var/lib/postgresql/data/ssl/
chmod 600 /var/lib/postgresql/data/ssl/server.key
chmod 644 /var/lib/postgresql/data/ssl/server.crt /var/lib/postgresql/data/ssl/rootCA.crt
نوبت به تنظیمات postgresql.conf میرسه
ما باید قسمت ssl رو ویرایش بکنیم.
ssl = on
ssl_cert_file = '/var/lib/postgresql/data/ssl/server.crt'
ssl_key_file = '/var/lib/postgresql/data/ssl/server.key'
ssl_ca_file = '/var/lib/postgresql/data/ssl/rootCA.crt'
ریستارت میکنیم
حالا باید تنظیمات رپلیکا رو ادیت بکنیم.
باید primary_conninfo مربوط به رپلیکا رو ویرایش کنیم. اگر از سوییچ -R استفاده کرده بودید این تنظیمات در فایل postgresql.auto.conf ذخیره شده و باید اونجا رو ادیت بکنید.
باید پارامتر sslmode و sslrootcert رو اضافه بکنیم. sslmode باید مقدار require رو بگیره و sslrootcert ادرس فایل rootCA.crt که در مرحله قبل ساختیم هستش.
خب کارمون اینجا تموم شد . فقط کافیه ریستش بکنیم. اگر مجدد کوئری pg_stat_replication رو بگیریم. خواهیم دید که ادرس فایل و تنظیماتی که گذاشتیم رو نمایش میده
من اینجا به صورت خلاصه داستان ssl رو توضیح دادم و اگر میخواستم تمام کد هاش رو بزارم تمام توضیحات بخش اول رو باید تکرار میکردم.
توی پست قبل درباره اینکه چجوری یه سرور رپلیکا رو قابل نوشتن بکنیم و تبدیلش بکنیم به پرایمری صحبت شد. حالا فرض کنید مثلا ما یک سرور پرایمری داریم و دو تا سرور رپلیکا . فرض کنیم سرور پرایمری به مشکل میخوره. ما باید یکی از رپلیکا ها رو جایگزین بکنیم و رپلیکا دوم رو ادرس پرایمری کانکشن رو عوض بکنیم به رپلیکایی که پرایمری شده.
حالا فرض کنید سرور پرایمری مجدد در دسترس قرار گرفته ولی الان قابل استفاده نیست چون دیتاش قدیمی شده. اگر تفاوتی بین این سرور ها نباشه کاری که باید بکنیم اینه که سروری که قبلا پرایمری بوده تبدیل به رپلیکا بشه و بقیه سرور ها هم به روال قبل به کارشون ادامه بدن. اگر تفاوتی باشه باید دوباره اون ترکیب قبلی رو درست بکنیم و اول سرور پرایمری رپلیکا میشه و مجدد تبدیلش میکنیم به سرور پرایمری.
با توجه به یوزکیسی که من توی پست اول گفتم من هیچ وقت نیاز به استفاده همزمان از دیتابیس هام نداشتم ولی زمانی که ما میایم رپلیکا ایجاد میکنیم برای دیتابیس یکی از مهم ترین استفاده هاش همینه که عملیات read توسط رپلیکا ها انجام بشه.
بستگی به دیزاین سیستم ممکنه نحوه استفاده از رپلیکا ها متفاوت باشه. مثلا فرض کنید ما بخوایم چند تا اپلیکیشن توی چند تا دیتاسنتر داشته باشیم و به ازای هر دیتاسنتری که اپلیکیشنمون دیپلوی شده یه رپلیکا دیتابیس ساخته باشیم.
توی حالت بالا قاعدتا ما نیاز نداریم که لود بالانس داشته باشیم فقط ادرس سرور پرایمری رو باید جدا داخل اپلیکیشن هامون تعریف بکنیم که عملیات نوشتن رو به اون سرور بزنیم و برای خوندن از سرور های داخل هر دیتاسنتر استفاده بکنیم.
حالا فرض کنید کلا ما یه دیتاسنتر داریم ولی به خاطر حجم زیاد دیتا و همچنین بالابردن دسترسی پذیری رپلیکا اضافه کردیم. توی این سناریو رپلیکا به ما کمک میکنه لود از روی سرور پرایمری برداشته بشه و توزیع بشه بین چند تا سرور.
توی سناریو بالا ما نیاز به یک لود بالانسر داریم که ترافیک رو پخش بکنه. از haproxy برای اینکار استفاده میکنیم. برای اینکار حتما باید پورت های read و write متفاوت باشه چون تا جایی که میدونم haproxy نمیتونه تفکیک بکنه که چه ریکوئستی باید به پرایمری بری و چه ریکوئستی به رپلیکا.
لینک های پایین مفصل در مورد healthcheck و شرایط مختلف توضیح داده که من شاید توی پست جداگونه مفصل تستشون کردم.