Replikasiya və eventual consistency
Replikasiya və eventual consistency
1) Niyə eventual consistency
Sistem zonalar/bölgələr üzrə paylandıqda, sinxron qeyd hər yerdə şəbəkə nasazlıqları zamanı yüksək gecikmə və aşağı mövcudluq verir. Eventual consistency (EC) üçün replikaların müvəqqəti sinxronizasiyasına imkan verir:- aşağı qeyd gecikməsi (yerli qəbul),
- şəbəkə bölünmələrində daha yaxşı əlçatanlıq,
- üfüqi miqyaslı.
Əsas vəzifə nəzarət olunan qeyri-sabit uyğunluqdur: istifadəçi «kifayət qədər təzə» məlumatları görür, domen invariantları saxlanılır, münaqişələr müəyyən edilir və əvvəlcədən həll edilir.
2) Uyğunluq modelləri - müştəriyə nə vəd edirik
Strong: oxu dərhal son yazını görür.
Bounded stale/read-not-older-than (RNOT): oxumaq (LSN/versiya/vaxt) yaşlı deyil.
Causal: «səbəb-nəticə» münasibətləri saxlanılır (A-dan B-yə qədər).
Read-Your-Writes: Müştəri son qeydlərini görür.
Monotonic Reads: Hər bir sonrakı oxu geri «yuvarlanmır».
Session: bir sessiya çərçivəsində zəmanət dəsti.
Eventual: yeni qeydlər olmadıqda, bütün replikalar birləşir.
Təcrübə: Kritik yollarda Session + RNOT-u və vitrinlərdə/keşlərdə Eventual-ı birləşdirin.
3) Replikasiya: mexanika və anti-entropy
Sinxron (kvorum/RAFT): qeyd N düyünlər təsdiq sonra uğurlu hesab olunur; minimum RPO, p99-dan yuxarı.
Asinxron: yerli lider kommitit, daha sonra jurnal paylayır; aşağı gecikmə, RPO> 0.
Fiziki (WAL/binlog): sürətli, homogen.
Məntiq/CDC: sətir/hadisə səviyyəsində dəyişiklik axını, çevik marşrut, filtrlər.
Anti-entropy: periodik yoxlama və təmir (Merkle ağacları, hash müqayisə, fon re-sync).
4) Versiya identifikatorları və səbəbli sifarişlər
Monoton versiyalar: increment/LSN/epoch; sadə, lakin paralelliyi kodlamır.
Lamport timestamp: məntiqi saatlara görə qismən sifariş.
Vector clock: paralel filialları düzəldir və münaqişə yenilənmələrini (concurrent) aşkar etməyə imkan verir.
Hybrid/TrueTime/Clock-SI: qlobal sifariş üçün «T əvvəl deyil» məntiqi.
Tövsiyə: CRDT/münaqişə yeniləmələri üçün - vector clock; «yaşlı deyil» üçün - LSN/GTID.
5) Münaqişələr: aşkarlama və həll
Tipik vəziyyətlər: eyni obyektə iki bölgədən giriş.
Strategiyalar:1. Saat/məntiq möhürü ilə Last-Write-Wins (LWW) - sadə, lakin yeniləmələri «itirə» bilər.
2. Domen məntiqi Merge funksiyaları:- sayğac sahələri qatlanır (G-Counter/PN-Counter),
- çoxluqları ilə birləşir «add-wins/remove-wins»,
- məbləğ/balans - yalnız LWW vasitəsilə deyil, əməliyyat jurnalları vasitəsilə.
- 3. CRDT (konvergent növləri): G-Counter, OR-Set, LWW-Register, RGA siyahıları üçün.
- 4. Əməliyyat transformasiyaları (nadir hallarda DB üçün, daha çox redaktorlar üçün).
- 5. Manual resolution: «inbox» konflikt, istifadəçi düzgün versiyası seçir.
Qayda: Domen invariantları strategiyanı diktə edir. Pul/qalıqlar üçün - LWW-dən çəkinin; kompensasiya ilə əməliyyatlar/hadisələr istifadə edin.
6) Qeydlərin təminatı və idempotentlik
Komandalarda idempotent açarları (payment, withdraw, create) → təkrar təhlükəsizdir.
İdempotentlik açarı/seriya nömrəsi ilə «giriş» (inbox) və «çıxış» (outbox) üzərində duplikasiya.
Exactly-once güclü şərtlər olmadan əlçatmazdır; at-least-once + idempotentlik təcrübə.
Outbox/Inbox-pattern: DB-də qeydiyyat və hadisənin atom (yerli əməliyyat) dərc edilməsi, alıcı idempotency-key ilə emal edir.
7) Oxu «yaşlı deyil X» (RNOT)
Texnikalar:- LSN/GTID-qapısı: müştəri minimum versiyanı (yazının cavabından) verir, router/proxy LSN ≥ X-i tutmuş replikaya, əks halda liderə göndərir.
- Time-bound: «2 saniyədən yaşlı deyil» - versiyasız sadə SLA.
- Session pinning: N saniyə yazdıqdan sonra yalnız lideri oxuyun (Read-Your-Writes).
8) Dəyişiklik axını və cache uyğunlaşdırılması
CDC → şin hadisələri (Kafka/Pulsar) → istehlakçılar (caches, indekslər, vitrinlər).
Cache əlilliyi: topiki 'invalidate: {ns}: {id}'; idempotent emal.
Rebuild/Backfill: Rasinkron zamanı hadisə jurnalından proyeksiyaları yenidən tərtib edin.
9) Dastanlar və kompensasiyalar (xidmətlərarası əməliyyatlar)
EC-dünyada uzun ömürlü əməliyyatlar kompensasiya hərəkətləri ilə addımlara bölünür:- Orkestr: koordinator addımlar və kompensasiya çağırır.
- Xoreoqrafiya: addımlar hadisələrə reaksiya verir və aşağıdakıları dərc edir.
İnvariantlar (nümunə): «balans ≥ 0» - addım sərhədlərində yoxlama + kənara çıxdıqda kompensasiya.
10) Multi-region və şəbəkə bölmələri
Local-write, async-replicate: yerli bölgədə qeyd + başqalarına çatdırılma (EC).
Geo-fencing: məlumatlar bölgəyə «yapışdırılır» (aşağı gecikmə, daha az münaqişə).
CP məlumatları üçün kvorum DB (Raft); caches/vitrinlər - AP/EC.
Split-brain planı: əlaqəni itirdikdə, regionlar domen limitləri (write fencing, kvotalar) çərçivəsində işləməyə davam edir, sonra - reconcile.
11) Müşahidə və SLO
Metriklər:- Replica lag: vaxt/LSN-məsafə/offset (p50/p95/p99).
- Staleness: cavabların nisbəti həddindən yüksəkdir (məsələn,> 2s və ya LSN
- Conflict rate: münaqişə tezliyi və uğurlu merge.
- Convergence time: zirvədən sonra replikaların yaxınlaşma vaxtı.
- Reconcile backlog: həcmi/geri partiyalar vaxt.
- RPO/RTO verilənlər kateqoriyasına görə (CP/AP).
- Lag> hədəf, artan münaqişələr, «uzun» uyğunsuzluq pəncərələri.
12) EC altında məlumat sxemi dizayn
Hər girişdə açıq versiya/vektor ('version', 'vc' sütunları).
Kritik invariantlar üçün Append-only jurnalları (balans, hesablamalar).
Sıra və babalar üçün hadisə identifikatorları (snowflake/ULID).
Kommutativ təbiətli sahələr (sayğaclar, çoxluqlar) → CRDT namizədləri.
API dizaynı: if-match/etag ilə PUT, precondition ilə PATCH.
13) Saxlama və oxu nümunələri
Read model/CQRS: «mənbə» yazısı, proyeksiyalardan oxumaq (gecikə bilər → «yenilənir»...).
Stale-OK marşrutları (kataloq/lent) vs Strict (cüzdan/limitlər).
Sticky/Bounded-stale bayraqlar sorğu (başlıq 'x-read-consistency').
14) Giriş çek siyahısı (0-45 gün)
0-10 gün
Məlumatları kateqoriyaya salın: CP-kritik (pul, sifarişlər) vs AB/çelik-OK (kataloqlar, axtarış indeksləri).
SLO steylini (məsələn, «2s-dən yaşlı deyil») təyin edin.
API-də obyektlərin və idempotency-keys versiyasını daxil edin.
11-25 gün
CDC və outbox/inbox tətbiq, cache əlillik marşrutları.
Qeyd-kritik yollarda RNOT (LSN-gate) və session pinning əlavə edin.
Ən azı bir tədbir strategiyasını (LWW/CRDT/domen) və münaqişə jurnalını həyata keçirmək.
26-45 gün
Anti-entropy (yoxlama/təmir) və Style hesabatlarını avtomatlaşdırın.
Game-day keçirin: şəbəkənin bölünməsi, münaqişələrin artması, bərpa.
Daşbordlarda vizuallaşdırın: lag, staleness, conflict rate, convergence.
15) Anti-nümunələr
Kritik invariantlar üçün kor LWW (pul itkisi/bal).
idempotency → retras ikiqat əməliyyatlar yoxdur.
bütün → həddindən artıq p99 quyruqları və uğursuzluqlar zamanı kövrək «güclü» model.
No RNOT/Session zəmanətləri → UX «yanıb-sönür», istifadəçilər öz dəyişikliklərini «görmürlər».
Gizli cache və mənbə sinxronizasiyası (CDC/əlillik yoxdur).
reconcile/anti-entropy alətinin olmaması - «əsrlər boyu» məlumatlar fərqlənir.
16) Yetkinlik metrikası
Replica lag p95 hədəf ≤ (məsələn, ≤ 500 ms regionda, ≤ 2 s regionlararası).
Staleness SLO «ciddi» marşrutlarda sorğuların 99% ≥ yerinə yetirilir.
Conflict resolution success ≥ 99. 9%, orta həll müddəti ≤ 1 dəq.
Convergence time zirvə sonra - dəqiqə, saat deyil.
100% «pul» əməliyyatları idempotency açarları və outbox/inbox ilə əhatə olunur.
17) Reseptlər (snippetlər)
If-Match/ETag (HTTP)
PUT /profile/42
If-Match: "v17"
Body: { "email": "new@example.com" }
Əgər versiya dəyişibsə - '412 Precondition Failed' → müştəri münaqişəni həll edir.
«LSN-dən yaşlı deyil» sorğusu (psevdo)
x-min-lsn: 16/B373F8D8
Router replay _ lsn ≥ x-min-lsn 'ilə replika seçir, əks halda - lider.
CRDT G-Counter (ideya)
Hər bir region öz sayğacını saxlayır; nəticə - bütün komponentlərin cəmi; replikasiya - kommutativ əməliyyat.
18) Nəticə
Eventual consistency keyfiyyətdə kompromis deyil, şüurlu bir müqavilədir: haradasa biz sürət və əlçatanlıq üçün təzəlik ödəyirik, lakin domen strategiyaları və alətləri ilə kritik invariantları qoruyuruq. Versiyaları daxil edin, idempotency, RNOT/Session zəmanət, CDC və anti-entropy, lag/staleness/conflicts ölçün - və paylanmış sisteminiz hətta uğursuzluqlar və pik yüklər altında sürətli, sabit və proqnozlaşdırıla bilən olacaq.