GH GambleHub

वितरित ताले

1) क्यों (और कब) वितरित ताले की आवश्यकता है

वितरित अवरोधन एक तंत्र है जो कई क्लस्टर नोड्स के बीच एक महत्वपूर्ण खंड के लिए आपसी बहिष्कार की गारंटी देता है। विशिष्ट कार्य:
  • पृष्ठभूमि कार्य/छाया के लिए नेता चुनाव।
  • साझा संसाधन (फाइल मूवमेंट, स्कीमा माइग्रेशन, अनन्य भुगतान चरण) पर एकल कलाकार का प्रतिबंध।
  • समुच्चय (बटुआ/क्रम) का अनुक्रमिक प्रसंस्करण यदि अन्यथा पहचान/आदेश प्राप्त करना असंभव है।
जब लॉक का उपयोग न करना बेहतर हो:
  • यदि आप एक अज्ञात अपसर्ट कर सकते हैं, तो CAS (तुलना-और-सेट) या प्रति-कुंजी ऑर्डर कर सकते हैं।
  • यदि संसाधन कम्यूटेटिव संचालन (CRDT, काउंटर) की अनुमति देता है।
  • यदि समस्या को एक स्टोर में लेनदेन द्वारा हल किया जाता है।

2) धमकी मॉडल और गुण

असफलताएं और जटिलताएं:
  • नेटवर्क: देरी, विभाजन, पैकेट हानि।
  • प्रक्रियाएं: जीसी ठहराव, स्टॉप-द-वर्ल्ड, लॉक कैप्चर के बाद दुर्घटना।
  • समय: घड़ी बहाव और विस्थापन टूटने टीटीएल दृष्टिकोण।
  • पुनर्विचार: नेट के बाद "ज़ोंबी" प्रक्रिया सोच सकती है कि यह अभी भी महल का मालिक है।
वांछित गुण:
  • सुरक्षा: एक से अधिक मान्य स्वामी (सुरक्षा) नहीं।
  • उत्तरजीविता: ताला तब जारी किया जाता है जब मालिक विफल हो जाता है (जीवन)।
  • न्याय: कोई उपवास नहीं है।
  • घड़ी की स्वतंत्रता: शुद्धता दीवार-घड़ी (या बाड़ के टोकन द्वारा क्षतिपूर्ति) पर निर्भर नहीं करती है।

3) मुख्य मॉडल

3. 1 लीज (किराये का ताला)

ताला टीटीएल के साथ जारी किया जाता है। मालिक समाप्ति (दिल की धड़ कन/रखवाली) से पहले इसे नवीनीकृत करने के लिए बाध्य है।

पेशेवरों: आत्म-अवशोषण को दुर्घटनाग्रस्त करना।

जोखिम: यदि मालिक "अटक गया" है और काम करना जारी रखता है, लेकिन विस्तार खो दिया है, तो दोहरा स्वामित्व उत्पन्न हो सकता है

3. 2 तलवारबाजी टोकन

प्रत्येक सफल कब्जे के साथ, एक नीरस रूप से बढ़ ती संख्या जारी की जाती है। संसाधन उपभोक्ता (डेटाबेस, कतार, फ़ाइल भंडारण) टोकन की जांच करें और पुरानी संख्या के साथ संचालन को अस्वीकार करें।

यह टीटीएल/लीज और नेटवर्क विभाजन के लिए बेहद महत्वपूर्ण है - यह "पुराने" मालिक के खिलाफ सुरक्षा करता है।

3. 3 कोरम लॉक (सीपी सिस्टम)

वितरित आम सहमति का उपयोग किया जाता है (रफ/पैक्सोस; etcd/ZooKeeper/Consul), रिकॉर्ड एक सर्वसम्मति लॉग के साथ जुड़ा हुआ है - अधिकांश नोड्स के साथ कोई विभाजित मस्तिष्क नहीं है।

इसके अलावा: मजबूत सुरक्षा गारंटी।

माइनस: कोरम के प्रति संवेदनशीलता (जब यह खो जाता है, तो उत्तरजीविता लंगड़ीहोती है)।

3. 4 एपी लॉक (इन-मेमोरी/कैश + प्रतिकृति)

