وصال دانشور
وصال دانشور
خواندن ۴ دقیقه·۳ ماه پیش

رپلیکا دیتابیس - قسمت سوم - پستگرس

سلام

امیدوارم خوب باشید.

اگر پست های قبلی رو ندیدید توصیه میکنم حتما یه سر بزنید که توی درک این پست بهتون کمک بکنه.

https://virgool.io/@vessaldaneshvar/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D8%AC%D8%A7%D8%A8%D8%AC%D8%A7%DB%8C%DB%8C-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-%D8%A8%D8%A7-%D8%B1%D9%BE%D9%84%DB%8C%DA%A9%D8%A7-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-ayuvddolvrb1
https://virgool.io/@vessaldaneshvar/%D8%B1%D9%BE%D9%84%DB%8C%DA%A9%D8%A7-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-sync-%D9%88-async-szepu7psjp8y




مواردی که داخل این پست بررسی میکنیم.

  • اضافه کردن ssl
  • سناریوی رفتن و برگشتن از رپلیکا به پرایمری
  • لود بالانس


اضافه کردن ssl

گام اول تولید فایل های 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 &quot/CN=My Root CA&quot
# 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 &quot/CN=myserver.com&quot
# 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 رو توضیح دادم و اگر میخواستم تمام کد هاش رو بزارم تمام توضیحات بخش اول رو باید تکرار میکردم.

سناریوی رفتن و برگشتن از رپلیکا به پرایمری

توی پست قبل درباره اینکه چجوری یه سرور رپلیکا رو قابل نوشتن بکنیم و تبدیلش بکنیم به پرایمری صحبت شد. حالا فرض کنید مثلا ما یک سرور پرایمری داریم و دو تا سرور رپلیکا . فرض کنیم سرور پرایمری به مشکل میخوره. ما باید یکی از رپلیکا ها رو جایگزین بکنیم و رپلیکا دوم رو ادرس پرایمری کانکشن رو عوض بکنیم به رپلیکایی که پرایمری شده.

حالا فرض کنید سرور پرایمری مجدد در دسترس قرار گرفته ولی الان قابل استفاده نیست چون دیتاش قدیمی شده. اگر تفاوتی بین این سرور ها نباشه کاری که باید بکنیم اینه که سروری که قبلا پرایمری بوده تبدیل به رپلیکا بشه و بقیه سرور ها هم به روال قبل به کارشون ادامه بدن. اگر تفاوتی باشه باید دوباره اون ترکیب قبلی رو درست بکنیم و اول سرور پرایمری رپلیکا میشه و مجدد تبدیلش میکنیم به سرور پرایمری.

replica migration
replica migration


لود بالانسینگ

با توجه به یوزکیسی که من توی پست اول گفتم من هیچ وقت نیاز به استفاده همزمان از دیتابیس هام نداشتم ولی زمانی که ما میایم رپلیکا ایجاد میکنیم برای دیتابیس یکی از مهم ترین استفاده هاش همینه که عملیات read توسط رپلیکا ها انجام بشه.

بستگی به دیزاین سیستم ممکنه نحوه استفاده از رپلیکا ها متفاوت باشه. مثلا فرض کنید ما بخوایم چند تا اپلیکیشن توی چند تا دیتاسنتر داشته باشیم و به ازای هر دیتاسنتری که اپلیکیشنمون دیپلوی شده یه رپلیکا دیتابیس ساخته باشیم.

multi-datacenter
multi-datacenter

توی حالت بالا قاعدتا ما نیاز نداریم که لود بالانس داشته باشیم فقط ادرس سرور پرایمری رو باید جدا داخل اپلیکیشن هامون تعریف بکنیم که عملیات نوشتن رو به اون سرور بزنیم و برای خوندن از سرور های داخل هر دیتاسنتر استفاده بکنیم.

حالا فرض کنید کلا ما یه دیتاسنتر داریم ولی به خاطر حجم زیاد دیتا و همچنین بالابردن دسترسی پذیری رپلیکا اضافه کردیم. توی این سناریو رپلیکا به ما کمک میکنه لود از روی سرور پرایمری برداشته بشه و توزیع بشه بین چند تا سرور.

load balancer
load balancer


توی سناریو بالا ما نیاز به یک لود بالانسر داریم که ترافیک رو پخش بکنه. از haproxy برای اینکار استفاده میکنیم. برای اینکار حتما باید پورت های read و write متفاوت باشه چون تا جایی که میدونم haproxy نمیتونه تفکیک بکنه که چه ریکوئستی باید به پرایمری بری و چه ریکوئستی به رپلیکا.

لینک های پایین مفصل در مورد healthcheck و شرایط مختلف توضیح داده که من شاید توی پست جداگونه مفصل تستشون کردم.

https://severalnines.com/blog/postgresql-load-balancing-using-haproxy-keepalived/
https://www.alibabacloud.com/blog/postgresql-haproxy-proxy-for-ha-and-load-balance_597618
https://www.adamzwakk.com/guides/postgres-repl-load-backups/


پستگرسssl
دانشجوی ارشد بهینه سازی، گیک ، فعال در حوزه تحلیل داده ، عاشق دنیای کامپیوتر ها
شاید از این پست‌ها خوشتان بیاید