GH GambleHub

Sharding და მონაცემთა ბაზის რეპლიკაცია

Sharding და მონაცემთა ბაზის რეპლიკაცია

1) რატომ არის ეს აუცილებელი?

როდესაც ვერტიკალური BD განახლება ეყრდნობა CPU/IO/RAM ან SPOF ხდება ერთი მტევანი, არსებობს რეპლიკაცია (კითხვისთვის/NA) და შარდვა (ჩანაწერის/მონაცემების განაწილებისთვის). მიზნები:
  • გამტარუნარიანობა (ჰორიზონტალური ზრდა write QPS).
  • წვდომა (სწრაფი failover, ერთი უკმარისობის წერტილის არარსებობა).
  • მონაცემთა ლოკალიზაცია (მულტფილმის რეგიონი, დაბალი ლატენტობა).
  • ხმაურიანი მეზობლების იზოლაცია (ცხელი tenants/hot keys).

2) ძირითადი ტერმინები და თანმიმდევრობის მოდელები

Primary/Leader Replica/Follower: ჩანაწერი ლიდერზე, კითხვა რეპლიკებზე.
სინქრონული რეპლიკაცია: გარიგების დადასტურება N კვანძებზე ჩაწერის შემდეგ (დაბალი RPO, ლატენტობის ზემოთ).
ასინქრონული: ლიდერი აფიქსირებს კომუნას და მოგვიანებით აგზავნის ლოგს (RPO> 0, დაბალი ლატენტობა).
Quoromnaya (Raft/Paxos): ჩაწერა უმეტეს კვანძებზე; ერთი ჟურნალი, ავტომატური ლიდერი.
Read-after-write: გარანტირებული კითხვა მისი ჩანაწერებისთვის (იხ. § 5).

CAP გაყიდვაში შემდეგნაირად ვკითხულობთ: ქსელის პრობლემებით, თქვენ ირჩევთ კოორდინაციას (CP) ან წვდომას (AP) კრიტიკულ ოპერაციებზე, ხშირად აერთიანებთ დონეს სხვადასხვა გზაზე.


3) რეპლიკაცია: ვარიანტები და პრაქტიკა

3. 1 ფიზიკური და ლოგიკური

ფიზიკური (WAL/redo/binlog): ბლოკის ჟურნალთან უფრო ახლოს, მარტივი და სწრაფი; შემოიფარგლება ჰომოგენური ტოპოლოგიით/ვერსიით.
ლოგიკური: DML/DDL ნაკადი სტრიქონების/ცხრილების დონეზე; საშუალებას გაძლევთ ნაწილობრივ შენიშვნები, მიგრაცია ვერსიებს შორის, CDC DWH/ნაკადისთვის.

3. 2 კონფიგურაცია და კონტროლი

აკონტროლეთ lag (დრო/ბაიტი/LSN).
შეზღუდეთ ცხელი სტენდები და გრძელი რეპლიკების მოთხოვნები (ისე, რომ არ შეაჩეროთ VACUUM/დასუფთავება).
MySQL - GTID და Orchestrator- ისთვის; для 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 (აქტიური) - თავიდან აიცილოთ OLTP მკაცრი კონფლიქტის მართვის გარეშე.
Érum კასეტა (რაფტი) - CockroachDB/Yugabyte/PG-Raft სუპერსტრუქტურები.


4) Read/Write Split და მარშრუტიზაცია

ყოველთვის დაწერე ლიდერი; წაიკითხეთ შენიშვნებიდან, მაგრამ გაითვალისწინეთ lag.

Read-after-write სტრატეგიები:

1. Session Stickiness: წარმატებული ჩაწერის შემდეგ, კლიენტი ლიდერს კითხულობს 'OST' - ში.

2. LSN/GTID კარიბჭე: კლიენტი აცნობებს „მე არ მინდა მოხუცი LSN = X“, როუტერი აგზავნის რეპლიკზე, რომლის LSN-X- ს.

3. Stale-ok: ზოგიერთი მოთხოვნა საშუალებას იძლევა მოძველებული მონაცემები (დირექტორიები/ფირები).

ინსტრუმენტები: PgBouncer/Pgpool-II (Postgres), ProxySQL/MaxScale (MySQL), Vitess (ხარის მარშრუტი).

LSN კარიბჭის მაგალითი (იდეა): შეინარჩუნეთ 'pg _ current _ wal _ lsn ()' 'HTTP Heder/cook- ში და მოითხოვეთ რეპლიკა' pg _ last _ wal _ replay _ lsn () Router- დან.


5) შარდინგის სტრატეგია

5. 1 გასაღები