उदाहरण के लिए, एक रेडिस क्लस्टर। उच्च उपलब्धता और गति, लेकिन नेटवर्क विभाजन के लिए मजबूत सुरक्षा गारंटी के बिना। चोट के किनारे बाड़ लगाने की आवश्यकता होती है।

4) प्लेटफॉर्म और पैटर्न

4. 1 etcd/ZooKeeper/Consul (मजबूत ताले के लिए अनुशंसित)

पंचांग नोड्स (ZK) या सत्र/पट्टे (etcd): कुंजी मौजूद है जबकि सत्र जीवित है।

सत्र रखवाली; कोरम नुकसान - सत्र समाप्त होता है - ताला जारी किया जाता है।

प्रतीक्षा कतार के लिए अनुक्रम नोड्स (ZK 'EPHEMERAL _ EQUENTIAL')।

etcd पर स्केच (Go):
go cli, _:= clientv3. New(...)
lease, _:= cli. Grant(ctx, 10)            // 10s lease sess, _:= concurrency. NewSession(cli, concurrency. WithLease(lease. ID))
m:= concurrency. NewMutex(sess, "/locks/orders/42")
if err:= m. Lock(ctx); err!= nil { / handle / }
defer m. Unlock(ctx)

4. 2 रेडिस (साफ)

क्लासिक - 'SET कुंजी मान NX PX ttl'।

समस्याएं:
  • प्रतिकृति/feilover एक साथ मालिकों की अनुमति दे सकता है।
  • कई उदाहरणों से Redlock जोखिम को कम करता है, लेकिन समाप्त नहीं होता है; अविश्वसनीय नेटवर्क के साथ वातावरण में विवादास्पद है।

रेडिस को एक तेज समन्वय परत के रूप में उपयोग करना सुरक्षित है, लेकिन हमेशा लक्ष्य संसाधन में बाड़ लगाने के टोकन का पूरक होता है।

उदाहरण (लुआ-अनलॉक):
lua
-- release only if value matches if redis. call("GET", KEYS[1]) == ARGV[1] then return redis. call("DEL", KEYS[1])
else return 0 end

4. 3 डीबी ताले

PostgreSQL सलाहकार ताला: पोस्टग्रेस क्लस्टर (प्रक्रिया/सत्र) के भीतर लॉक करें।

यह अच्छा है जब सभी महत्वपूर्ण खंड पहले से ही एक ही डेटाबेस में हैं।

SQL:
sql
SELECT pg_try_advisory_lock(42); -- take
SELECT pg_advisory_unlock(42); -- let go

4. 4 फ़ाइल/क्लाउड ताले

+ ऑब्जेक्ट मेटाडेटा 'इफ-मैच' (ETag) स्थितियों के साथ लॉक - अनिवार्य रूप से CAS।

बैकअप/माइग्रेशन के लिए उपयुक्त।

5) सुरक्षा लॉक डिजाइन

5. 1 मालिक की पहचान

अनलॉक सत्यापन के लिए 'मालिक _ आईडी' (# प्रक्रिया # pid # start _ time नोड) + यादृच्छिक टोकन स्टोर करें।

बार-बार अनलॉक किसी और के लॉक को नहीं हटाना चाहिए।

5. 2 टीटीएल और एक्सटेंशन

TTL <(गलती का पता लगाने का समय) और महत्वपूर्ण खंड ऑपरेशन × स्पेयर का p99 ।

नवीकरण - समय-समय पर (उदाहरण के लिए, हर 'TTL/3'), समय सीमा के साथ।

5. एक चोट पर 3 तलवारबाजी टोकन

बाहरी संसाधन को संशोधित करने वाले अनुभाग को 'फेंसिंग _ टोकन' पास करना होगा।

सिंक (डीबी/कैश/स्टोरेज) स्टोर 'लास्ट _ टोकन' और छोटे लोगों को अस्वीकार करता है:
sql
UPDATE wallet
SET balance = balance +:delta, last_token =:token
WHERE id =:id AND:token > last_token;

5. 4 प्रतीक्षा कतार और न्याय

ZK - 'EPHEMERAL _ EQUENTIAL' और पर्यवेक्षकों में: ग्राहक निकटतम पूर्ववर्ती की रिहाई की प्रतीक्षा कर रहा है।

इत्यादि कुंजियों में संशोधन/संस्करण के साथ; 'mod _ revision' द्वारा आदेश।

5. 5 स्प्लिट-मस्तिष्क

सीपी दृष्टिकोण: कोरम के बिना, आप ताला नहीं ले सकते - सुरक्षा तोड़ ने की तुलना में खड़े होना बेहतर है।

एपी दृष्टिकोण: विभाजित द्वीपों में प्रगति की अनुमति है - बाड़ लगाना आवश्यक

6) नेता चुनाव

