GH GambleHub

Ma’lumotlar bazalarini sharding va replikatsiya qilish

Ma’lumotlar bazalarini sharding va replikatsiya qilish

1) Nima uchun bu zarur?

DBning vertikal yangilanishi CPU/IO/RAM yoki bitta klaster SPOFga aylanganda, replikatsiya (o’qish uchun/NA) va sharding (yozuv/ma’lumotlarni taqsimlash uchun) keladi. Maqsadlar:
  • O’tkazish qobiliyati (write QPS gorizontal o’sishi).
  • Foydalanish imkoniyati (tezkor failover, yagona nuqta yo’qligi).
  • Ma’lumotlarni mahalliylashtirish (ko’p mintaqa, past latentlik).
  • Shovqinli qoʻshnilarni izolyatsiya qilish (hot tenants/hot keys).

2) Muvofiqlikning bazaviy atamalari va modellari

Primary/Leader Replica/Follower: peshqadamda yozish, replikalarda oʻqish.
Sinxron replikatsiya: N uzellarga yozilgandan so’ng tranzaksiyani tasdiqlash (past RPO, yuqori latentlik).
Asinxron: etakchi kommitni tuzatadi va logni keyinroq yuboradi (RPO> 0, past latentlik).
Kvorum (Raft/Paxos): koʻpchilik tugunlarga yozish; bitta log, avtomatik yetakchi.
Read-after-write: o’z yozuvlarini kafolatli o’qish (§ 5 ga qarang).

CAPni quyidagicha o’qing: tarmoq muammolarida siz tanqidiy operatsiyalar uchun muvofiqlikni (CP) yoki imkoniyatni (AP) tanlaysiz, ko’pincha turli yo’llardagi darajalarni birlashtirasiz.


3) Replikatsiya: variantlar va amaliyotlar

3. 1 Jismoniy va mantiqiy

Jismoniy (WAL/redo/binlog): blok jurnalga yaqin, oddiy va tezkor; gomogen topologiya/versiya bilan cheklangan.
Mantiqiy: satrlar/jadvallar darajasida DML/DDL oqimi; DWH/striming uchun qisman nusxalar, versiyalar orasidagi koʻchishlar, CDC imkonini beradi.

3. 2 Moslash va boshqarish

lag (vaqt/bayt/LSN) ni boshqaring.
Hot-standby feedback va uzoq so’rovlarni cheklang (VACUUM/kliningni to’xtatmaslik uchun).
MySQL uchun - GTID va Orchestrator; для PostgreSQL — Patroni/replication slots, synchronous_standby_names.

PostgreSQL (sinxron nusxa, parcha):
sql
-- на лидере
ALTER SYSTEM SET synchronous_commit = 'on';
ALTER SYSTEM SET synchronous_standby_names = 'FIRST 1 (standby_a, standby_b)';
SELECT pg_reload_conf();
MySQL GTID (tranzaksiya identifikatori):
sql
SET GLOBAL enforce_gtid_consistency = ON;
SET GLOBAL gtid_mode = ON; -- перезапуск
CHANGE MASTER TO MASTER_AUTO_POSITION=1;

3. 3 Topologiyalar

1 → N (yetakchi → replikalar) + kaskadlar (replika uzoqroq oqadi).
Multi-primary (active-active) - OLTPda qat’iy nizo-menejmentsiz qochish.
Quorum-klaster (Raft) - CockroachDB/Yugabyte/PG-Raft-ustavlar.


4) Read/Write Split va marshrutlash

Doimo yetakchi sifatida yozing; so’zlar bilan o’qing, lekin lag’ni hisobga oling.

read-after-write strategiyalari:

1. Session stickiness: muvaffaqiyatli yozilgandan so’ng, mijoz’T’Δ davomida etakchini o’qiydi.

2. LSN/GTID-geyt: mijoz «Men LSN = X dan katta bo’lishni xohlamayman», deb xabar beradi, router LSN ≥ Xni replikaga yuboradi.

3. Stale-ok: soʻrovlarning bir qismi eskirgan maʼlumotlarga (kataloglar/lentalar) ruxsat beradi.

Asboblar: PgBouncer/Pgpool-II (Postgres), ProxySQL/MaxScale (MySQL), Vitess.

LSN-gate misoli:’pg _ current _ wal _ lsn ()’ni HTTP-xeder/kukga saqlang va routerdan’pg _ last _ wal _ replay _ lsn () ≥ LSN’nusxasini talab qiling.


5) Sharding strategiyasi

5. 1 Kalitni tanlash

Kalit so’rovlarning bir tekisligi va joylanganligini ta’minlashi kerak:
  • Hash’tenant _ id ’/’ user _ id’- teng, lekin range-skanerlardan mahrum qiladi.
  • Vaqt boʻyicha Range/ID - time-series/arxiv uchun juda yaxshi, ammo xavf hot-shard.
  • Consistent hashing - shardlarni qoʻshish/olib tashlashni soddalashtiradi.
  • Directory/lookup jadvali moslashuvchan (har qanday algoritm), lekin yana bir jadval/kesh.

5. 2 Patternlar

