Tizim dizayni kursi · 7-mavzu · DEEP / SENIOR
TuzdiDinMuhammad

Database Replication — Senior chuqurlik

Bu — 7-mavzuning 2-qatlami. Core darslikni o‘qib bo‘lgan deb hisoblanadi. Bu yerda eng chuqur narsalar: WAL (physical vs logical), sinxron commit ichki mexanikasi, quorum/Raft, Patroni sozlash, multi-primary konflikt yechish, geo-replikatsiya va lag monitoring — junior’dan seniorgacha.

Daraja: SeniorMavzular: WAL · quorum · Patroni · multi-master · geoOld shart: 7-mavzu (Core)

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.

01
Deep · WAL

Physical vs logical replikatsiya

WAL · logical decoding
📜

Senior 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‘chadiWAL baytlari (butun klaster)Qator o‘zgarishlari (tanlab)
VersiyaBir xil major versiya shartVersiyalar aro mumkin
ReplikaAniq nusxa (read-only)Mustaqil, yoziladigan ham bo‘lishi mumkin
Asosiy ishlatilishiHA / standbySelective replikatsiya, upgrade, CDC
3-mavzu bilan bog‘lanish

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.

02
Deep · Sync

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

QiymatNimagacha kutadiKelishuv
offHech narsa (lokal ham emas)Eng tez; crash’da oxirgi commitlar yo‘qolishi mumkin
localFaqat lokal WAL diskkaStandby kutilmaydi (amalda asinxron)
remote_writeStandby qabul qildi (OS’ga)O‘rtacha; standby crash’da nozik holat
onStandby diskka flush qildiStandart sinxron — durable
remote_applyStandby 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)'
Sinxron standby o‘lsa — yozuv bloklanadi

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.

Yechim — quorum (ANY k)

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).

03
Deep · Consensus

Quorum, Raft va split-brain

quorum · fencing · DCS
🗳️

Core’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.

5 tugun, tarmoq bo‘lindi Ko‘pchilik (3) ✓ — primary tanlaydi Ozchilik (2) ✕ — primary BO‘LA OLMAYDI split-brainoldini oladi
Faqat ko‘pchilik tomon primary tanlay oladi → ikki primary bo‘lmaydi

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 va witness

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).

04
Deep · Patroni

Avtomatik failover (Patroni + etcd)

leader lock · TTL
🤖

Patroni — 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 (*)"
etcd (DCS)leader lock + TTL Node 1 (Leader)PG + Patroni Node 2 (Replica)PG + Patroni Node 3 (Replica)PG + Patroni
Patroni: har node DCS bilan gaplashadi; leader lock’ni ushlagani — primary
Switchover vs Failover · muhim sozlamalar

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.

05
Deep · Multi-primary

Multi-master va konflikt yechish

LWW · CRDT · BDR
✌️

Hozirgacha 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?

Primary Anarx = 100 Primary Bnarx = 120 KONFLIKT 🔥 bir qator, ikki xil qiymat
Multi-primary: bir qatorni ikki joyda o‘zgartirish → konflikt

Konflikt yechish strategiyalari

StrategiyaQandayXavf
Last-Write-Wins (LWW)Eng so‘nggi timestamp g‘olibSoatlar sinxron bo‘lishi shart; yozuv jim yo‘qoladi
Version vectorsVersiyalar bilan kim kimdan keyin ekanini aniqlashMurakkab; baribir parallel o‘zgarishni hal qilmaydi
CRDTKonfliktsiz birlashadigan ma’lumot turlariFaqat maxsus tiplar uchun (counter, set)
App-mergeIlova qoidasi bo‘yicha birlashtirishHar holat uchun qo‘lda mantiq
Senior xulosa

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.

06
Deep · Geo

Geo-replikatsiya va multi-region

RPO · async cross-region
🌍

Foydalanuvchilar 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.

EU — Primary (yozuv)"uy" mintaqa async (yuqori lag) US — replica (o‘qish) Asia — replica (o‘qish)
Bitta yozuv mintaqasi + geo o‘qish replikalari (mintaqalararo async)
Mintaqalararo — async majburiy

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.

CAP va global LB bilan bog‘lanish

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.

07
Deep · Monitoring

Lag o‘lchash, slot, RPO/RTO

pg_stat_replication
📡

Lag — 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 slots va hot_standby_feedback

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‘ldiradimax_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 va RTO

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.

08
Deep · Arxitektura

HA arxitekturasi va senior cheklist

Senior HA arxitekturasi — yig‘ma ko‘rinish

Yetuk, ishonchli PostgreSQL HA odatda shunday quriladi:

QismVazifa
3 node Patroni (1 primary + 2 replica)Avtomatik failover, toq son → quorum
etcd klaster (3 node)Konsensus / leader lock (DCS)
HAProxy + PgBouncerTrafikni leader’ga; o‘qishni replikalarga; pooling
Quorum sync (ANY 1)Durability + mavjudlik balansi
Lag monitoring + alertEskirgan o‘qish va RPO xavfini ushlash
Geo o‘qish replikasi (kerak bo‘lsa)Past kechikishli o‘qish + DR

Senior tayyorlik cheklisti

Savol / amaliyotBo‘lim
Physical vs logical replikatsiya farqini va qachon qaysi birini bilaman1
synchronous_commit darajalarini va quorum (ANY k) sozlashni bilaman2
Split-brain’ni quorum/fencing bilan oldini olaman; Raft/DCS rolini tushunaman3
Patroni + etcd + HAProxy bilan avtomatik failover quraman4
Multi-primary konflikt strategiyalarini bilaman va undan qachon qochishni5
Geo-replikatsiya va mintaqalararo async lag/RPO ni boshqaraman6
pg_stat_replication bilan lag o‘lchayman; slot/feedback xavflarini bilaman; RPO/RTO belgilayman7

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.