Etcd/ZK में, "नेता" एक विशेष महामारी कुंजी है; बाकी परिवर्तनों के लिए हस्ताक्षर किए गए

नेता दिल की धड़ कन लिखते हैं; नुकसान - फिर से चुनाव।

तलवारबाजी टोकन (युग/संशोधन संख्या) के साथ सभी नेता संचालन के साथ।

7) त्रुटियां और उनका प्रसंस्करण

ग्राहक ने ताला लगा दिया, लेकिन काम करने के लिए दुर्घटनाग्रस्त हो गया - आदर्श, कोई भी पीड़ित नहीं होगा; टीटीएल/सत्र जारी किया जाएगा.

कार्य के बीच में ताला समाप्त हो गया:
  • अनिवार्य प्रहरी: यदि विस्तार विफल रहता है, तो महत्वपूर्ण अनुभाग को बाधित करें और वापस रोल/क्षतिपूर्ति करें।
  • नहीं "बाद में खत्म": एक ताला के बिना, महत्वपूर्ण खंड जारी नहीं रखा जा सकता है।

एक लंबा ठहराव (जीसी/स्टॉप-द-वर्ल्ड) - विस्तार नहीं हुआ, दूसरे ने ताला लगा दिया। वर्कफ़्लो को स्वामित्व (रखवाली चैनल) और गर्भपात के नुकसान का पता लगाना चाहिए।

8) डेडलोकी, प्राथमिकताएं और उलटा

एक वितरित दुनिया में डेडलोकी दुर्लभ हैं (आमतौर पर एक महल होता है), लेकिन अगर कई महल हैं, तो लेने के एक ही क्रम का पालन करें (लॉक ऑर्डरिंग)।

प्राथमिकता उलटा: एक कम-प्राथमिकता वाला मालिक एक संसाधन रखता है जबकि उच्च-प्राथमिकता वाले इं समाधान: टीटीएल सीमा, प्रीमेशन (यदि व्यवसाय अनुमति देता है), संसाधन की शार्टिंग।

उपवास: निष्पक्षता के लिए प्रतीक्षा कतारों (ZK-उप-क्रम नोड्स) का उपयोग करें।

9) अवलोकन क्षमता

मेट्रिक्स:
  • 'lock _ axiare _ कुल {स्थिति = ठीक है' timeout 'error}'
  • 'लॉक _ होल्ड _ सेकंड {p50, p95, p99}'
  • 'फेंसिंग _ टोकन _ मान' (एकरसता)
  • 'लीज _ renew _ fail _ total'
  • 'split _ brain _ revented _ tomal' (कोरम की कमी के कारण अस्वीकार किए गए प्रयासों की संख्या)
  • 'प्रीमेप्शन _ टोटल', 'वेट _ क्यू _ लेन'
लॉग/ट्रेसिंग:
  • 'lock _ name', 'ocker _ id', 'ttl', 'ttl', 'प्रयास', 'प्रयास _ time _ ms', 'पथ' (для ZK), 'mod _ revision' (etcd)।
  • परिणाम के साथ "महत्वपूर्ण खंड रिलीज़" प्राप्त करें।
अलर्ट:
  • वृद्धि 'लीज _ renew _ fail _ total'।
  • 'lock _ hold _ selects {p99}'> SLO।
  • "अनाथ" ताले (दिल की धड़ कन के बिना)।
  • फूला हुआ प्रतीक्षा सूची।

10) केस स्टडी

10. 1 सुरक्षित रेडिस बाड़ के साथ ताला (छद्म)

