Replication — Streaming Replication, asoslar
Production serverda bitta PostgreSQL. Server ishdan chiqsa — ilova to'xtaydi. Yoki o'qish so'rovlari juda ko'p — bitta server yetmayapti.
Replication — ma'lumotni real vaqtda boshqa serverga nusxalash. Birida xato bo'lsa — ikkinchisi ishlaydi.
Replication nima?
Primary (yozish) ──WAL──► Standby (o'qish)
↓ o'zgarishlar ↓ nusxa
yoziladi olinadi
Primary — yozish va o'qish. Standby — faqat o'qish (yoki failover uchun).
Streaming Replication
WAL (Write-Ahead Log) fayllarini real vaqtda standby ga uzatish:
Primary serverni sozlash
postgresql.conf:
wal_level = replica
max_wal_senders = 3
pg_hba.conf:
host replication replication_user standby_ip/32 md5
-- Replication foydalanuvchisi
CREATE USER replication_user WITH REPLICATION PASSWORD 'parol';
Standby serverni sozlash
# Primary dan nusxa olish
pg_basebackup -h primary_ip -U replication_user \
-D /var/lib/postgresql/data -P -Xs -R
# -R — standby.signal va postgresql.auto.conf yaratadi
# postgresql.auto.conf (avtomatik)
primary_conninfo = 'host=primary_ip user=replication_user password=parol'
Standby ni ishga tushirish:
pg_ctlcluster 16 main start
Replikatsiya holati
Primary da:
SELECT client_addr, state, sent_lsn, write_lsn, replay_lsn, sync_state
FROM pg_stat_replication;
-- state: streaming — normal ishlayapti
-- replay_lsn — standby qancha orqada
Standby da:
SELECT now() - pg_last_xact_replay_timestamp() AS lag;
-- Standby qancha orqada (soniyalar)
Failover — standby ni primary ga aylantirish
Primary ishdan chiqqanda:
# Standby ni promote qilish
pg_ctlcluster 16 main promote
# yoki
touch /var/lib/postgresql/data/failover.signal
Endi standby yozish ham qabul qiladi. Ilova connection string ni yangi primary ga o'zgartiradi.
Read replica — o'qishni taqsimlash
Hisobot so'rovlari read replica ga yuboriladi — primary yukini kamaytiradi:
const primaryPool = new Pool({ host: 'primary' }); // yozish
const replicaPool = new Pool({ host: 'replica' }); // o'qish
// Yozish — primary
await primaryPool.query('INSERT INTO orders ...');
// O'qish (hisobot) — replica
const { rows } = await replicaPool.query('SELECT * FROM orders WHERE ...');
Tez-tez uchraydigan xatolar
Replikatsiya lag — kechikish:
Sekin tarmoq yoki ko'p yozish — standby orqada qoladi. Kritik o'qishlar primary dan olinsin.
Standby ni o'qish uchun ulanishni unutish:
-- Standby da yozishga urinish
INSERT INTO ... -- ERROR: cannot execute INSERT in a read-only transaction
Xulosa
Streaming Replication:
Primary → WAL → Standby
Primary → yozish va o'qish
Standby → faqat o'qish (read replica)
→ failover uchun zaxira
Sozlash:
wal_level = replica
max_wal_senders = 3
pg_basebackup + standby.signal
Monitoring:
pg_stat_replication — primary da lag ko'rish
Keyingi dars
57-dars: Monitoring — pg_stat_activity, pg_stat_statements, slow queries