डेटाबेस शार्डिंग और प्रतिकृति
डाटाबेस शार्डिंग और प्रतिकृति
1) आपको इसकी आवश्यकता क्यों है
जब सीपीयू/आईओ/रैम या एक क्लस्टर के खिलाफ डेटाबेस का ऊर्ध्वाधर उन्नयन समाप्त हो जाता है तो एसपीओएफ, प्रतिकृति (रीड/एचए के लिए) और शार्डिंग (लिखने/डेटा वितरण के लिए) आते हैं। उद्देश्य:- थ्रूपुट (QPS क्षैतिज विकास लिखें)।
- उपलब्धता (तेजी से विफल, विफलता का कोई एक बिंदु नहीं)।
- डेटा स्थानीयकरण (बहु-क्षेत्र, कम विलंबता)।
- शोर करने वाले पड़ोसियों का अलगाव (गर्म किरायेदार/गर्म कुंजी)।
2) बुनियादी शर्तें और स्थिरता मॉडल
प्राथमिक/नेता - प्रतिकृति/अनुयायी: नेता पर लिखें, प्रतिकृतियों पर पढ़ें।
तुल्यकालिक प्रतिकृति: एन नोड्स (कम आरपीओ, उच्च विलंबता) पर लिखने के बाद लेनदेन की पुष्टि।
अतुल्यकालिक: नेता प्रतिबद्ध है और बाद में लॉग भेजता है (RPO> 0, कम विलंबता)।
कोरम (बेड़ा/पैक्सोस): अधिकांश नोड्स को लिखना; एक लॉग, स्वचालित नेता।
रीड-आफ्टर-राइट: इसके रिकॉर्ड्स की गारंटी (देखें) 5)।
हम इस तरह की बिक्री में सीएपी पढ़ ते हैं: नेटवर्क समस्याओं के मामले में, आप महत्वपूर्ण संचालन के लिए स्थिरता (सीपी) या उपलब्धता (एपी) चुनते हैं, अक्सर विभिन्न रास्तों पर स्तरों का संयोजन करते हैं।
3) प्रतिकृति: विकल्प और व्यवहार
3. 1 भौतिक और तार्किक
भौतिक (WAL/redo/binlog): ब्लॉक लॉग के करीब, सरल और तेज; सजातीय टोपोलॉजी/संस्करण तक सीमित।
लॉजिकल: DML/DDL स्ट्रीम पंक्ति/तालिका स्तर पर; आंशिक प्रतिकृतियाँ, क्रॉस-वर्जन माइग्रेशन, DWH/स्ट्रीमिंग के लिए CDC की अनुमति देता है
3. 2 सेटअप और प्रबंधन
लैग मॉनिटर करें (समय/बाइट्स/एलएसएन)।
प्रतिकृतियों पर हॉट-स्टैंडबाय प्रतिक्रिया और लंबे अनुरोधों को सीमित करें (ताकि VACUUM/सफाई को अवरुद्ध न करें)।
MySQL - GTID और ऑर्केस्ट्रेटर के लिए; для PostgreSQL - पैट्रोनी/प्रतिकृति स्लॉट, synchronous_standby_names।
PostgreSQL (तुल्यकालिक प्रतिकृति, टुकड़ा):sql
-- on leader
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; -- restart
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
3. 3 टोपोलॉजी
1→N (नेता → प्रतिकृति) + कैस्केड (प्रतिकृति आगे विलीन हो जाती है)।
बहु-प्राथमिक (सक्रिय-सक्रिय) - सख्त संघर्ष प्रबंधन के बिना OLTP में बचें।
कोरम क्लस्टर (बेड़ा) - कॉकरोचडीबी/युगाबाइट/पीजी-रफ ऐड-ऑन।
4) पढ़ें/लिखें स्प्लिट और रूटिंग
हमेशा एक नेता के रूप में लिखें; संकेत से पढ़ें, लेकिन अंतराल पर विचार करें।
पढ़ ने के बाद लिखने की रणनीति:1. सत्र चिपचिपाहट: एक सफल रिकॉर्डिंग के बाद, ग्राहक 'टी' के दौरान नेता से पढ़ ता है।
2. LSN/GTID गेट: क्लाइंट का कहना है कि "मैं पुराना LSN = X नहीं प्राप्त करना चाहता हूं", राउटर प्रतिकृति को भेजता है, जिसका LSN ≥ X.
3. बासी-ओके: कुछ प्रश्न बासी डेटा (निर्देशिका/टेप) की अनुमति देते हैं।
उपकरण: Pgbouncer/Pgpool-II (Postgres), ProxySQL/MaxScale (MySQL), Vitess (शार्ड रूटिंग)।
एक LSN गेट (विचार) का उदाहरण: 'pg _ corner _ wal _ lsn ()' को HTTP हेडर/कुकी पर सहेजें और राउटर को 'pg _ last _ wal _ repay _ lsn () ≥ LSN' के साथ प्रतिकृति बनाने की आवश्यकता है।
5) शार्डिंग रणनीतियाँ
5. 1 कुंजी चयन
कुंजी अनुरोधों की एकरूपता और इलाके को सुनिश्चित करेगी:- 'किरायेदार _ id '/' user _ id' द्वारा हैश समान रूप से, लेकिन रेंज स्कैन से वंचित करता है।
- समय/आईडी में रेंज - समय-श्रृंखला/संग्रह के लिए महान, लेकिन हॉट-शार्ड जोखिम।
- लगातार हैशिंग - शार्क को जोड़ ना/हटाना आसान बनाता है।
- निर्देशिका/लुकअप तालिका - लचीला (कोई एल्गोरिथ्म), लेकिन अन्य तालिका/कैश।
5. 2 पैटर्न
साझा-कुछ भी नहीं: प्रत्येक शार्ड एक अलग डेटाबेस/क्लस्टर है, एप्लिकेशन रूटिंग जानता है।
मिडिलवेयर-शार्डिंग: विटेस (MySQL), सिटस (पोस्टग्रेस), प्रॉक्सी-लेवल टोपोलॉजी छिपाता है।
फेडरेशन: सेवाओं द्वारा डेटा डोमेन का पृथक्करण (कैटलॉग, भुगतान, ऑथ)।
5. 3 समग्र कुंजियाँ
कुंजी स्थान का उपयोग करें: '{tenant}: {entity}: {id}' और इसे अनुप्रयोग और कैश में संग्रहीत करें. Для पोस्टग्रेस - हैश पार्टिशनिंग + LIST/RANGE सबपार्टिशन।
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) आईडी पीढ़ी
शार्डिंग पर "हॉट" नीरस ऑटो-वेतन वृद्धि से बचें।
स्नोफ्लेक जैसे 64-बिट आईडी (समय + क्षेत्र + शार्ड + seq) या ULID/KSUID (एकरसता और वितरण) का उपयोग करें।
Для पोस्टग्रेस - प्रति शार्ड अनुक्रम; MySQL के लिए - ((शार्द नेताओं पर विभिन्न ऑफसेट)।
7) ऑनलाइन ओवरशेयरिंग और माइग्रेशन
प्रमुख सिद्धांत: दोहरे लेखन, पहचान, अस्थायी दोहरे मार्ग।
चरण (सामान्यीकृत):1. नया शार्ड/क्लस्टर जोड़ें।
2. डुअल रीड (स्थिरता जाँच) सक्षम करें।
3. दोहरे लेखन (दोनों शार्क में), रिकॉर्ड विसंगतियों को शामिल करें।
4. बैकफिल ऐतिहासिक डेटा (बैच, तार्किक/सीडीसी प्रतिकृति)।
5. एक नए शार्ड में "सत्य का स्रोत" स्विच करें; "पूंछ" तुल्यकालन छोड़ दें।
6. पुराने को बंद करो।
उपकरण: Vitess Resharding, Citus चाल shards, pg_logical/pgoutput, Debezium (CDC), gh-ost/pt-online-schema-change (ताले के बिना DDL)।
8) बहु-क्षेत्र और भू-वितरण
प्रति क्षेत्र नेता-अनुयायी: वैश्विक नेता (सरल मॉडल, लेकिन क्रॉस-क्षेत्र आरटीटी) के माध्यम से स्थानीय पढ़ ता है, लिखता है
बहु-नेता: दोनों क्षेत्रों में रिकॉर्डिंग - आपको संघर्ष-मेरिंग (टाइमस्टैम्प/संस्करण/सीआरडीटी) की आवश्यकता है।
सही वितरित SQL (बेड़ा): CockroachDB/Yugabyte - डेटा इस क्षेत्र से "चिपका हुआ" है, प्रश्न स्थानीय कोरम में जाते हैं।
सिफारिशें:- धन/आदेश - सीपी (कोरम/नेता), निर्देशिका/टेप - एपी (कैश, अंतिम)।
- हमेशा एक संभावित विभाजन-मस्तिष्क के साथ बाड़ लगाने (अद्वितीय कुंजी/संस्करण) लिखने की योजना बनाएं
9) व्यवहार में निरंतरता
पढ़ें-आपके लिखते हैं: एलएसएन/जीटीआईडी के साथ नेता या क्यू जो "पकड़ागया"।
मोनोटोनिक पढ़ ता है: अंतिम एलएसएन पढ़ ने की तुलना में "कोई पुराना नहीं"।
विरोध नियंत्रण लिखें: 'चुनें... अद्यतन के लिए ', संस्करण (' xmin '/' rowversion '), संस्करण जाँच के साथ UPSERT।
पहचान: भुगतान/घटनाओं पर पहचान कुंजी।
10) अवलोकन, एसएलओ और अलर्ट
प्रतिकृति लैग: समय (सेकंड), एलएसएन दूरी (बाइट्स), seconds_behind_master (MySQL)।
जबरन रोलबैक/संघर्ष, प्रतिकृति त्रुटियां।
p95/p99 विलंबता по मार्ग (पढ़ें नेता बनाम प्रतिकृति, लिखें)।
थ्रूपुट: TPS/लॉक/रो-कॉन्टेबल्स।
Bloat/VACUUM (PG), InnoDB बफर पूल हिट अनुपात (MySQL)।
डैशबोर्ड: प्रति-शार्ड लोड, "हॉट" शार्क, प्रमुख वितरण।
11) बैकअप, पीआईटीआर और डीआर
PITR (प्वाइंट-इन-टाइम रिकवरी) के लिए पूर्ण बैकअप + WAL/binlog।
दूसरे क्षेत्र/क्लाउड में स्टोर करें, नियमित रूप से परीक्
शार्क के लिए, एक सुसंगत "स्लाइस" (समय समन्वय/एलएसएन) या वसूली पर आवेदनकर्ता की पहचान।
RPO/RTO को गेम-डे पर लिखा और परीक्षण किया जाता है।
PostgreSQL बेस बैकअप (विचार):bash pg_basebackup -D/backups/base -X stream -C -S slot_replica_1 WAL archiving via archive_command or pgBackRest/Barman
12) सुरक्षा और पहुंच
VPC/ACL द्वारा विभाजन, प्रॉक्सी द्वारा mTLS।
न्यूनतम अधिकारों के सिद्धांत पर भूमिकाएं/अनुदान; व्यक्तिगत उपयोगकर्ता प्रति शार्ड/भूमिका
ऑडिट डीडीएल/डीसीएल, प्रतिकृतियों पर "भारी" अनुरोधों पर सीमित है।
विश्राम (KMS) और पारगमन (TLS) में एन्क्रिप्शन।
पैनिक बटन: घटना/जांच की अवधि के लिए ग्लोबल 'रीड ओनली'।
13) उपकरण और ईंटें
PostgreSQL: Patroni (HA), Pgbouncer (पूलिंग/RO-routing), Repmgr, pgBackRest/Barman (бэкап), Citus (шардинг), pglogical/logical Replication, pgbadger/pg_stat_statements।
MySQL: ऑर्केस्ट्रेटर (टोपोलॉजी/ऑटो-फेलओवर), प्रॉक्सीस्क्यूएल/मैक्सस्केल (रूटिंग), पेरकोना एक्सट्राबैकअप (बैकअप), ग्रुप रेप्लिकेशन/इनोडीबी क्लस्टर, विटेस (शार्डिंग/रेसिंग)।
वितरित SQL: CockroachDB, YugabyteDB (कोरम, बिल्ट-इन शार्डिंग/जियोलोकेशन)।
सीडीसी: घटनाओं/ईटीएल के लिए डेबेजियम + काफ्का/पल्सर।
14) एंटी-पैटर्न
ऑटो-फेलओवर के बिना और डीआर परीक्षणों के बिना एकल-प्राथमिक।
"मैजिक" लैग-फैंटम त्रुटियों/संदिग्ध कीड़े को छोड़ कर रीड-स्प्लिट।
शार्डिंग "शार्डिंग के लिए": ऊर्ध्वाधर पैमाने/सूचकांक/कैश के बजाय समय से पहले जटिलता।
समय-बाल्टी/हैश-नमक के बिना हॉट रेंज (टाइम-रेंज) - एक शार्ड पिघलता है।
वैश्विक लेनदेन - OLTP में दर्जनों शार्ड के शीर्ष पर - उच्च p99 पूंछ और लगातार ताले।
माइग्रेशन के दौरान डुअल-राइट/डुअल-रीड की कमी → सिंक से हानि/आउट।
ऑनलाइन टूल्स के बिना और बिना संगतता के फ्लैग्स में डीडीएल।
15) कार्यान्वयन चेकलिस्ट (0-60 दिन)
0-15 दिन
DB SLO, RPO/RTO को परिभाषित करें।
प्रतिकृति, लैग मॉनिटरिंग, बेसिक बैकअप + PITR सक्षम करें।
राउटर (PgBouncer/ProxySQL) और रीड-आफ्टर राइट पॉलिसी भरें.
16-30 दिन
एक शार्डिंग रणनीति चुनें, कुंजियों और योजनाओं का वर्णन करें।
ओवर-चार्जिंग टूल (Vitess/Citus/CDC) तैयार करें।
सेवाओं/तालिकाओं की निर्देशिका "रीड-स्टेल-ओके" बनाम "सख्त" चिह्नित है।
31-60 दिन
पायलट-शार्ड, डुअल-रीड और बैकफिल चलाएं।
खेल-दिवस: नेता विफल, पीआईटीआर से वसूली, क्षेत्र स्विच।
हॉट शार्ड कुंजी और असमानता रिपोर्टिंग स्वचालित करें।
16) परिपक्वता मैट्रिक्स
प्रतिकृति अंतराल p95 <लक्ष्य (उदा। 500 ms) महत्वपूर्ण पढ़ ने के लिए।
सफल डीआर परीक्षण 1/तिमाही (RTO को बहाल करें, RPO का नुकसान)।
शार्ड द्वारा वितरण लोड करें: असंतुलन <20% QPS/भंडारण द्वारा।
सख्त-स्थिरता के साथ अनुरोधों का प्रतिशत सही ढंग से रूट = 100%।
सीपी गारंटी (धन/आदेश) की आवश्यकता वाली घटनाओं में शून्य-डेटा-हानि।
ऑनलाइन DDL/माइग्रेशन डाउनटाइम के बिना, संगतता झंडे के साथ।
17) नुस्खा उदाहरण
समय-सीमा के लिए हैश-नमक (ताकि एक शार्क को गर्म न करें):sql
-- calculate bucket = hash (user_id)% 16, store (bucket, created_at)
PARTITION BY LIST (bucket) SUBPARTITION BY RANGE (created_at)
रीड-माय-राइट्स मिडिलवेयर (स्यूडोकोड):
python lsn = db. leader_query("SELECT pg_current_wal_lsn()")
ctx. sticky_until = now()+5s ctx. min_lsn = lsn in the read router: select a replica with last_lsn> = ctx. min_lsn, otherwise the leader
Vitess VSchema (टुकड़ा):
json
{
"tables": {
"orders": { "column_vindexes": [{ "column": "tenant_id", "name": "hash" }] }
}
}
18) निष्कर्ष
शार्डिंग और प्रतिकृति न केवल एक तकनीक है, बल्कि प्रक्रियाएं भी हैं: स्थिरता-जागरूक मार्ग, प्रवासन अनुशासन (दोहरी-लिखना/पढ़ना, बैकफिल), नियमित डीआर परीक्षण, और लैग/हॉट शार्ड अवलोकन। एक सरल + रीड-आफ्टर-राइट leader→replica के साथ शुरू करें, फिर शार्डिंग जोड़ें जहां लोड प्रोफाइल को वास्तव में इसकी आवश्यकता होती है। तैयार किए गए प्लेटफार्मों (Vitess/Citus/वितरित SQL) का उपयोग करें और CP मोड में व्यवसाय-महत्वपूर्ण डेटा रखें - इस तरह आधार एक अड़ चन बन जाएगा और प्लेटफ़ॉर्म का एक पूर्वानुमान, लोचनात्मक नींव बन जाएगा।