Bu qatlamda nima bor
Core darslik asoslarni berdi. Bu Deep qatlam senior darajadagi chuqur mexanikani ochadi: WAL va physical/logical replikatsiya, sinxron commit darajalari va quorum, konsensus (Raft/quorum) bilan xavfsiz failover, Patroni bilan avtomatik HA, multi-primary konflikt yechish, geo-replikatsiya va lag monitoring. Oxirida — yig‘ma HA arxitekturasi va senior cheklist.
Physical vs logical replikatsiya
WAL · logical decodingSenior asos: replikatsiyaning hammasi WAL (Write-Ahead Log) atrofida aylanadi. Postgres har o‘zgarishni avval WAL’ga yozadi (durability uchun) — replikatsiya aynan shu jurnalni uzatadi.
Physical (streaming) replikatsiya
WAL’ning bayt darajasidagi yozuvlari to‘g‘ridan-to‘g‘ri replikaga oqadi. Replika — primary’ning aniq binar nusxasi (xuddi shu fayl bloklari). Tez va oddiy, lekin: butun klaster ko‘chadi (tanlab bo‘lmaydi), bir xil major versiya talab qiladi, replika faqat o‘qishga ochiq (hot standby).
Logical replikatsiya
WAL qatorlar darajasidagi o‘zgarishlarga (INSERT/UPDATE/DELETE) "dekod" qilinadi (logical decoding). Endi jadval tanlab, versiyalar aro, hatto transform bilan replikatsiya qilish mumkin:
-- LOGICAL replikatsiya: jadval darajasida, publish / subscribe
-- primary (publisher):
CREATE PUBLICATION orders_pub FOR TABLE orders, order_items;
-- replica (subscriber):
CREATE SUBSCRIPTION orders_sub
CONNECTION 'host=primary dbname=shop'
PUBLICATION orders_pub;
-- + cross-version, tanlab (subset), transform, ko'p manba -> bitta nishon
-- - DDL va sequence avtomatik ko'chmaydi; sekinroq
| Physical (streaming) | Logical | |
|---|---|---|
| Nima ko‘chadi | WAL baytlari (butun klaster) | Qator o‘zgarishlari (tanlab) |
| Versiya | Bir xil major versiya shart | Versiyalar aro mumkin |
| Replika | Aniq nusxa (read-only) | Mustaqil, yoziladigan ham bo‘lishi mumkin |
| Asosiy ishlatilishi | HA / standby | Selective replikatsiya, upgrade, CDC |
Logical decoding — aynan CDC (Debezium) va Outbox (3-mavzu) ostidagi texnologiya: Debezium Postgres WAL’ni logical decoding orqali o‘qib, o‘zgarishlarni Kafka’ga oqizadi. Demak bitta mexanizm — ham replikatsiya, ham event oqimi uchun.
Sinxron commit darajalari va quorum
synchronous_commit · ANY k"Sinxron yoki asinxron" — Core daraja. Senior aniq qaysi nuqtagacha kutishni (commit darajasini) va quorumni boshqaradi.
synchronous_commit darajalari — har biri boshqa kafolat
| Qiymat | Nimagacha kutadi | Kelishuv |
|---|---|---|
off | Hech narsa (lokal ham emas) | Eng tez; crash’da oxirgi commitlar yo‘qolishi mumkin |
local | Faqat lokal WAL diskka | Standby kutilmaydi (amalda asinxron) |
remote_write | Standby qabul qildi (OS’ga) | O‘rtacha; standby crash’da nozik holat |
on | Standby diskka flush qildi | Standart sinxron — durable |
remote_apply | Standby qo‘lladi (o‘qishda ko‘rinadi) | Eng kuchli; eng yuqori kechikish |
# postgresql.conf — primary'da sinxron replikatsiya
wal_level = replica # logical replikatsiya uchun -> logical
max_wal_senders = 10
synchronous_commit = on # standby WAL'ni DISKKA flush qilguncha kut
# QUORUM sinxron: 3 standby'dan ISTALGAN 1 tasi tasdiqlasa yetarli
# (bittasi o'lsa ham yozuv bloklanmaydi -> mavjudlik + durability balansi)
synchronous_standby_names = 'ANY 1 (s1, s2, s3)'
Agar FIRST 1 (s1) sinxron deb belgilangan bo‘lsa va s1 o‘lsa — primary tasdiq kutib osilib qoladi (mavjudlik yo‘qoladi). Bu durability va availability’ning klassik to‘qnashuvi.
ANY 1 (s1, s2, s3): uchta standby’dan istalgan bittasi tasdiqlasa yetarli. Bitta-ikkitasi o‘lsa ham yozuv davom etadi, lekin har commit kamida bitta replikada kafolatlangan. remote_apply esa read-your-writes’ni replikadan ham kafolatlaydi (lekin sekin).
Quorum, Raft va split-brain
quorum · fencing · DCSCore’da split-brain’ni ko‘rdik. Uning oldini olishning yagona ishonchli yo‘li — konsensus: yangi primary’ni faqat ko‘pchilik rozi bo‘lganda tanlash.
Nega quorum (ko‘pchilik) kerak
Tarmoq bo‘linsa, ikkala tomon ham "men primary bo‘laman" desa — split-brain. Yechim: primary bo‘lish uchun tugunlarning yarmidan ko‘pi (quorum) ovoz berishi shart. Bo‘lingan tarmoqda faqat bitta tomon ko‘pchilikka ega bo‘ladi — ikkinchisi primary bo‘la olmaydi.
Raft va DCS
Raft — konsensus algoritmi: leader saylanadi (term bilan), yozuvlar ko‘pchilikka takrorlangach "committed" bo‘ladi. Amalda buni o‘zing yozmaysan — DCS (Distributed Configuration Store: etcd, Consul, ZooKeeper) bu konsensusni beradi (etcd ichida Raft ishlaydi). Patroni (keyingi bo‘lim) klaster holatini shu DCS’da saqlaydi.
Fencing (STONITH): eski primary qaytib kelsa, uni majburan "demote" qilish kerak — aks holda u eski yozuvlar bilan split-brain qiladi. Witness/quorum node: juft sonli tugunda durang bo‘lmasligi uchun kichik "guvoh" tugun qo‘shiladi (ovoz toq bo‘lsin).
Avtomatik failover (Patroni + etcd)
leader lock · TTLPatroni — PostgreSQL HA’ning amaldagi standarti. U avtomatik failover, leader election va konfiguratsiyani boshqaradi. Failover’ni o‘zing yozmaysan — Patroni qiladi.
Patroni qanday ishlaydi
Har node’da Patroni agenti ishlaydi va u PostgreSQL’ni boshqaradi. Klaster holati DCS (etcd)da saqlanadi. Mexanizm — leader lock + TTL:
- Joriy leader (primary) DCS’da "leader" kalitini TTL bilan ushlab turadi va uni doim yangilaydi.
- Leader yiqilsa — yangilay olmaydi, TTL tugaydi, kalit bo‘shaydi.
- Sog‘lom replikalar kalitni egallashga poyga qiladi; atomik tarzda bittasi yutadi (etcd konsensusi tufayli) → o‘zini primary’ga promote qiladi.
- HAProxy/pgbouncer Patroni’ning REST sog‘liq endpointiga qarab trafikni doimo joriy leaderga yo‘naltiradi.
# patroni.yml — har node'da ishlaydi (PostgreSQL + Patroni agent)
scope: shop-cluster
etcd:
hosts: "etcd1:2379,etcd2:2379,etcd3:2379" # DCS (konsensus shu yerda)
bootstrap:
dcs:
ttl: 30 # leader lock muddati (sekund)
loop_wait: 10 # har 10s da holatni tekshiradi
retry_timeout: 10
maximum_lag_on_failover: 1048576 # 1MB dan ko'p orqada replika PROMOTE BO'LMAYDI
postgresql:
use_pg_rewind: true
parameters:
synchronous_commit: "on"
synchronous_standby_names: "ANY 1 (*)"
Switchover — rejalashtirilgan (deploy, texnik xizmat); failover — kutilmagan (primary o‘ldi). maximum_lag_on_failover — juda orqada qolgan replikani promote qilmaslik (ma’lumot yo‘qotmaslik uchun). ttl kichik = tez failover, lekin noto‘g‘ri ishga tushirish xavfi ortadi.
Multi-master va konflikt yechish
LWW · CRDT · BDRHozirgacha bitta primary ko‘rdik. Multi-primary (multi-master) — bir nechta node bir vaqtda yozuv qabul qiladi. Kuchli, lekin eng xavfli model.
Nega va nega yo‘q
+ Har mintaqada yozuv (past kechikish), yozuvda yagona bottleneck yo‘q, bitta node o‘lsa boshqasi yozadi. − Eng katta muammo — yozuv konflikti: ikki node bir paytda bir xil qatorni o‘zgartirsa, qaysi biri to‘g‘ri?
Konflikt yechish strategiyalari
| Strategiya | Qanday | Xavf |
|---|---|---|
| Last-Write-Wins (LWW) | Eng so‘nggi timestamp g‘olib | Soatlar sinxron bo‘lishi shart; yozuv jim yo‘qoladi |
| Version vectors | Versiyalar bilan kim kimdan keyin ekanini aniqlash | Murakkab; baribir parallel o‘zgarishni hal qilmaydi |
| CRDT | Konfliktsiz birlashadigan ma’lumot turlari | Faqat maxsus tiplar uchun (counter, set) |
| App-merge | Ilova qoidasi bo‘yicha birlashtirish | Har holat uchun qo‘lda mantiq |
Multi-primary izchillikni yozuv mavjudligiga almashtiradi (CAP’da AP — 11-mavzu). Postgres’da bu pglogical/BDR kabi yechimlar orqali mumkin, lekin murakkab. Aksariyat ilovalar multi-primary’dan qochib, bitta-primary + tez failover (Patroni)ni tanlashi kerak. Multi-primary faqat haqiqiy geo-yozuv yoki maxsus talab bo‘lganda.
Geo-replikatsiya va multi-region
RPO · async cross-regionFoydalanuvchilar dunyo bo‘ylab bo‘lsa, ma’lumotni ham mintaqalarga geo-replikatsiya qilamiz — past kechikishli o‘qish va falokatdan tiklanish (DR) uchun.
Asosiy naqsh — bitta yozuv mintaqasi + geo o‘qish replikalari
Yozuv bitta "uy" mintaqada; boshqa mintaqalarda o‘qish replikalari. Foydalanuvchi o‘ziga yaqin replikadan tez o‘qiydi, yozuv esa uzoqdagi primary’ga boradi.
Mintaqalar orasidagi kechikish (masalan, EU↔Asia ~150ms+) sinxron replikatsiyani imkonsiz qiladi (har yozuv 300ms kutardi). Demak geo-replikatsiya deyarli doim asinxron → yuqori lag, va falokatda RPO (yo‘qolishi mumkin bo‘lgan ma’lumot oynasi) noldan katta.
Mintaqa o‘lsa, boshqa mintaqaga failover — bu RTO (tiklash vaqti) va DNS/Anycast (5-mavzu) bilan boshqariladi. Mintaqalar orasida bo‘linish bo‘lsa — izchillik yoki mavjudlik tanlanadi (CAP, 11-mavzu). Ko‘pincha "har mintaqa o‘z ma’lumotiga egalik qiladi" (data residency) naqshi ishlatiladi.
Lag o‘lchash, slot, RPO/RTO
pg_stat_replicationLag — replikatsiyaning sog‘lig‘i. Senior uni doim o‘lchaydi va sabablarini biladi: yuqori lag = eskirgan o‘qish va failover’da ma’lumot yo‘qolishi xavfi.
Lag’ni o‘lchash
Postgres pg_stat_replication jadvalida har replika holati ko‘rinadi — bayt (qancha WAL orqada) va vaqt (necha sekund orqada):
-- LAG monitoring: bayt va vaqt bo'yicha (primary'da ishga tushiriladi)
SELECT
client_addr,
state, -- streaming / catchup
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes,
replay_lag AS lag_time -- vaqt bo'yicha orqada qolish
FROM pg_stat_replication;
Lag sabablari va vositalar
- Yozuv portlashi: primary’da to‘satdan ko‘p yozuv — replika yetisha olmaydi.
- Replikadagi uzoq so‘rovlar: og‘ir analitik so‘rov WAL’ni qo‘llashni (replay) bloklaydi.
- Tarmoq: mintaqalararo yoki tor kanal.
Replication slot: primary replika iste’mol qilmaguncha WAL’ni o‘chirmaydi (replika orqada qolsa ham yo‘qotmaydi). Xavf: replika uzoq o‘lik tursa, WAL to‘planib diskni to‘ldiradi → max_slot_wal_keep_size bilan cheklaysan. hot_standby_feedback: replikadagi uzoq so‘rovni primary’ga aytadi (vacuum kerakli qatorlarni o‘chirmasin) — lekin primary’da bloat keltirishi mumkin.
RPO (Recovery Point Objective) — falokatda qancha ma’lumot yo‘qolishi joiz (async lag bilan bog‘liq). RTO (Recovery Time Objective) — qancha vaqt ichida tiklanish kerak (failover tezligi). Bu ikki raqamni biznes belgilaydi va ular sinxron/asinxron hamda failover sozlamalaringizni aniqlaydi.
HA arxitekturasi va senior cheklist
Senior HA arxitekturasi — yig‘ma ko‘rinish
Yetuk, ishonchli PostgreSQL HA odatda shunday quriladi:
| Qism | Vazifa |
|---|---|
| 3 node Patroni (1 primary + 2 replica) | Avtomatik failover, toq son → quorum |
| etcd klaster (3 node) | Konsensus / leader lock (DCS) |
| HAProxy + PgBouncer | Trafikni leader’ga; o‘qishni replikalarga; pooling |
Quorum sync (ANY 1) | Durability + mavjudlik balansi |
| Lag monitoring + alert | Eskirgan o‘qish va RPO xavfini ushlash |
| Geo o‘qish replikasi (kerak bo‘lsa) | Past kechikishli o‘qish + DR |
Senior tayyorlik cheklisti
| Savol / amaliyot | Bo‘lim |
|---|---|
| Physical vs logical replikatsiya farqini va qachon qaysi birini bilaman | 1 |
| synchronous_commit darajalarini va quorum (ANY k) sozlashni bilaman | 2 |
| Split-brain’ni quorum/fencing bilan oldini olaman; Raft/DCS rolini tushunaman | 3 |
| Patroni + etcd + HAProxy bilan avtomatik failover quraman | 4 |
| Multi-primary konflikt strategiyalarini bilaman va undan qachon qochishni | 5 |
| Geo-replikatsiya va mintaqalararo async lag/RPO ni boshqaraman | 6 |
| pg_stat_replication bilan lag o‘lchayman; slot/feedback xavflarini bilaman; RPO/RTO belgilayman | 7 |
Bu 7-mavzuning Deep/Senior qatlami edi — Core bilan birga, replikatsiya endi to‘liq.
Endi ma’lumot qatlami (6–7) yakunlandi. Keyingi mavzu: “8-mavzu: API Gateway” — barcha so‘rovlar uchun yagona aqlli kirish nuqtasi. Core’dan boshlaymiz.