Shared-nothing: har bir shard - alohida DB/klaster, ilova yo’nalishni biladi.
Middleware-sharding: Vitess (MySQL), Citus (Postgres), Proxy darajasi topologiyani yashiradi.
Federatsiya: maʼlumotlar domenlarini servislar boʻyicha ajratish (catalog, payments, auth).

5. 3 Kompozit kalitlar

’{tenant}: {entity}: {id}’ tugmasini ishlating va uni dastur va keshda saqlang. Для Postgres — hash partitioning + LIST/RANGE subpartition.

PostgreSQL partitioning (parcha):
sql
CREATE TABLE orders (
tenant_id int,
id     bigint,
created_at timestamptz,
...,
PRIMARY KEY (tenant_id, id)
) PARTITION BY HASH (tenant_id);

CREATE TABLE orders_t0 PARTITION OF orders FOR VALUES WITH (MODULUS 16, REMAINDER 0);
--... t1..t15

6) Identifikatorlarni generatsiya qilish

Chardingda «issiq» monoton avtoinkrementlardan qoching.
Snowflake kabi 64-bit ID (time + region + shard + seq) yoki ULID/KSUID (monotonlik va taqsimlanish) dan foydalaning.
Для Postgres — sequence per shard; MySQL uchun - auto_increment_increment/offset (shard rahbarlaridagi turli ofsetlar).


7) Onlayn-peresardlash va migratsiya

Asosiy tamoyillar: ikki tomonlama yozuv (dual-write), idempotentlik, vaqtinchalik ikki tomonlama marshrutlash.

Qadamlar (umumlashtirilgan):

1. Yangi shard/klaster qoʻshing.

2. Dual-o’qishni yoqing.

3. Dual-write (ikkala sharda) ni yoqing, farqlarni aniqlang.

4. Tarixiy maʼlumotlarni (batchi, mantiqiy/CDC replikatsiyasi) bajaring.

5. «Haqiqat manbai» ni yangi shardga oʻtkazing; «quyruq» sinxronizatsiyasini qoldiring.

6. Eskisini oʻchiring.

Instrumentlar: Vitess Resharding, Citus move shards, pg_logical/pgoutput, Debezium (CDC), gh-ost/pt-online-schema-change (DDL blokirovkasiz).


8) Ko’p mintaqa va georaylash

Leader-follower per region: lokal o’qish, yozuv - global rahbar orqali (oddiy model, lekin cross-region RTT).
Multi-leader: ikkala hududda ham yozuv - mojaro-merjing (timestamp/versiya/CRDT) kerak.
True distributed SQL (Raft): CockroachDB/Yugabyte - maʼlumotlar mintaqaga yopishtirilgan, soʻrovlar mahalliy kvorumga oʻtadi.

Tavsiyalar:
  • Pul/buyurtmalar - CP (kvorum/yetakchi), kataloglar/lentalar - AP (kesh, eventual).
  • Har doim split-brain ehtimolida write fencing (noyob kalitlar/versiyalash) ni rejalashtiring.

9) Amaliyotda muvofiqlik