1. हम टोकन काउंटर को एक विश्वसनीय स्टोर में स्टोर करते हैं (उदाहरण के लिए, पोस्टग्रेस/आदि)।

2. यदि 'SET NX PX' सफल होता है, तो हम टोकन को पढ़ ते हैं/वृद्धि करते हैं और डेटाबेस/सेवा में जांचे गए टोकन के साथ संसाधन में सभी बदलाव करते हैं।

python acquire token = db. next_token ("locks/orders/42") # monotone ok = redis. set("locks:orders:42", owner, nx=True, px=ttl_ms)
if not ok:
raise Busy()

critical op guarded by token db. exec("UPDATE orders SET... WHERE id=:id AND:token > last_token",...)
release (compare owner)

10. 2 etcd Mutex + वॉचडॉग (जाओ)

go ctx, cancel:= context. WithCancel(context. Background())
sess, _:= concurrency. NewSession(cli, concurrency. WithTTL(10))
m:= concurrency. NewMutex(sess, "/locks/job/cleanup")
if err:= m. Lock(ctx); err!= nil { /... / }

// Watchdog go func() {
<-sess. Done ()//loss of session/quorum cancel ()//stop working
}()

doCritical (ctx )//must respond to ctx. Done()
_ = m. Unlock(context. Background())
_ = sess. Close()

10. ZK में 3 नेतृत्व (जावा, क्यूरेटर)

java
LeaderSelector selector = new LeaderSelector(client, "/leaders/cron", listener);
selector. autoRequeue();
selector. start(); // listener. enterLeadership() с try-finally и heartbeat

10. समय सीमा के साथ 4 पोस्टग्रेस सलाहकार लॉक (SQL + ऐप)

sql
SELECT pg_try_advisory_lock(128765); -- attempt without blocking
-- if false --> return via backoff + jitter

11) टेस्ट प्लेबुक (गेम डेज़)

कोरम नुकसान: 1-2 आदि नोड्स अक्षम करें - लॉक लेने का प्रयास पास नहीं होना चाहिए।

जीसी-पॉज ़/स्टॉप-द-वर्ल्ड: कृत्रिम रूप से मालिक के प्रवाह में देरी - जांच करें कि प्रहरी काम को बाधित कर रहा है।

स्प्लिट-ब्रेन: मालिक और महल के पक्ष के बीच नेटवर्क अलगाव का अनुकरण - नए मालिक को एक उच्च बाड़ लगाने का टोकन मिलता है, पुराने को नीले रंग से खारिज कर दिया जाता है।

घड़ी तिरछा/बहाव: घड़ी को मालिक (रेडिस/पट्टे के लिए) से दूर ले जाएं → सुनिश्चित करें कि टोकन/चेक द्वारा शुद्धता सुनिश्चित की जाए।

रिलीज से पहले क्रैश: प्रक्रिया क्रैश → लॉक टीटीएल/सत्र के माध्यम से जारी किया जाता है।

12) एंटी-पैटर्न

बाहरी संसाधन तक पहुंचने के दौरान बिना बाड़ लगाए टीटीएल लॉक साफ करें।

शुद्धता के लिए स्थानीय समय पर भरोसा करें (कोई एचएलसी/तलवारबाजी नहीं)।

एक रेडिस मास्टर के माध्यम से एक फीलओवर के साथ और प्रतिकृतियों की पुष्टि के बिना ताले का वितरण।

अनंत महत्वपूर्ण खंड (TTL "उम्र के लिए")।

'मालिक _ id '/टोकन की जाँच किए बिना किसी और के लॉक को हटाया जा रहा है.

बैकऑफ + जिटर की कमी - प्रयासों का तूफान।

एक एकल वैश्विक ताला "सब कुछ के लिए" - संघर्षों का एक बैग; प्रमुख शार्डिंग बेहतर है।

