Шарҳи пойгоҳи додаҳо ва нусхабардорӣ
Шарҳи пойгоҳи додаҳо ва нусхабардорӣ
1) Чаро ба шумо лозим аст
Вақте ки такмилдиҳии амудии пойгоҳи додаҳо бар зидди CPU/IO/RAM ё як кластер SPOF мегардад, нусхабардорӣ (барои хондан/HA) ва sharding (барои навиштан/тақсимоти маълумот) меояд. Вазифаҳо:- Гузариш (навиштани афзоиши уфуқии QPS).
- Мавҷудият (нокомии зуд, ягон нуқтаи ягонаи нокомӣ).
- Маҳаллисозии маълумот (бисёр минтақа, таъхири кам).
- Ҷудокунии ҳамсояҳои пурғавғо (иҷорагирони гарм/калидҳои гарм).
2) Истилоҳоти асосӣ ва моделҳои пайдарҳамӣ
Ибтидоӣ/Пешво ↔ Нусха/Пайрав: ба роҳбар нависед, дар нусхаҳо хонед.
Такрори синхронӣ: тасдиқи муомилот пас аз навиштан дар гиреҳҳои N (RPO паст, таъхири баланд).
Асинхронӣ: роҳбар баъдтар дафтарро содир мекунад ва мефиристад (RPO> 0, таъхири кам).
Кворум (Raft/Paxos): навиштан ба аксари гиреҳҳо; як журнал, пешвои автоматӣ.
Пас аз хондан: хондани кафолати сабтҳои он (ниг. § 5).
Мо CAP-ро дар чунин фурӯш мехонем: дар сурати мушкилоти шабака, шумо пайдарҳамӣ (CP) ё дастрасӣ (AP) -ро барои амалиёти муҳим интихоб мекунед, ки аксар вақт сатҳҳоро дар роҳҳои гуногун муттаҳид мекунанд.
3) Нусхабардорӣ: Имконот ва амалия
3. 1 Ҷисмонӣ ва мантиқӣ
Физикӣ (WAL/redo/binlog): ба дафтари блок наздиктар, оддӣ ва зуд; бо топология/версияи якхела маҳдуд аст.
Мантиқӣ: ҷараёни DML/DDL дар сатр/ҷадвал; имкон медиҳад нусхаҳои қисман, муҳоҷирати кросс-версия, CDC барои DWH/ҷараён.
3. 2 Танзим ва идоракунӣ
Ақибмонии монитор (вақт/байт/LSN).
Маҳдудияти фикру мулоҳизаҳои гарм ва дархостҳои тӯлонӣ оид ба нусхабардорӣ (барои манъ кардани VACUUM/тозакунӣ).
Барои My-SQL - GTID ва оркестр; dlya Postgre.SQL - Ҷойҳои Patroni/нусхабардорӣ, synchronous_standby_names.
sql
-- на лидере
ALTER SYSTEM SET synchronous_commit = 'on';
ALTER SYSTEM SET synchronous_standby_names = 'FIRST 1 (standby_a, standby_b)';
SELECT pg_reload_conf();
Ман SQL GTID (ID транзаксия):
sql
SET GLOBAL enforce_gtid_consistency = ON;
SET GLOBAL gtid_mode = ON; -- перезапуск
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
3. 3 Топология
1 → N (пешво → нусхабардорӣ) + каскадҳо (нусхабардорӣ минбаъд якҷоя мешавад).
Бисёр ибтидоӣ (фаъол-фаъол) - дар OLTP бидуни идоракунии қатъии низоъ пешгирӣ кунед.
Кластери кворум (Рафт) - иловаҳои тараққикардаи тараққиёт/Югабайт/PG-Raft.
4) Тақсимот ва масирро хонед/нависед
Ҳамеша ҳамчун роҳбар нависед; аз сабтҳо хонед, аммо ақибмондагиро ба назар гиред.
Стратегияҳои пас аз навиштан:1. Устувории сессия: Пас аз сабти бомуваффақият, муштарӣ дар вақти 'Δ T' аз роҳбар мехонад.
2. Дарвозаи LSN/GTID: муштарӣ мегӯяд, "ман мехоҳам LSN = X-и калонтар нагирам", роутер ба реплика, ки LSN ≥ X. мефиристад, мефиристад.
3. Stale-ok: баъзе дархостҳо имкон медиҳанд, ки маълумоти кӯҳна (феҳристҳо/лентаҳо).
Воситаҳо: PGBouncer/Pgpool-II (Postgres), Proxy
Намунаи дарвозаи LSN (идея): захира кардани 'pg _ current _ wal _ lsn ()' ба сарлавҳаи HTTP/куки ва талаб кардани роутер бо 'pg _ last _ wal _ replay _ lsn () ≥ LSN'.
5) Стратегияҳои Sharding
5. 1 Интихоби калид
Калид якрангӣ ва маҳалли дархостҳоро таъмин мекунад:- Hash by 'иҷорагир _ id '/' user _ id' - баробар, аммо сканҳои диапазонро маҳрум мекунад.
- Диапазон дар вақт/ID - барои силсилаи вақт/бойгонӣ бузург аст, аммо хатари гарм.
- Хэшинги пайваста - илова кардан/нест кардани шардҳоро осон мекунад.
- Ҷадвали феҳрист/ҷустуҷӯ - фасеҳ (ҳама гуна алгоритм), аммо дигар ҷадвал/кэш.
5. 2 Намунаҳо
Муштарак-ҳеҷ чиз: ҳар як shard пойгоҳи додаҳо/кластери алоҳида аст, барнома масирро медонад.
Шаршараи миёнаравӣ: Vitess (My-SQL), Citus (Postgres), сатҳи Proxy топологияро пинҳон мекунад.
Федератсия: тақсимоти доменҳои маълумот аз рӯи хидматҳо (каталог, пардохтҳо, аут).
5. 3 Калидҳои таркибӣ
Фазои калидиро истифода баред: '{иҷорагир}: {объект}: {id}' ва онро дар барнома ва кэш нигоҳ доред. Для Постгрес - тақсимоти ҳаш + LIST/RANGE.
Қисмбандии Postgre- SQL (фрагмент):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) Насли ID
Аз афзоиши худкори якхелаи "гарм" худдорӣ кунед.
ID-и барфпӯши 64-бита (вақт + минтақа + шард + seq) ё ULID/KSUID (якранг ва тақсимот) -ро истифода баред.
Для Постгрес - пайдарпаии як шард; барои MySQL - auto_increment_increment/offset (ҷубронҳои гуногун дар пешвоёни shard).
7) Барзиёдии онлайн ва муҳоҷират
Принсипҳои асосӣ: дутарафа навиштан, аблаҳӣ, масири муваққатии дугона.
Қадамҳо (умумӣ):1. Илова кардани shard/кластери нав.
2. Фаъол кардани хониши дугона (санҷиши мутобиқат).
3. Дохил кардани дутарафа (дар ҳарду shards), номувофиқатии сабт.
4. Маълумоти таърихиро бозпас гиред (маҷмӯаҳо, нусхабардории мантиқӣ/CDC).
5. "Манбаи ҳақиқат" -ро ба риштаи нав иваз кунед; синхронизатсияи "дум" -ро тарк кунед.
6. Кӯҳнаи худро хомӯш кунед.
Воситаҳо: Vitess Resharding, Citus shards, pg_logical/pgoutput, Debezium (CDC), gh-ost/pt-online-schema-change (DDL бе қуфл).
8) Тақсимоти бисёрҷониба ва гео
Роҳбар-пайрав дар як минтақа: мехонад, менависад - тавассути пешвои ҷаҳонӣ (модели оддӣ, аммо минтақаи фаромарзӣ RTT).
Роҳбари бисёр: сабт дар ҳарду минтақа - ба шумо муноқишаи низоъ лозим аст (timestamp/version/CRDT).
SQL-и тақсимшудаи ҳақиқӣ (Raft): Cockroach-DB/Yugabyte - маълумот ба минтақа "часпонида шудааст", дархостҳо ба кворуми маҳаллӣ мераванд.
- Пул/фармоиш - CP (кворум/роҳбар), феҳристҳо/наворҳо - АП (кэш, оқибат).
- Ҳамеша нақшаи навиштани деворро (калидҳои беназир/версия) бо майнаи тақсимшудаи имконпазир ба нақша гиред.
9) Мутобиқат дар амал
Хонед-нависед: пешво ё сухане, ки бо LSN/GTID "ба даст омадааст".
Монотоник мехонад: "калонтар нест" аз хондани охирини LSN.
Назорати муноқишаи навиштан: 'ИНТИХОБ... БАРОИ НАВ ', версияҳо (' xmin '/' rowversion '), UPSERT бо санҷиши версия.
Idempotence: калидҳои idempotence оид ба пардохтҳо/чорабиниҳо.
10) Мушоҳида, SLO ва огоҳиҳо
Ақибмонии реплика: вақт (сонияҳо), масофаи LSN (байтҳо), seconds_behind_master (My
Bloat/VACUUM (PG), таносуби ҳавзи буферии Inno
Рафти маҷбурӣ/муноқишаҳо, хатогиҳои такрорӣ.
p95/p99 масири пинҳонии po (роҳбари хондан против нусхабардорӣ, навиштан).
Гузариш: TPS/қулфҳо/ҷадвалҳои сатрӣ.
Панели панелҳо: сарборӣ барои як шард, рехтани "гарм", тақсимоти калидҳо.
11) Нусхабардорӣ, PITR ва DR
Захираи пурраи + WAL/binlog барои PITR (барқароркунии нуқта дар вақт).
Дар минтақа/абри дигар нигоҳ доред, санҷишҳоро мунтазам барқарор кунед.
Барои shards, як "буридаи" пайваста (ҳамоҳангсозии вақт/LSN) ё idempotence татбиқшаванда оид ба барқароршавӣ.
RPO/RTO-ҳо дар рӯзҳои бозӣ навишта ва озмуда мешаванд.
bash pg_basebackup -D /backups/base -X stream -C -S slot_replica_1 архивация WAL через archive_command или pgBackRest/Barman
12) Амният ва дастрасӣ
Сегментатсия аз ҷониби VPC/ACL, MTLS аз ҷониби прокси.
Нақшҳо/грантҳо аз рӯи принсипи ҳуқуқҳои ҳадди аққал; истифодабарандагони инфиродӣ дар як shard/нақш.
Аудити DDL/DCL, дархостҳои "вазнин" -ро дар нусхаҳо маҳдуд мекунад.
Рамзгузорӣ ҳангоми истироҳат (KMS) ва транзит (TLS).
Тугмаи воҳима: Глобалии 'ТАНҲО ХОНЕД' дар тӯли ҳодиса/тафтишот.
13) Асбобҳо ва хишт
Postgre-SQL: Patroni (HA), Pg, pgbadger/pg_stat_statements.
My-SQL: Оркестр (топология/худкор-ноком), Proxy
SQL-и тақсимшуда: Cockroach
CDC: Debezium + Kafka/Pulsar барои чорабиниҳо/ETL.
14) Анти-намунаҳо
Як-ибтидоӣ бидуни нокомии худкор ва бидуни санҷишҳои DR.
Тақсимоти "Magic" ба истиснои хатогиҳои фантом/хатогиҳои шубҳанок.
Sharding "ба хотири sharding": мураккабии бармаҳал ба ҷои миқёси амудӣ/индексатсияҳо/кэш.
Диапазони гарм (фосилаи вақт) бе сатил/ҳаш-намак → як шард гудохта мешавад.
Амалиёти глобалӣ дар болои даҳҳо shards дар OLTP - думҳошон баланд p99 ва қуфлҳои зуд-зуд.
Набудани дутарафа навиштан/дутарафа хондан дар вақти муҳоҷират → гум кардан/берун рафтан.
DDL дар prod бе воситаҳои онлайн ва бе парчамҳои хусусиятҳои мутобиқат.
15) Рӯйхати назорати амалисозӣ (0-60 рӯз)
0-15 рӯз
DB SLO, RPO/RTO-ро муайян кунед.
Имкон диҳед нусхабардорӣ, мониторинги ақиб, нусхаҳои эҳтиётии асосӣ + PITR.
Ворид кардани роутер (PGBouncer/Proxy
16-30 рӯз
Стратегияи тезро интихоб кунед, калидҳо ва схемаҳоро тавсиф кунед.
Воситаҳои барқи зиёдатиро омода кунед (Vitess/Citus/CDC).
Феҳристи хидматҳо/ҷадвалҳо бо нишони "хондан-кӯҳна-ok" vs "сахт".
31-60 рӯз
Пилот-шард, дутарафа хонед ва дубора пур кунед.
Рӯзи бозӣ: нокомии пешво, барқароршавӣ аз PITR, гузариши минтақа.
Автоматикунонии калиди shard гарм ва гузоришдиҳии нобаробар.
16) Нишондиҳандаҳои камолот
Реплика ақибмонии p95 <ҳадаф (масалан, 500 мс) барои мутолиаи интиқодӣ.
Санҷишҳои бомуваффақияти DR ≥ 1/семоҳа (барқарор кардани ≤ RTO, аз даст додани RPO ≤).
Тақсимоти сарборӣ аз ҷониби shards: номувозинатӣ <20% аз ҷониби QPS/анбор.
Фоизи дархостҳо бо пайдарҳамии қатъӣ = 100% дуруст равона карда шудааст.
Талафоти сифр-маълумот дар ҳодисаҳое, ки кафолати CP-ро талаб мекунанд (пул/фармоиш).
DDL/муҳоҷирати онлайн бидуни истироҳат, бо парчамҳои мутобиқат.
17) Намунаҳои дорухат
Ҳаш-намак барои фосилаи вақт (ба тавре ки як шардро гарм накунед):sql
-- вычисляйте bucket = hash(user_id) % 16, храните (bucket, created_at)
PARTITION BY LIST (bucket) SUBPARTITION BY RANGE (created_at)
Middleware-ро хонед (псевдокод):
python lsn = db.leader_query("SELECT pg_current_wal_lsn()")
ctx.sticky_until = now()+5s ctx.min_lsn = lsn в роутере чтений: выбираем реплику с last_lsn >= ctx.min_lsn, иначе лидер
Витесс В.хема (порча):
json
{
"tables": {
"orders": { "column_vindexes": [{ "column": "tenant_id", "name": "hash" }] }
}
}
18) Хулоса
Sharding and replication на танҳо як усул, балки равандҳо низ мебошанд: масирдиҳии огоҳона, интизоми муҳоҷират (дугона-навиштан/хондан, backfill), санҷишҳои мунтазами DR ва мушоҳидаҳои ақибмонда/гарм. Бо роҳбари оддии + хондан пас аз навиштан → нусхабардорӣ оғоз кунед, ва баъд илова кунед, ки профили сарборӣ дар ҳақиқат инро талаб мекунад. Платформаҳои тайёрро (Vitess/Citus/Distribution SQL) истифода баред ва маълумоти муҳимро дар ҳолати CP нигоҳ доред - бо ин роҳ пойгоҳ мушкилотро қатъ мекунад ва таҳкурсии пешгӯишаванда ва тағйирёбандаи платформа мегардад.