Read-your-writes: LSN/GTIDni «ushlagan» yetakchiga yoki nusxasiga.
Monotonic reads: oxirgi oʻqilgan LSN dan «katta emas».
Write-conflict control: `SELECT... FOR UPDATE’, versiyasi (’xmin ’/’ rowversion’), versiyasini tekshirgan holda UPSERT.
Idempotentlik: to’lov/hodisalarda idempotentlik kalitlari.


10) Kuzatish, SLO va alerta

Lag replik: vaqt (sek), LSN distance (bytes), seconds_behind_master (MySQL).
Majburiy qaytish/mojarolar, replikatsiya xatolari.
p95/p99 latency по route (read leader vs replica, write).
Throughput: TPS/locks/row-contended tables.
Bloat/VACUUM (PG), InnoDB buffer pool hit ratio (MySQL).
Dashbordlar: per-shard yuklamasi, «issiq» shardlar, kalitlarni taqsimlash.


11) Bekaplar, PITR va DR

PITR uchun to’liq backap + WAL/binlog (point-in-time recovery).
Boshqa mintaqada/bulutda saqlang, muntazam ravishda qayta tiklash testlarini o’tkazing.
Shardlar uchun - kelishilgan «kesma» (vaqtni muvofiqlashtirish/LSN) yoki tiklanishdagi aplikativ idempotentlik.
RPO/RTO ro’yxatga olingan va game-days-da sinovdan o’tkaziladi.

PostgreSQL base backup (gʻoya):
bash pg_basebackup -D /backups/base -X stream -C -S slot_replica_1 архивация WAL через archive_command или pgBackRest/Barman

12) Xavfsizlik va foydalanish

Proksiga VPC/ACL, mTLS bo’yicha segmentlash.
Eng kam huquqlar prinsipi bo’yicha rollar/grantlar; shard/rolga alohida foydalanuvchilar.
DDL/DCL auditi, «og’ir» so’rovlar uchun limitlar.
at rest (KMS) va tranzitda (TLS) shifrlash.
«Vahima tugmasi»: hodisa/tergov paytida global’READ ONLY’.


13) Asboblar va g’ishtlar

PostgreSQL: Patroni (HA), PgBouncer (pooling/RO-routing), repmgr, pgBackRest/Barman (бэкап), Citus (шардинг), pglogical/Logical Replication, pgbadger/pg_stat_statements.
MySQL: Orchestrator (topologiyalar/avto-failover), ProxySQL/MaxScale (marshrutizatsiya), Percona XtraBackup (backap), Group Replication/InnoDB Cluster, Vitess (sharding/resxarding).
Distributed SQL: CockroachDB, YugabyteDB (kvorum, o’rnatilgan sharding/geolokatsiya).
CDC: Debezium + Kafka/Pulsar/ETL.


14) Anti-patternlar

Avto-failoversiz va DR testlarsiz Single-primary.
«Sehrli» read-split lag → fantomik xatolar/shubhali xatolar hisobga olinmagan holda.
Sharding «sharding uchun»: vertikal skeyl/indeks/kesh o’rniga erta murakkablik.
Issiq diapazon (time-range) time-bucket/hash-salt → bitta shard eriydi.
OLTPda o’nlab shardlardan yuqori 2PC global tranzaksiya - yuqori p99 dumlari va tez-tez blokirovkalar.
Migratsiyalarda dual-write/dual-read yo’qligi → yo’qotish/rasinxron.
DDL prodda onlayn vositalarsiz va fich-bayroqlarsiz.


15) Joriy etish chek-varaqasi (0-60 kun)

0-15 kun

SLO DB, RPO/RTO belgilansin.
Replikatsiya, lag monitoringi, bazaviy bekaplar + PITR.
Router (PgBouncer/ProxySQL) va read-after-write siyosatini kiritish.

16-30 kun

Sharding strategiyasini tanlash, kalitlar va sxemalarni tasvirlash.
Vitess/Citus/CDC vositalarini tayyorlash.
«read-stale-ok» vs «strict» belgisi qo’yilgan servislar/jadvallar katalogi.

31-60 kun

Pilot-shard, dual-read va backfill dasturlarini ishga tushirish.
Game-day: etakchi, PITR dan tiklash, mintaqani o’zgartirish.
Issiq shard-kalitlar va notekis hisobotlarni avtomatlashtirish.


16) Etuklik metrikasi

Replica lag p95 <maqsadli (masalan, 500 ms) tanqidiy oʻqishlar uchun.
Muvaffaqiyatli DR-testlar ≥ 1/chorak (restore ≤ RTO, RPO ≤ yo’qotish).
Yuklamani shardlar boʻyicha taqsimlash: nomutanosiblik <20% QPS/ombor boʻyicha.
Strict-consistency so’rovlar ulushi, to’g "ri yo’naltirilgan, = 100%.
CP kafolatlarini talab qiladigan hodisalarda Zero-data-loss (pul/buyurtmalar).
To’xtovsiz, mos bayroq bilan onlayn DDL/migratsiya.


17) Retseptlar namunalari

Time-range uchun hash-salt (bitta shardni isitmaslik uchun):
sql
-- вычисляйте bucket = hash(user_id) % 16, храните (bucket, created_at)
PARTITION BY LIST (bucket) SUBPARTITION BY RANGE (created_at)
Read-my-writes middleware (psevdokod):
python lsn = db.leader_query("SELECT pg_current_wal_lsn()")
ctx.sticky_until = now()+5s ctx.min_lsn = lsn в роутере чтений: выбираем реплику с last_lsn >= ctx.min_lsn, иначе лидер
Vitess VSchema (parcha):
json
{
"tables": {
"orders": { "column_vindexes": [{ "column": "tenant_id", "name": "hash" }] }
}
}

18) Xulosa

Sharding va replikatsiya - bu nafaqat texnika, balki jarayonlar: muvofiqlikni hisobga olgan holda marshrutlash, migratsiya intizomi (dual-write/read, backfill), muntazam DR-testlar va lag/issiq shardlarni kuzatish. Oddiy leader → replica + read-after-write bilan boshlang, so’ngra yuk profili talab qiladigan joyga sharding qo’shing. Tayyor platformalardan (Vitess/Citus/Distributed SQL) foydalaning va biznes-tanqidiy ma’lumotlarni CP rejimida saqlang - shunday qilib, baza butilka bo’yniga aylanmaydi va platformaning bashorat qilinadigan, elastik poydevoriga aylanadi.

Contact

Biz bilan bog‘laning

Har qanday savol yoki yordam bo‘yicha bizga murojaat qiling.Doimo yordam berishga tayyormiz.

Integratsiyani boshlash

Email — majburiy. Telegram yoki WhatsApp — ixtiyoriy.

Ismingiz ixtiyoriy
Email ixtiyoriy
Mavzu ixtiyoriy
Xabar ixtiyoriy
Telegram ixtiyoriy
@
Agar Telegram qoldirilgan bo‘lsa — javob Email bilan birga o‘sha yerga ham yuboriladi.
WhatsApp ixtiyoriy
Format: mamlakat kodi va raqam (masalan, +998XXXXXXXX).

Yuborish orqali ma'lumotlaringiz qayta ishlanishiga rozilik bildirasiz.