კლავიშმა უნდა უზრუნველყოს მოთხოვნის ერთგვაროვნება და ადგილმდებარეობა:
  • Hash 'tenant _ id '/' user _ id' - თანაბრად, მაგრამ ართმევს range სკანებს.
  • Range დროულად/ID შესანიშნავია დროის სერიის/არქივისთვის, მაგრამ ცხელი შუქის რისკი.
  • Consistent hashing - ამარტივებს ხუმრობის დამატებას/მოცილებას.
  • ინდიკატორი/lookup ცხრილი არის მოქნილი (ნებისმიერი ალგორითმი), მაგრამ კიდევ ერთი ცხრილი/ქეში.

5. 2 შაბლონები

Shared-nothing: თითოეული საშინელება არის ცალკეული BD/კასეტა, აპლიკაციამ იცის მარშრუტიზაცია.
Middleware sharding: Vitess (MySQL), Citus (Postgres), Proxy დონე მალავს ტოპოლოგიას.
ფედერაცია: მონაცემთა დომენების გამიჯვნა სერვისებზე (კატალოგი, პაიმენტები, აუტი).

5. 3 კომპოზიციური გასაღებები

გამოიყენეთ საკვანძო სივრცე: '{tenant}: {entity: {id' და შეინახეთ იგი განაცხადსა და ქეში. Для Postgres — hash partitioning + LIST/RANGE subpartition.

PostgreSQL წვეულება (ფრაგმენტი):
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) იდენტიფიკატორის თაობა

თავიდან აიცილეთ „ცხელი“ ერთფეროვანი ავტო ინვესტიციები შარდინგზე.
გამოიყენეთ Snowflake მსგავსი 64 ბიტიანი ID (დრო + region + shard + seq) ან ULID/KSUID (ერთფეროვნება და განაწილება).
Для Postgres — sequence per shard; MySQL- სთვის - auto _ increment _ increment/offset (სხვადასხვა ოფსეტები შარდების ლიდერებზე).


7) ონლაინ გადაკეთება და მიგრაცია

საკვანძო პრინციპები: ორმაგი ჩაწერა, იდემპოტენტურობა, დროებითი ორმაგი მარშრუტი.

ნაბიჯები (განზოგადებული):

1. დაამატეთ ახალი ხიბლი/კასეტა.

2. ჩართეთ dul read (თანმიმდევრულობის შემოწმება).

3. ჩართეთ ორმაგი write (ორივე საშინელებაში), დააფიქსირეთ განსხვავებები.

4. დააკვირდით ისტორიულ მონაცემებს (ბრძოლები, ლოგიკური რეპლიკაცია/CDC).

5. გადაიტანეთ „სიმართლის წყარო“ ახალ ხიბლში; დატოვეთ „კუდის“ სინქრონიზაცია.

6. გამორთეთ ძველი.

ინსტრუმენტები: Vitess Resharding, Citus move shards, pg _ logical/pgoutput, Debezium (CDC), gh-ost/pt-online-schema-chanananage (DDDDd).


8) მულტფილმის რეგიონი და განაწილება

Leader-follower per region: ადგილობრივი კითხვები, ჩაწერა - გლობალური ლიდერის მეშვეობით (მარტივი მოდელი, მაგრამ cross-region RTT).
Multi-leader: ჩანაწერი ორივე რეგიონში - საჭიროა კონფლიქტი-მერჯინგი (Timestamp/ვერსია/CRDT).
True distributed SQL (Raft): CockroachDB/Yugabyte - მონაცემები „მიბმული“ რეგიონში, მოთხოვნები მიდის ადგილობრივ კვორუმში.

რეკომენდაციები:
  • ფული/შეკვეთები - CP (კვორუმი/ლიდერი), კატალოგები/ფირები - AP (ქეში, ღონისძიება).
  • ყოველთვის დაგეგმეთ write fencing (უნიკალური გასაღებები/ვერსია) შესაძლო split-brain.

9) შესაბამისობა პრაქტიკაში

