GH GambleHub

Շարդինգը և տվյալների կոդավորման կրկնօրինակումը

Շարդինգը և տվյալների կոդավորման կրկնօրինակումը

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 Կոմպոզիտային բանալիներ

Օգտագործեք բանալին '< և պահպանեք այն նաև բջիջներում և քեշում։ Для Postgres — hash partitioning + LIST/RANGE subpartition.

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 ռեժիմում բիզնես քննադատական տվյալները, և հիմքը կդադարի լինել շիշ գորշ և կդառնա կանխատեսելի, առաձգական պլատֆորմի հիմքը։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։