Շարդինգը և տվյալների կոդավորման կրկնօրինակումը
Շարդինգը և տվյալների կոդավորման կրկնօրինակումը
1) Ինչո՞ ւ է դա անհրաժեշտ
Երբ ուղղահայաց apgraid BD-ն հենվում է CPU/IO/RAM-ի սահմաններին կամ մեկ կլաստեր դառնում է SPOF, գալիս են կրկնօրինակումը (կարդալու/NA) և շարդինգը (գրելու/տվյալների բաշխման համար)։ Նպատակները
Թողունակություն (write QPS-ի հորիզոնական աճը)։
Հասանելիությունը (արագ failover, մերժման միասնական կետի բացակայությունը)։
Տվյալների տեղայնացումը (մուլտֆիլմ շրջան, ցածր լատենտ)։
Աղմկոտ հարևանների մեկուսացումը (hot tenants/hot keys)։
2) Հիմնական տերմինները և մոդելները
Primary/Leader no Replica/Follower: Առաջնորդի ձայնագրությունը, կարդալը 'կրկնօրինակների վրա։
Սինխրոն կրկնօրինակումը 'գործարքի հաստատումը N հանգույցներում գրելուց հետո (ցածր RPO, ավելի բարձր լատենտ)։
Ասինխրոն 'առաջնորդը գրանցում է կոմունիտը և ուղարկում լոգ ավելի ուշ (RPO> 0, ցածր լատենտ)։
Քվորումնայա (Raft/Paxos) 'հանգույցների մեծամասնության ձայնագրությունը։ մեկ լոգ, ավտոմատ առաջնորդ։
Read-after-write: երաշխավորված կարդալ իր գրառումները (տե՛ ս 355)։
CAP-ն կարդում ենք այսպես. Ցանցային խնդիրների դեպքում դուք ընտրում եք համակարգումը (CP) կամ հասանելիությունը (AP) կրիտիկական վիրահատությունների համար, հաճախ նվազեցնելով մակարդակները տարբեր ճանապարհների վրա։
3) Վերափոխում ՝ տարբերակներ և պրակտիկա
3. 1 Ֆիզիկական և տրամաբանական
Ֆիզիկական (WAL/redo/binlog), ավելի մոտ է գունավոր ամսագրին, պարզ և արագ։ սահմանափակվում է հոմոգենի/տարբերակով։
Տրամաբանական 'DML/DDL հոսքը տողերի/աղյուսակների մակարդակում։ թույլ է տալիս մասնակի կրկնօրինակներ, որոնք կապված են տարբերակների միջև, CDC-ը CPH/striming-ի համար։
3. 2 Կարգավորում և կառավարում
Վերահսկեք lag (ժամանակը/բայթ/LSN)։
Սահմանափակեք hot-standby feedback-ը և երկար հարցումներ կրկնօրինակների վրա (որպեսզի չվնասեք VACUUM/կլինինգը)։
MySQL-ի համար 'GTID և Orchestram; для PostgreSQL — Patroni/replication slots, synchronous_standby_names.
PostgreSQL (սինխրոն կրկնօրինակը, հատվածը)
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 (ռուսական գործարքներ)
sql
SET GLOBAL enforce_gtid_consistency = ON;
SET GLOBAL gtid_mode = ON; -- перезапуск
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
3. 3 Դեգեոլոգիայի
1 նոյեմբերի N (ռուսական կրկնօրինակի առաջնորդը) + կասկադները (կրկնօրինակը միացնում է հաջորդը)։
Multi-primary (action) - խուսափել OLTP-ում առանց խիստ հակամարտական կառավարման։
Delrum կլաստեր (Raft) - CockroachDB/Yugabyte/PG-Raft-Edvance։
4) Read/Write Split և միկրոավտոբիա
Գրեք միշտ առաջնորդի մեջ։ Բայց հաշվի առեք lag-ը։
Read-after-write ռազմավարությունները
1. Session stickiness-ը 'հաջողակ ձայնագրությունից հետո հաճախորդը կարդում է առաջնորդից «Wint T» -ի ընթացքում։
2. LSN/GTID գեյթ: Հաճախորդը հայտարարում է «Ես չեմ ուզում ծերանալ LSN = X», ռոուտերը ուղարկում է վերանայման, ում LSN no X- ը։
3. Stale-ok: Հարցումների մի մասը թույլ է տալիս հնացած տվյալներ (www.ay/ժապավեն)։
Գործիքներ ՝ PgBouncer/Pgpool-II (Postgres), ProxySQL/Windows Scale (MySQL), Vitess (շարդի միկրոակտիվացում)։
LSN-գեյթի օրինակը (գաղափարը) 'պահպանեք' pg _ current _ wal _ lsn () 'HTTP-heder/cuku-ում և պահանջեք router- ից կրկնօրինակը' «pg _ lant _ wal _ replay _ lsn» () - ից։
5) Շարդինգի ռազմավարությունը
5. 1 Ստեղնաշարի ընտրություն
Բանալին պետք է ապահովի հարցումների հավասարությունը և տեղայնությունը
Hash 'tenium _ id _ id' - հավասարաչափ, բայց զրկում է range-սկաններից։
Range ժամանակի/ID-ը հիանալի է Time-series/արխիվի համար, բայց hot-shard ռիսկը։
Consistent hashing-ը պարզեցնում է շարդի ավելացումը/հեռացումը։
Express/lookup-2019-ը ճկուն է (ցանկացած ալգորիթմ), բայց մեկ այլ ալգորիթմ/kash։
5. 2 Patterns
Shared-nothing: Յուրաքանչյուր գնդակ առանձին BD/կլաստեր է, ծրագիրը գիտի երթուղայնացումը։
Middleware-շարդինգը 'Vitess (MySQL), Citus (Postgres), Proxy-մակարդակը թաքցնում է տեղաբանությունը։
Ֆեդեգրաֆիա 'ծառայությունների տվյալների օրինագծերի բաժանումը (catalog, payments, auth)։
5. 3 Կոմպոզիտային բանալիներ
Օգտագործեք բանալին '<
PostgreSQL partitioning (հատված)
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) Բաղադրիչների գեներացիան
Խուսափեք շարդինգի վրա գտնվող «տաք» մոնոտոնային ինքնաձիգներից։
Օգտագործեք Diowflake-ը 64-բիթ ID (Time + region + shard + seq) կամ ULID/KSUID (միապաղաղ և բաշխում)։
Для Postgres — sequence per shard; MySQL-ի համար 'բանաձևը _ increme _ increme/www.set (տարբեր օֆսետներ շարդի առաջնորդների վրա)։
7) Առցանց փոխանցումը և իրականացումը
Հիմնական սկզբունքները 'կրկնակի ձայնագրություն (dult-write), idempotention, ժամանակավոր երկակի միկրոակտիզացիա։
Քայլերը (ընդհանրացված)
1. Ավելացրեք նոր գնդակ/կլաստեր։
2. Միացրեք dance-read (կոնսիստենտության ստուգում)։
3. Միացրեք dance-write (երկու շարքերում), գրանցեք տարբերությունները։
4. Nobackfill պատմական տվյալները (բատչեր, տրամաբանական/CDC)։
5. Անցեք «ճշմարտության աղբյուրը» նոր շարդի։ թողեք «պոչի» համաժամեցումը։
6. Անջատեք հինը։
Գործիքներ ՝ Vitess Resharding, Citus move shards, pg _ logical/pgoutput, Debez.ru (CDC), gh-ost/pt-onme-schema-change (DDL առանց արգելափակումների)։
8) Multi-տարածաշրջանը և երկրաչափությունը
Leader-follower per region: Տեղական ընթերցումներ, ձայնագրությունը գլոբալ առաջնորդի միջոցով (պարզ մոդել, բայց cross-region RTT)։
Multi-leader: Երկու տարածաշրջաններում ձայնագրումը պետք է հակամարտություն-մերջինգ (timestamp/տարբերակը/CRDT)։
Distributed SQL (Raft): CockroachDB/Yugabyte - տվյալները «կլանված» տարածաշրջանին, հարցումները գնում են տեղական քվորում։
Առաջարկություններ
Գումար/պատվերներ - CP (kvorum/առաջնորդ), ռուսական և/ժապավենը - AP (kash, eventae)։
Միշտ պլանավորեք write fencing (յուրահատուկ բանալիներ/տարբերակներ) հնարավոր split-brain։
9) Ներդաշնակությունը գործնականում
Read-your-writes 'առաջնորդին կամ կրկնօրինակմանը, որը «կռահեց» LSN/GTID-ը։
Monotonic reads: «ավելի մեծ» վերջին կարդացած LSN-ն։
Write-conflict control: `SELECT... FOR SYMATE ", տարբերակը (" xmin "/" rowversion "), UPSPS-ը, որը ստուգում է տարբերակը։
Idempotenty: Idempotenty բանալիները վճարումների/իրադարձությունների վրա։
10) Դիտարկումը, SLO և alerta
Լագ կրկնօրինակը 'ժամանակը (վայրկյան), LSN distics (bytes), seconds _ behind _ medter (MySQL)։
Հարկադիր արձագանքներ/հակամարտություններ, վերարտադրման սխալներ։
p95/p99 latency по route (read leader vs replica, write).
Throughput: TPS/locks/row-contended tables.
Bloat/VACUUM (PG), InnoDB buffer pool hit ratio (MySQL).
Dashbords: per-shard 2019, «տաք» շարդներ, բաժանումը։
11) Բեքապներ, PITR և DR
Ամբողջական bakap + WAL/binlog PITR-ի համար (point-in-time recovery)։
Պահեք մեկ այլ տարածաշրջանում/ամպում, կանոնավորաբար հետազոտեք թեստերը։
Շարիդների համար համաձայնեցված «srez» (ժամանակի/LSN) կամ ապլիկատիվ իկեմպոտենցիա վերականգնման ժամանակ։
RPO/RTO-ն գրված է և թեստավորվում game-days-ում։
PostgreSQL bultbackup (գաղափարը)
bash pg_basebackup -D /backups/base -X stream -C -S slot_replica_1 архивация WAL через archive_command или pgBackRest/Barman
12) Անվտանգություն և հասանելիություն
SDC/ACL, mTSA-ի վրա։
Դերերը/դրամաշնորհները նվազագույն իրավունքների սկզբունքով։ առանձին օգտագործողներ շարդի/դերի վրա։
DDL/DCL-ի աուդիտը, limits «ծանր» ակնարկների վրա։
At rest (KFC) և տրանզիտում (TFC)։
«Խուճապ-կոճակ» ՝ գլոբալ «READ ONLY» մրցույթի/հետազոտության ժամանակ։
13) Գործիքներ և աղյուսներ
PostgreSQL: Patroni (HA), PgBouncer (pooling/RO-routing), repmgr, pgBackRest/Barman (бэкап), Citus (шардинг), pglogical/Logical Replication, pgbadger/pg_stat_statements.
MySQL: Orchestram (Avto-failover), ProxySQL/You Scale (), Percona XtraBackup (Bakap), Group Replant/InnoDB Cluster, vuster (Citess/resharding)։
Distributed SQL: CockroachDB, YugabyteDB (kvorum, ներկառուցված շարդինգ/երկրաբանական)։
CDC: Debez.ru + Kafka/Pulsar իրադարձությունների համար/ETL։
14) Anti-patterna
Single-primary առանց avto-failover և առանց DR թեստերի։
«Կախարդական» read-split բացառությամբ lag-fantomic սխալները/կասկածելի ուղիները։
Շարդինգը «հանուն շարդինգի» 'բարդ բարդություն ուղղահայաց սկեյլի/ինդեքսների/քեշի փոխարեն։
Տաք միջակայքը (Time-range) առանց Time-bucket/hash-salt-ի լողում է։
2PC գլոբալ գործարքը OLTP-ում տասնյակ շարքերի վերևում բարձր p99 պոչերն են և հաճախակի արգելափակումները։
Dance-write/dult-read-ի բացակայությունը միգրացիաների ժամանակ կանխատեսում է/ռասինխրոն։
DDL-ն վաճառում է առանց առցանց գործիքների և առանց ֆիչային դրոշների։
15) Ներդրման թուղթ (0-60 օր)
0-15 օր
Որոշեք SLO BD, RPO/RTO։
Միացրեք կրկնօրինակումը, www.lag, հիմնական bekaps + PITR։
Ներդրել ռոտեր (PgBouncer/ProxySQL) և read-after-write քաղաքականությունը։
16-30 օր
Ընտրել շարդինգի ռազմավարությունը, նկարագրել բանալիները և սխեմաները։
Պատրաստել փոխանցման գործիքներ (Vitess/Citus/CDC)։
Ծառայությունների/աղյուսակների կատալոգը, որը նշանակում է «read-stale-ok» vs «strict»։
31-60 օր
Սկսել pilot-shard, dox-read և backfill։
Game-day: failover առաջնորդը, PITR-ի վերականգնումը, տարածաշրջանի անցումը։
Ավտոմատիզացնել զեկույցները տաք շարդի բեկորների և անհավասարությունների մասին։
16) Հասունության մետրերը
Replica lag p95 <108 (օրինակ ՝ 500 ռուբլիներ) քննադատական ընթերցումների համար։
Հաջողակ DR թեստերը 241/քառորդ (RTO RTO, RPO-ի կորուստը)։
Շառդամի բեռի բաշխումը 'անհավասարակշռություն <20 տոկոսը QPS/պահեստավորման միջոցով։
Հարցումների մասնաբաժինը strict-consistency-ից, ճիշտ ուղղված, = 100 տոկոսը։
Zero-2019-loss-ը այն միջադեպերում, որոնք պահանջում են CP երաշխիքներ (գումար/պատվերներ)։
Առցանց DDL/wwww.ru առանց անցքի, դրոշների հետ։
17) Բաղադրատոմսի օրինակներ
Hash-salt Time-range-ի համար (որպեսզի մեկ գնդակ չգրվի)
sql
-- вычисляйте bucket = hash(user_id) % 16, храните (bucket, created_at)
PARTITION BY LIST (bucket) SUBPARTITION BY RANGE (created_at)
Read-my-writes 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, иначе лидер
Vitess VSchema (հատված)
json
{
"tables": {
"orders": { "column_vindexes": [{ "column": "tenant_id", "name": "hash" }] }
}
}
18) Եզրակացություն
Շարդինգը և կրկնօրինակումը ոչ միայն տեխնիկան են, այլ նաև գործընթացները 'միկրոօրգանիզմները, միգրացիայի կարգապահությունը (dult-write/read, backfill), DR թեստերը և lag/տաք շարքերի դիտարկումը։ Սկսեք պարզ leader www.replica + read-after-write-ից, ապա ավելացրեք շարդինգը այնտեղ, որտեղ այն իսկապես պահանջում է բեռի պրոֆիլ։ Օգտագործեք պատրաստի պլատֆորմները (Vitess/Citus/Distributed SQL) և պահեք CP ռեժիմում բիզնես քննադատական տվյալները, և հիմքը կդադարի լինել շիշ գորշ և կդառնա կանխատեսելի, առաձգական պլատֆորմի հիմքը։