Read your-writes: ლიდერი ან შენიშვნა, რომელიც LSN/GTID „დაიჭირა“.
Monotonic reads: LSN- ის ბოლო წაკითხული „არ არის უფრო ძველი“.
Write-conflict control: `SELECT... განახლება ', ვერსიები (' xmin '/' rowversion '), UPSERT ვერსიის შემოწმებით.
Idempotence: idempotent- ის გასაღებები გადახდაზე/მოვლენებზე.


10) დაკვირვება, SLO და ალერტები

რეპლიკების ლაგი: დრო (წამი), LSN distance (bytes), seconds _ behind _ master (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).
Dashboards: per-shard დატვირთვა, „ცხელი“ shards, გასაღებების განაწილება.


11) Bacaps, PITR და DR

სრული bacap + WAL/binlog PITR- ისთვის (წერტილოვანი დროის ჩანაწერები).
შეინახეთ სხვა რეგიონში/ღრუბელში, რეგულარულად გააკეთეთ restore ტესტები.
შარდისთვის - შეთანხმებული „გაჭრა“ (დროის კოორდინაცია/LSN) ან აპლიკაციური იდემპოტენტობა აღდგენის დროს.
RPO/RTO არის რეგისტრირებული და ტესტირებული თამაშის დღეებში.

PostgreSQL base backup (იდეა):
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).
პანიკის ღილაკი: გლობალური 'READ ONLY' ინციდენტის/გამოძიების დროს.


13) ხელსაწყოები და აგურები

PostgreSQL: Patroni (HA), PgBouncer (pooling/RO-routing), repmgr, pgBackRest/Barman (бэкап), Citus (шардинг), pglogical/Logical Replication, pgbadger/pg_stat_statements.
MySQL: Orchestrator (ტოპოლოგია/auto-failover), ProxySQL/MaxScale (მარშრუტი), Percona XtraBackup (bacap), Replicacecititititition/ition/ion-ion-ion-ion-ion-ion-ion-ion-ion-ist-Inde-ive, ve, ve, ve, ve, vResharding).
Distributed SQL: CockroachDB, YugabyteDB (კვორუმი, ჩაშენებული შარდინგი/გეოლოკაცია).
CDC: Debezium + Kafka/Pulsar მოვლენებისთვის/ETL.


14) ანტი შაბლონები

Single-primary გარეშე მანქანა-failover და DR ტესტების გარეშე.
„ჯადოსნური“ read-split, ლაგის გამოკლებით, არის ფანტომური შეცდომები/საეჭვო შეცდომები.
შარდინგი „შარდინგის გულისთვის“: ნაადრევი გართულება ვერტიკალური სკეიტის/ინდექსების/ქეშის ნაცვლად.
ცხელი დიაპაზონი (დროის დიაპაზონი) time-bucket/hash-salt გარეშე - ერთი საშინელება დნება.
OLTP- ში ათეულობით ხარის თავზე 2PC გლობალური გარიგება არის მაღალი p99 კუდი და ხშირი დაბლოკვა.
მიგრაციის დროს ორმაგი write/dul-read- ის არარსებობა არის ზარალი/რასინქრონი.
DDL გაყიდვაში, ონლაინ ინსტრუმენტების გარეშე და თავსებადობის ჩარტების გარეშე.


15) განხორციელების სიის სია (0-60 დღე)

0-15 დღე

განსაზღვრეთ SLO BD, RPO/RTO.
ჩართეთ რეპლიკაცია, ლაგის მონიტორინგი, საბაზო ჩანთები + PITR.
შეიყვანეთ როუტერი (PgBouncer/ProxySQL) და read-after-write პოლიტიკა.

16-30 დღე

შეარჩიეთ შარდინგის სტრატეგია, აღწერეთ გასაღებები და სქემები.
გადამუშავების ინსტრუმენტების მომზადება (Vitess/Citus/CDC).
სერვისების/ცხრილების კატალოგი, რომელზეც აღინიშნება „read-stale-ok“ vs „strict“.

31-60 დღე

დაიწყეთ pilot shard, dul read და backfill.
თამაშის დღე: failover ლიდერი, აღდგენა PITR- დან, რეგიონის შეცვლა.
მოხსენებების ავტომატიზაცია ცხელი ხუჭუჭა გასაღებებზე და არათანაბარი.


16) სიმწიფის მეტრიკა

კრიტიკული კითხვებისთვის Replica lag p95 <სამიზნე (მაგალითად, 500 მმ).
წარმატებული DR ტესტები - 1/კვარტალი (Restore - RTO, RPO- ს დაკარგვა).
დატვირთვის განაწილება შარდში: დისბალანსი <20% QPS/შენახვის ობიექტში.
მოთხოვნის წილი სტრატეგიული კონსულტაციით, სწორად მარშრუტიზებული, = 100%.
Zero-data-loss ინციდენტებში, რომლებიც მოითხოვს CP გარანტიებს (ფული/შეკვეთები).
ონლაინ DDL/მიგრაციის გარეშე, თავსებადობის დროშებით.


17) რეცეპტების მაგალითები

Hash-salt for 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) დასკვნა

შარდინგი და რეპლიკაცია არა მხოლოდ ტექნოლოგია, არამედ პროცესებია: მარშრუტიზაცია თანმიმდევრულობის გათვალისწინებით, მიგრაციის დისციპლინა (ორმაგი-write/read, backfill), რეგულარული DR ტესტები და lag/ცხელი ხუმრობების დაკვირვება. დაიწყეთ მარტივი leader - replica + read-after-write, შემდეგ დაამატეთ sharding, სადაც მას ნამდვილად სჭირდება დატვირთვის პროფილი. გამოიყენეთ მზა პლატფორმები (Vitess/Citus/Distributed SQL) და შეინარჩუნეთ ბიზნესის კრიტიკული მონაცემები CP რეჟიმში - ასე რომ, ბაზა შეწყვეტს ბოთლის კისერს და გახდება პლატფორმის პროგნოზირებადი, ელასტიური საფუძველი.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.