13) कार्यान्वयन चेकलिस्ट

  • संसाधन प्रकार परिभाषित और CAS/कतार/पहचान के साथ वितरित किया जा सकता है।
  • तंत्र का चयन: सीपी के लिए etcd/ZK/Consul; रेडिस/कैश - केवल बाड़ लगाने के साथ।
  • कार्यान्वित: 'मालिक _ आईडी', टीटीएल + एक्सटेंशन, वॉचडॉग, सही अनलॉक।
  • बाहरी संसाधन बाड़ लगाने टोकन (एकरसता) की जाँच करता है।
  • एक नेतृत्व रणनीति और विफलता है।
  • कॉन्फ़िगर किए गए मेट्रिक्स, अलर्ट, लॉगिंग टोकन और संशोधन।
  • बैकऑफ + जिटर और अधिग्रहण टाइमआउट प्रदान किए जाते हैं।
  • खेल दिवस आयोजित: कोरम, विभाजन-मस्तिष्क, जीसी ठहराव, घड़ी तिरछा।
  • कई ताले लेने के लिए प्रक्रिया का प्रलेखन (यदि आवश्यक हो)।
  • ब्राउनआउट योजना - लॉक अनुपलब्ध होने पर क्या करना है।

14) एफएक्यू

प्रश्न: क्या 'सेट एनएक्स पीएक्स' रेडिस पर्याप्त लॉक है?

A: केवल तभी जब संसाधन बाड़ लगाने टोकन की जाँच करता है। अन्यथा, नेटवर्क विभाजन के साथ, दो मालिक संभव हैं।

प्रश्नः "डिफ़ॉल्ट रूप से" क्या चुनें?

A: सख्त गारंटी के लिए - etcd/ZooKeeper/Consul (CP)। एक डेटाबेस के अंदर आसान कार्यों के लिए - सलाहकार पोस्टग्रेस ताला। रेडिस - केवल बाड़ लगाने के साथ।

प्रश्न: कौन सा टीटीएल डालना है?

A: 'TTL ≥ p99 महत्वपूर्ण खंड अवधि × 2' और जल्दी से "लाश को साफ करने के लिए पर्याप्त है। "नवीनीकरण - हर 'TTL/3'।

प्रश्न: उपवास से कैसे बचें?

A: क्रम में प्रतीक्षा कतार (ZK अनुक्रमिक) या निष्पक्षता एल्गोरिथ्म; प्रयासों और निष्पक्ष योजना की सीमा।

प्रश्नः क्या मुझे समय तुल्यकालन की आवश्यकता है?

A: शुद्धता के लिए - नहीं (बाड़का उपयोग करें)। परिचालन पूर्वानुमेयता के लिए, हाँ (NTP/PTP), लेकिन लॉक लॉजिक के लिए दीवार-घड़ीपर भरोसा न करें।

15) कुल

विश्वसनीय वितरित ताले पट्टे + रखवाली के साथ कोरम स्तर (etcd/ZK/Consul) पर बनाए जाते हैं, और आवश्यक रूप से संसाधन के स्तर पर बाड़ लगाने टोकन द्वारा पूरक होते हैं। बाड़ लगाने के बिना कोई भी टीटीएल/रेडिस दृष्टिकोण एक विभाजन-मस्तिष्क जोखिम है। कारण और पहचान के बारे में पहले सोचें, ताले का उपयोग करें जहां यह उनके बिना असंभव है, माप, परीक्षण विफलता मोड - और आपके "महत्वपूर्ण खंड" केवल अर्थ में महत्वपूर्ण रहेंगे, न कि घटनाओं की संख्या में।

Contact

हमसे संपर्क करें

किसी भी प्रश्न या सहायता के लिए हमसे संपर्क करें।हम हमेशा मदद के लिए तैयार हैं!

इंटीग्रेशन शुरू करें

Email — अनिवार्य है। Telegram या WhatsApp — वैकल्पिक हैं।

आपका नाम वैकल्पिक
Email वैकल्पिक
विषय वैकल्पिक
संदेश वैकल्पिक
Telegram वैकल्पिक
@
अगर आप Telegram डालते हैं — तो हम Email के साथ-साथ वहीं भी जवाब देंगे।
WhatsApp वैकल्पिक
फॉर्मैट: देश कोड और नंबर (उदा. +91XXXXXXXXXX)।

बटन दबाकर आप अपने डेटा की प्रोसेसिंग के लिए सहमति देते हैं।