Շարդինգը և տվյալների կոդավորման կրկնօրինակումը
(Բաժին ՝ Տեխնոլոգիաներ և ենթակառուցվածքներ)
Ռուսական ռեզյումե
IGaming պլատֆորմների համար հաճախորդների աճը (տոկոսադրույքներ, ավանդներ, PSA webhuks, խաղերի իրադարձություններ) և հասանելիության պահանջները (3699։ 9–99. 99%) արագորեն հենվում են մեկ BD-ի սահմաններում։ Կրկնօրինակումը տալիս է ընթերցանության և անկայունության հորիզոնական մեծացում։ Շարդինգը ձայնագրման և տվյալների հորիզոնական մեծացում է։ Բանալին PACELC-ի գիտակցված փոխզիջումներ են (հրաժարվելուց հետո ՝ CA/P, հակառակ դեպքում ՝ Latency vs Consistency), հստակ SLO և սխեմաների կարգապահություն/։
Տերմինները և մոդելները
Կրկնությունը հանգույցների միջև տվյալների պատճենումն է։
Leader-Follower (Primary-Replica), մեկ ձայնագրություն շատ ընթերցումներ է կատարվում։
Multi-Leader (Active-Action) 'ձայնագրություններ մի քանի տարածաշրջաններում, հակամարտություններ/մերջ։
Consensus-replant (Raft/Paxos, Direct SQL): Cassandra/Scylla - AP-quorums, CockroachDB/Yugabyte - CP-kuma)։
Winnc/Semi-entnc/Async: vs RPO-ի ուշացման հավասարակշռությունը։
Շարդինգը աղյուսակների/աղյուսակների հորիզոնական բաժանումն է շարդների վրա։
Hash-sharding (հավասարություն, ավելի բարդ է, քան միջակայքը)։
Range-շարդինգը (միջակայքը), «տաք» վերջի ռիսկը։
Consistent hashing (փափուկ ավելացում/նոդի սպանում)։
Geo-շարդինգը (տարածաշրջանի/իրավասության)։
Ֆունկցիոնալ շարդինգը (բյուջեներով 'վճարումներ/տոկոսադրույքներ/CRM)։
Երբ և ինչ ընտրել iGaming-ում
Միայն կրկնօրինակումը (առանց շարդինգի), երբ ընթերցման հիմնական խնդիրը 'իրադարձությունների ժապավենները, հաշվետվությունները, հրապարակայնությունը և։ Գրառումները տեղադրվում են մեկ առաջնորդի, ընթերցանության մեջ 'կրկնօրինակով։
Շարդինգը, երբ ձայնագրման/պահեստավորման նեղ տեղն է 'շարժիչների հոսքը, հավասարակշռությունների գործարքները, ձգողական իրադարձությունները։
Multi-region:- Խաղացողների/PSA-ի լատենտը տեղական ընթերցումներ է տալիս կրկնօրինակով։
- Կարգավորողը (տվյալների տեղայնացումը) մեջբերում է geo-շարդինգը։
- Միջտարածաշրջանային DR-ն բացատրում է ասինխրոն կրկնօրինակը + պլանը։
PACELC և երաշխավոր հատկություններ
CAP 'ցանցում մենք ընտրում ենք C (կոնսիստենտություն) կամ A (հասանելիություն)։
PACELC 'ձախողումների բացակայության դեպքում ընտրում ենք Latency (L) և Consistency (C) միջև։
Կանխիկ ճանապարհները (հավասարակշռություն, ապամոնտաժում), սովորաբար C/strict serializable կամ Serializable + բիզնես idempotent)։
Ավելի քիչ քննադատական ենթահամակարգեր (կլիկաների, կոդերի) 'L-կողմնորոշված (AP/EC, eventae)։
Կրկնօրինակումը 'պրակտիկա
Leader–Follower
Ռուսական առաջնորդի գրառումները, ռուսական կրկնօրինակի ընթերցումները (read scaling)։
Read-after-write: Օգտագործողի վիրահատությունների համար կատարվում է առաջնորդի հետ կամ սպասեք լագին (ստուգում 'lport _ committed _ lsn/' wait _ for _ replay _ lag)։
Semi-nc-ը կրիտիկական ճանապարհների վրա (RPO-ի նվազումը լատենտության գնով)։
Failover: ավտոմատ (patroni/raft-2019) + fencing (որպեսզի կրկնակի առաջնորդ չլինի)։
Multi-Leader
Այն հարմար է բաժանված օրինագծերի և ցածր հակամարտության համար (օրինակ ՝ բովանդակություն/օրինակ), բայց ոչ խաղացողի մեկ հաշվի համար առանց հատուկ միջոցառումների։
Մերջի քաղաքական գործիչները ՝ last-write-interns, CRDT, վճարման կանոններ։
Consensus/Quorum BD
Քվորումի ձայնագրությունը (օրինակ ՝ «WRITE SYRUM»), կվորումի ընթերցումը («READ SYRUM») ուժեղ/հարմարեցված կոնսիստենտություն է։
Հաշվի առեք-AZ/տարածաշրջանների լատինականությունը և կվորումի արժեքը։
Շարդինգ 'ռազմավարություններ և բանալիների ընտրություն
Ինչպես ընտրել բանալին
Կայուն բաշխումը player _ id/account _ id/bet _ id։
Խուսափեք մոնոտոնային բջիջներից (105-incream) range շարդինգում '«տաք» պոչը։
Վճարումների համար հաճախ «player _ id» կամ «account _ id»; լոգարանների համար '«event _ time» + bucketing; բովանդակության համար 'tenium _ id'։
Ռազմավարություններ
Hash-sharding-ը player _ id-ով 'հավասարակշռություն 112/հավասարակշռության հոսքի վրա։
Range-շարդինգը ժամանակի ընթացքում վերլուծության/արխիվների համար։
Geo-sharding: EU խաղացողները մեջբերում են EU-shard (տեղական օրենքների համապատասխանությունը)։
Հիբրիդ 'hash տարածաշրջանի ներսում + geo իրավասության մեջ։
Պայքարը «տաք» բեկորների դեմ
Key-salting (ավելացնել աղ/bucket բանալին)։
Write-throttling-ը իրականում, կոմունի հերթերը (serial executor)։
Նյութականացնել «ագրեգատները» (հավասարակշռությունը) առանձին տարբերակով հաջորդականության հերթով։
Քրոս Շարդի վիրահատությունները
Դրամական փոխանցումը/փոխհատուցումը 'խուսափել 2PC-ից տաք ճանապարհներով։
Saga-pattern: կոտրել տեղական գործարքների վրա + փոխհատուցող գործողություններ, կոշտ կուռքեր և www.box։
2RS/համայնքի արձանագրությունները 'թույլատրելի են կետային (back-գրասենյակային), բայց թանկ են լատենտով և անկայունությամբ։
Պրոյեկտներ ՝ ընթերցողական ներկայացումներ (read models) միջմայրցամաքային էկրանների համար, որոնք նորարարվել են սթրիմից։
Սխեմաներ, ինդեքսներ և էվոլյուցիա
Սխեմայի տարբերակումը 'back-compat, feature-flags կոդի վրա։
Ինդեքսները շարդինգի մասերի և հաճախակի պահանջների մասին։ խուսափել cross-shard join (արեք pre-join/denormalization)։
JSON/dook պահեստավորման համար - validium սխեմաները (JSON-Schema/Drobuf) և TTL-ը «աղմկոտ» հավաքածուների համար։
Առցանց մեծացում և resharding
Պլանավորեք N-ը վիրտուալ գնդակների (slots) ներկա քանակն է ճկուն ռեբլալանսը։
Consistent hashing-ը կամ «վիրտուալ նոդները» հանգույցների փափուկ ավելացման համար։
Onls-resharding
կրկնակի ձայնագրություն (հին + նոր գնդակ), պահպանողականության վալիդացիա;
Չանկերի ֆոնային պատճենները (logical dump/table move/streaming clone);
«Մարկերի» միջոցով + դիտարկման պատուհանը, ապա կրկնակի ձայնագրումը։
Առաջնորդի տեղափոխումը առանց անցյալի 'դերերի փոխակերպումը, կոնդենսացիան։
SLO, դիտարկումը և ալերտինգը
SLO ձայնագրություններ/ընթերցումներ: p99 մգ X ms տաք գյուղացիների վրա, թույլատրելի lag կրկնօրինակը Y- վայրկյանում, www.Z- ի հասանելիությունը։
Մետրիկները ՝ TPS, p95/p99, replanslag, հակամարտություն (multi-leader), retry rate, deadlocks, wait, cache hit ratio, IOPS/latency սկավառակ։
Ճանապարհը '«trace _ id», BD-ի պահանջներում, կապել բրոքերի/իրադարձությունների անվադողերի հետ։
Կանարյան հարցումները և www.nthetic transactions-ը վաղ դեգրադացիայի համար։
Անվտանգությունը և պահանջների համապատասխանությունը
Կոդավորումը հանգստի և տրանզիտում (TFC), կոդավորման մեջ։
RBAC/ACL, խողովակաշարերի/տենանտների հատվածներ, առանձին վճարումների համար/KUS։
Տվյալների տեղայնացումը (EU/TR/LATAM) - համատեղեք geo-շարդինգը և վերականգնման քաղաքականները։
Աուդիտ 'ով և ինչ էր կարդում/կանոններ։ PII դիմակավորում; ռուսական էքսպորտը։
Bakaps, PITR, DR
Ամբողջական + պերիմենտալ bakaps, օֆսայթ պահեստ։
PITR (point-in-time recovery) առաջնորդի կլաստերների համար։
RPO/RTO:- Կրիտիկական ֆորումները (հավասարակշռություն) - RPO 240-30c (semi-winnc կամ հաճախակի WAL-shipping), RTO-ը 210 րոպե ավտոմատ failover հետ։
- Ավելի քիչ քննադատական 'RPO մինչև րոպե/ժամ։
- DR ուսուցումները (game day) և փաստաթղթավորված runbook-ը։
Արտադրողականությունը և թյունինգը (հակիրճ)
Հիշողությունը/քեշը 'ավելացրեք (shared buffers/innodb buffer pool), հետևեք cache-hit-95 տոկոսին։
Ամսագիրը/շարժիչը 'արագ NVMe, առանձին WAL/redo-ի տակ։
Պուլ կղզիներ (PgBouncer/Hikari)։
Պլանավորող/վիճակագրությունը 'ավտովանալիզա/ավտովակում (Postgres), GC (LSM շարժիչներ) կոմպակտիա/թյունինգ։
Քվորումի/կրկնօրինակման գործոնը 'հավասարակշռությունը p99-ի և ձախողման միջև։
iGaming-ի տիպիկ տոպոլոգիաներ
1) Հավասարակշռություններ և վճարումներ (CP-2019)
Leader-Follower-ը խաղացողի տարածքում, semi-winnc-ը մոտ կրկնօրինակին։
Hash-շարդինգը 'account _ id'։
Կարդալը «ձայնագրությունից հետո» առաջնորդից։ Redis-ում API-latency-ի համար։
Medibox-ը կանխատեսում է իրադարձությունների անվադողերը ռուսական/վերլուծության համար։
2) Ռուսական/խաղային իրադարձությունների պատմությունը (AP-կողմնորոշված լոգ)
Range-շարդինգը ժամանակի կամ hash-ով 'player _ id' կոլոնայում/LSM-պահեստում։
Ասինխրոն կրկնօրինակներ հաշվետվության/OLAP-ի համար։
Eventium consistency ընդունելի է, ավելի կարևոր է թողունակությունը։
3) Պրոֆիլի/CRM (Multi-region read, տեղայնացում)
Geo-շարդինգը իրավասության մեջ, տեղական դիտողություններ կարդալու համար։
Գրառումները մոտակա առաջնորդի միջոցով։ Քրոս շրջան 'ասինխրոն + հակամարտությունների լուծումը միայն ոչ ռիթմիկ դաշտերի համար։
Օրինակներ (հայեցակարգային)
Postgres: Player _ id '
sql
CREATE TABLE player_wallet (
player_id BIGINT NOT NULL,
balance_cents BIGINT NOT NULL,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (player_id)
) PARTITION BY HASH (player_id);
CREATE TABLE player_wallet_p0 PARTITION OF player_wallet FOR VALUES WITH (MODULUS 32, REMAINDER 0);
--... p1..p31
-- Репликация: публикация WAL на реплики, синхронность для «горячего» региона.
ALTER SYSTEM SET synchronous_standby_names = 'FIRST 1 (replica_eu1, replica_eu2)';
Կվորումի ձայնագրությունը (կեղծ)
WRITE CL=QUORUM -- запись подтверждена большинством реплик
READ CL=LOCAL_QUORUM -- локальный кворум для низкой задержки
Սագա 2PC-ի փոխարեն (պարզեցված)
1. Ապամոնտաժել շարդ-A-ի վրա (idempotent)։
2. Ուղարկել իրադարձությունը «նկարահանված» ռուսական ծառայությունը (Շարդ-B)։
3. Եթե երկու քայլը անհաջող է, ապա փոխհատուցեք քայլը 1-ին իրադարձությամբ «112»։
Ներդրման չեկի ցուցակ
1. Տվյալների ալգորիթմները և SLO (p99, RPO/RTO, լագը կրկնօրինակը)։
2. Ընտրեք վերարտադրման մոդել (leader/follower, kvorum) և շարդինգի ռազմավարություն։
3. Ամրագրեք շարդինգի և սխեմայի բանալիները (անփոփոխ)։
4. Մուտքագրեք read-after-write քաղաքականությունը և ընթերցանության միկրոակտիվացումը։
5. Նախագծեք on.ru-resharding (վիրտուալ շարդներ, կրկնակի ձայնագրություն)։
6. Երաշխավորել idempotention և www.box իրադարձությունների համար/թիմերի համար։
7. Պարամետրերը, PITR, DR և ռուսական ուսմունքները։
8. Միացրեք դիտարկումը 'լագ, կվորումա, տաք բանալիներ, հակամարտություններ։
9. Փաստարկեք runbook: failover, split-brain, դեգրադացիա։
10. Անցկացրեք բեռ/քաոս թեստեր խաղային պիկի տակ։
Antipatterns
Մի հսկա գնդակ «ամեն ինչի վրա» և «հետո կտրենք»։
Cross-shard-join-ները տաք հարցման ճանապարհին։
Read-after-write քաղաքականության բացակայությունը (լողացող ուղիներ)։
Համապատասխան սխեմաները «կոտրող» շարդինգի բանալիները։
Multi-leader դրամական հաշիվների համար առանց խիստ ֆինանսական հակամարտությունների։
Ոչ PITR/DR-ը անհնար է վերականգնվել տրամաբանական սխալից հետո։
Արդյունքները
Կրկնօրինակումը լուծում է ընթերցանությունն ու անկայունությունը, շարդինգը 'ձայնագրությունները և ծավալը։ iGaming-ում հաջողակ ճարտարապետությունը պարզ SLO և PACELC փոխզիջումներ են, շարդինգի կայուն բանալիները, նվազագույն քրոսային-շարդային համակարգումը (սագա 2PC-ի փոխարեն), read-after-write կարգապահությունը, որը կարգադրվել է onault-resharding և DR-ուսուցումները։ Այս մոտեցումը մեծանում է ածխաջրածինների պիկի տակ, դիմանում է տվյալների ավելացման կարգավորող սահմանափակումներին և մնում է կանխատեսելի շահագործման մեջ։