एकाधिक डेटाबेस / सर्वर का उपयोग कर डेटा के साथ बातचीत


18

अब तक मुझे जिन परियोजनाओं से निपटना पड़ा है उनमें से सभी को केवल एक ही सर्वर पर एकल डेटाबेस की आवश्यकता होती है। मैं इस बारे में अधिक सीखने में रुचि रखता हूं कि लोड को प्रबंधित करने में मदद करने के लिए कई डेटाबेस और / या सर्वरों को स्थानांतरित करने की आवश्यकता वाली परियोजनाओं को कैसे करना है। मुझे उच्च स्केलेबिलिटी के बारे में पता है , लेकिन मैं विशेष रूप से कुछ कोड उदाहरणों या अतिरिक्त संसाधनों में रुचि रखता हूं, जहां मैं विषय पर अधिक पढ़ सकता हूं।

उदाहरण के लिए:

  • कई डेटाबेस पर दो तालिकाओं के बीच कैसे जुड़ते हैं? (यहां एक कोड उदाहरण उपयोगी होगा)।
  • क्या ट्रैकिंग के लिए कोई विशेष रणनीति है कि कौन सी तालिकाएँ डेटाबेस में हैं?
  • क्या एप्लिकेशन कोड को यह जानने की जरूरत है कि एक या अधिक डेटाबेस कई सर्वरों में फैले हुए हैं? यदि नहीं, तो किस स्तर पर अनुरोध फ़िल्टर किए जाते हैं?
  • 1 डेटाबेस / 1 सर्वर सेटअप से आगे बढ़ने का समय कब है? ऐसा करना कितना आम है?

डेटाबेस प्रशासकों पर इस सवाल का बेहतर जवाब दिया जा सकता है । हालांकि, यहां वास्तव में इसके साथ कुछ भी गलत नहीं है, इसलिए मैं सिर्फ डीबीए मॉड के साथ जांच करने वाला हूं। यदि यह वहां उपयुक्त है, तो क्या आप इसे माइग्रेट करना चाहेंगे?
एडम लेअर

@AnnaLear - मुझे लगता है कि यह जवाबों पर निर्भर करता है। इस बिंदु पर, मैं इस मुद्दे के आवेदन पक्ष में अधिक रुचि रखता हूं, इसलिए अभी के लिए, मुझे लगता है कि यह यहां बेहतर हो सकता है।
पुण्योसोमीडिया

@AnnaLear ack, ओपी के साथ सहमत हैं अगर वे ऐप विशिष्ट कोड चाहते हैं।
22

जवाबों:


13

ठीक है, चलो इसे तोड़ दो:

  • कई डेटाबेस पर दो तालिकाओं के बीच कैसे जुड़ते हैं? (यहां एक कोड उदाहरण उपयोगी होगा)।

यह बहुत सीधा है। SQL ऑब्जेक्ट्स में एक से चार भाग के नामकरण सम्मेलन कहीं भी होते हैं:

Servername.databasename.schemaname.tablename

यदि आपके सभी टेबल एक ही डेटाबेस पर एक ही सर्वर पर हैं, एक ही मालिक / स्कीमा के साथ, आप पहले तीन भागों को अनदेखा कर सकते हैं और वे उपयोग कर सकते हैं जो आपके लिए सबसे अधिक उपयोग किए जाते हैं:

Select a.*,b.* from 
tableA a inner join 
tableB b on a.col1=b.col1

यदि आपकी कोई तालिका किसी भिन्न डेटाबेस में है और दोनों अपने डेटाबेस के लिए डिफ़ॉल्ट स्कीमा का उपयोग करते हैं, तो आप बस डेटाबेस को दूसरी तालिका में जोड़ते हैं:

Select a.*,b.* from 
tableA a inner join 
databaseC..tableB b on a.col1 = b.col1

यदि आप किसी तीसरे डेटाबेस में हैं, तो आप उन दोनों डेटाबेस नामों से अलग हैं, जिनका आप स्पष्ट रूप से उपयोग कर रहे हैं:

Select a.*,b.* from 
databaseD..tableA a inner join 
databaseC..tableB b on a.col1 = b.col1

यदि आप अलग-अलग स्कीमा और / या मालिकों का उपयोग करके समाप्त होते हैं, तो आप उन्हें इसमें जोड़ सकते हैं:

Select a.*,b.* from 
databaseD.john.tableA a inner join 
databaseC.accounting.tableB b on a.col1 = b.col1

और अंत में, यदि आप इसके बारे में बहुत सावधान हैं और एक बहुत अच्छा कारण है, तो आप किसी अन्य सर्वर पर एक (आमतौर पर छोटी) तालिका में शामिल हो सकते हैं:

Select a.* from 
databaseD.john.TableA a inner join 
ATLANTA.databaseC.accounting.tableB b on a.col1 = b.col1
  • 1 डेटाबेस / 1 सर्वर सेटअप से आगे बढ़ने का समय कब है? ऐसा करना कितना आम है? क्या ट्रैकिंग के लिए कोई विशेष रणनीति है कि कौन सी तालिकाएँ डेटाबेस में हैं?

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

इसलिए पहले अपने दूसरे प्रश्न का उत्तर देने के लिए, क्योंकि आपके पास आम तौर पर अलग-अलग डेटाबेस होने का एक कारण है, यह आपके सिस्टम के डिजाइन को जानने से काफी स्पष्ट होना चाहिए जहां कुछ है।

एक डेटाबेस से आगे बढ़ने के लिए कब / क्यों आवश्यक है। आमतौर पर यह व्यावसायिक नियमों, राजनीति और / या तकनीकी कारणों का मिश्रण है।

उदाहरण के लिए, जहां मैं काम करता हूं हमारे पास 4 सर्वरों में फैले 16 डेटाबेस हैं। हमारे पास एक MainDB, ImageDB, referencetableDB, HighvolumeTransactionDB, ReportingDB, StagingDB, ProcessingDB, ArchiveDB, FinancialDB है। वे अलग क्यों हैं के कुछ उदाहरण देने के लिए:

  • FinancialDB, संवेदनशील जानकारी
  • छवि DB, विशिष्ट अलग भंडारण और पुनर्प्राप्ति आवश्यकताओं
  • ReferenceDB, कम लेनदेन, उच्च पढ़ें
  • रिपोर्टिंग डेटा, बहुत अधिक पढ़ी गई, बहुत से अन्य डेटा के विपरीत विभिन्न अन्य वातावरणों को पुनर्स्थापित / प्रतिकृति करने की आवश्यकता है
  • StagingDB, कुछ भी स्थायी नहीं है, बस एक अस्थायी अस्थायी है जो हमारे पास अधिक नियंत्रण है
  • MainDB, अन्य सभी DB के साथ इंटरफेस है, लेकिन अंतर बैकअप की जरूरत है ... हम बाहर विभाजित
  • HighVolumeTransaction तालिकाओं, (जो अपेक्षाकृत क्षणिक हैं), अपने स्वयं के DB तक ताकि बैकअप उचित आकार रखने के लिए।
  • पुरालेख, मुख्य और रिपोर्टिंग से एक ही डेटा के बहुत सारे, लेकिन लंबे समय तक अवधारण अवधि और कठिन मार सवालों के साथ डेटा में गहरी खुदाई। यदि यह अभी भी Main / Reporting के साथ संयुक्त था, तो यह हमारे सिस्टम को नीचे गिरा देगा।

क्या एप्लिकेशन कोड को यह जानने की जरूरत है कि एक या अधिक डेटाबेस कई सर्वरों में फैले हुए हैं? यदि नहीं, तो किस स्तर पर अनुरोध फ़िल्टर किए जाते हैं?

एक व्यापक अर्थ में, वे शायद करते हैं। कम से कम उन्हें यह जानने की जरूरत है कि वे डेटाबेस कनेक्शन स्ट्रिंग में किस सर्वर की ओर इशारा कर रहे हैं। प्रसंस्करण, रिपोर्टिंग, मुख्य, आदि।

वहां से, उन्हें निष्पादित करने के लिए एक डेटाबेस संदर्भ की आवश्यकता होती है। आम तौर पर यह अनुप्रयोग के लिए सबसे अधिक इस्तेमाल किया जाने वाला एक होगा, हो सकता है कि आवेदन के एक डेटाबेस / एक सर्वर दिनों से मूल एक भी हो। आपके पास हर कॉल पर स्पष्ट रूप से डेटाबेस संदर्भ स्विच हो सकता है लेकिन इससे ऐप को बदले बिना डेटाबेस को समायोजित करना बहुत कठिन हो जाता है।

सामान्य, (या कम से कम, MY सामान्य), दृष्टिकोण हमेशा एक या शायद दो मुख्य डेटाबेस के माध्यम से उपयोग करना है।

फिर संग्रहीत प्रक्रियाओं के माध्यम से डेटाबेस के साथ इंटरफेस करने के लिए आवश्यक के रूप में अन्य डेटाबेस में विचार बनाएं।

इसलिए वर्णन करने के लिए:

मान लें कि आप एक ग्राहक की जनसांख्यिकीय जानकारी, बिक्री डेटा और क्रेडिट शेष प्राप्त करना चाहते हैं और यह मुख्य रूप से सभी तीन तालिकाओं में फैली हुई है जो कि मुख्य रूप से सभी मेनबीडी में हैं।

तो आप अपने ऐप से कॉल लिखें:

Select c.ClientName, c.ClientAddress, s.totalSales,f.CreditBlance from
Clients c join Sales s on c.clientid = s.clientid inner join AccountReceivable f on 
c.clientid=f.clientid where c.clientid = @clientid

बहुत बढ़िया। हालाँकि, अब किसी भी समय हम एक कॉलुमनाम बदल देते हैं, या किसी तालिका का नाम बदल / स्थानांतरित कर देते हैं, आपको ऐप कोड अपडेट करना होगा। इसलिए इसके बजाय हम दो काम करते हैं:
ग्राहक बनाएँ, बिक्री, खातासंग्रह दृश्य (आप चयन का उपयोग नहीं करेंगे * लेकिन मैं यहां प्रदर्शन कर रहा हूं)

Use MainDB
GO
Create view v_Clients as select * from Clients
Create view v_Sales as select * from Sales
Create view v_AccountReceivable as select * from AccountReceivable
Go

तो फिर हम एक संग्रहीत प्रक्रिया, spGetClientSalesAR भी बनाएंगे

Create proc spGetClientSalesAR @clientID int
as
Select c.ClientName as ClientName, 
       c.ClientAddress as ClientAddress, 
       s.totalSales as TotalSales, 
       f.CreditBlance as CreditBalance 
from
v_Clients c join v_Sales s 
    on c.clientid = s.clientid 
inner join v_AccountReceivable f 
    on c.clientid=f.clientid 
where c.clientid = @clientid

और अपने ऐप को कॉल करें।

अब जब तक मैं उस संग्रहित खरीद पर इंटरफ़ेस को नहीं बदलता, मैं बहुत कुछ कर सकता हूं जो मुझे बैकेंड डेटाबेस में ऊपर या बाहर पैमाने पर करने की आवश्यकता है।

चरम में, मैं अपने पुराने मेनडीबी को केवल शेल किए गए संग्रहीत प्रक्रियाओं का एक गुच्छा बना सकता था और इस तरह के विचार जो हमने बनाए उन विचारों के नीचे थे:

Create view v_Clients as select * from ServerX.DatabaseY.dbo.Clients
Create view v_Sales as select * from ServerQ.DatabaseP.dbo.Sales
Create view v_AccountReceivable as select * from ServerJ.DatabaseK.dbo.AccountReceivable

और आपके ऐप को कभी भी अंतर नहीं पता होगा, (तेजी से पाइप और अन्य चीजों के बीच अच्छी तरह से डेटा का अनुमान लगाते हुए)।

जाहिर है कि यह चरम है और मैं झूठ बोल रहा हूं अगर मैंने कहा कि सब कुछ इस तरह से योजनाबद्ध था, लेकिन संग्रहीत प्रक्रियाओं / विचारों का उपयोग करते हुए भले ही आप इसे करते हैं, फिर से काम करते समय आपको बहुत लचीलापन मिलेगा क्योंकि आपका ऐप अपने विनम्र एक डेटाबेस / एक सर्वर से बढ़ता है। इसकी शुरुआत हुई।


TetonSig - उत्तर के लिए धन्यवाद। मैं आपको पूर्ण इनाम (मैं यात्रा कर रहा था) देने के लिए समय पर प्रश्न पर वापस जाने में सक्षम नहीं था, लेकिन मैंने सवाल के लिए एक नया इनाम बनाया और इसे 24 घंटे में आपको देने में सक्षम होगा।
सदाचारियोमीडिया

वाह धन्यवाद। मैं सराहना करता हूँ। सवाल का जवाब देने में बहुत मज़ा आया।
TetonSig

5

जिस प्राथमिक तरीके से मैंने वेब-दुनिया में कई डेटाबेस सर्वरों का सामना किया है (क्योंकि सवाल PHP को टैग किया गया है) सेटअप है जहाँ एक 'मास्टर' (लिखने) डेटाबेस था, और फिर एक या एक से अधिक प्रतिकृति 'दास' (पढ़ें) डेटाबेस । डेटाबेस लेखन 'मास्टर' डेटाबेस के खिलाफ किया जाता है। उस डेटाबेस की सामग्री को 'दास' सर्वरों के पास वास्तविक समय में दोहराया जाता है। क्वेरी - विशेष रूप से गहन रिपोर्ट - फिर उन सर्वर पर लोड को शिफ्ट करने के लिए 'दास' डेटाबेस में से एक के खिलाफ चलाया जाता है। ध्यान रखें, कि विशेष रूप से सेटअप उन अनुप्रयोगों के लिए सबसे अच्छा है जिनमें बहुत अधिक रीड हैं, लेकिन बहुत अधिक नहीं। यह किसी भी तरह से चीजों को व्यवस्थित करने का एकमात्र तरीका नहीं है।


3

कई डेटाबेस पर दो तालिकाओं के बीच कैसे जुड़ते हैं? (यहां एक कोड उदाहरण उपयोगी होगा)।

वे नहीं हैं। NoSQL डेटाबेस बिल्कुल भी " जॉइन " नहीं करते हैं, और अगर आप SQL को RDBMS सर्वर में शामिल कर सकते हैं, तो आप प्रदर्शन ( वितरित कंप्यूटिंग के cf पतन ) को महत्व देना चाहते हैं ।

क्या ट्रैकिंग के लिए कोई विशेष रणनीति है कि कौन सी तालिकाएँ डेटाबेस में हैं?

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

यदि आप वास्तव में डेटाबेस को तार्किक रूप से विभाजित कर रहे हैं , न कि केवल भौतिक रूप से, तो आपके DAL या ORM में परिभाषित मैपिंग यह घोषित करेगी कि कौन-सी तालिकाएँ किस डेटाबेस में हैं।

NoSQL डेटाबेस विभाजन समाधानों का मिश्रण है। कभी-कभी यह "टेबल" (या अधिक सामान्यतः, "संग्रह") होता है जो विभाजन हो जाता है। दूसरी बार यह "पंक्तियाँ" (या "दस्तावेज़") हैं। कुछ मामलों में यह वास्तव में कॉलम है , जैसा कि HBase जैसे स्तंभ-उन्मुख डेटाबेस में है। यह पूरी तरह से आपके द्वारा उपयोग की जा रही तकनीक पर निर्भर करता है। एक बात जो इन सभी के पास है, वह यह है कि इंजन खुद ही इस पर नज़र रखता है, इसलिए आपको बस एक दस्तावेज़ या पंक्ति का अनुरोध करना होगा।

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

क्या एप्लिकेशन कोड को यह जानने की जरूरत है कि एक या अधिक डेटाबेस कई सर्वरों में फैले हुए हैं? यदि नहीं, तो किस स्तर पर अनुरोध फ़िल्टर किए जाते हैं?

यदि वे अलग-अलग तार्किक डेटाबेस हैं, तो हाँ। यदि वे केवल भौतिक रूप से वितरित किए जाते हैं तो नहीं - यह मानते हुए कि आपका विशिष्ट डेटाबेस मूल रूप से पैनापन का समर्थन करता है या आप लोड संतुलन समाधान (SQL डेटाबेस के लिए) का उपयोग करते हैं। यह मानते हुए कि आपके सभी ऑपरेशन स्टेटलेस हैं; यदि आप क्षैतिज स्केलिंग चाहते हैं, तो आपको ACID छोड़ना होगा।

1 डेटाबेस / 1 सर्वर सेटअप से आगे बढ़ने का समय कब है? ऐसा करना कितना आम है?

यह वह समय है जब आपने संभवतः एक सर्वर पर सब कुछ अनुकूलित कर लिया है और फिर भी आई / ओ लोड पर बाधाओं के कारण पर्याप्त प्रदर्शन को निचोड़ नहीं सकता है। यदि आपको प्रश्न पूछना है, तो यह बहुत जल्दी है।

ध्यान दें कि एक अच्छे RDBMS उत्पाद (Oracle, SQL Server) में प्रदर्शन की समस्याएं खराब डिज़ाइन, ख़राब अनुक्रमण, ख़राब प्रश्नों, लॉक विवाद, इत्यादि के कारण अधिक होती हैं; ये उत्पाद एक हास्यास्पद डिग्री तक लंबवत पैमाने पर हो सकते हैं। इसलिए फिर से, आपको "1 डेटाबेस / 1 सर्वर सेटअप से आगे बढ़ने" पर विचार करना चाहिए जब आप पूरी तरह से निश्चित हों कि आपकी प्रदर्शन समस्याएं हार्डवेयर सीमाओं के कारण हैं और न कि केवल एक उप-समरूप डिज़ाइन / कार्यान्वयन।

या, मुझे लगता है, कुछ अन्य लोग वितरित डेटाबेस पर स्विच करने का कारण यह है कि जब वे लाइसेंस फीस में ज्यादा (या किसी भी) पैसे देने के लिए तैयार नहीं होते हैं और बढ़ी हुई आवेदन जटिलता के लिए कम लागत का व्यापार करने के लिए एक सचेत विकल्प के रूप में एसक्यूएल को खाई करना चाहते हैं। पूरी तरह से मान्य कारण अगर आप एक सॉफ्टवेयर स्टार्टअप हैं, लेकिन आमतौर पर कॉर्पोरेट क्षेत्र में लागू नहीं होते हैं।


+1 - मैं वास्तव में NoSQL पर विचार नहीं कर रहा था, लेकिन यह सब समान है। धन्यवाद।
पुण्योसोमीडिया

1

डेटाबेस के लिए प्रतिकृति कॉन्फ़िगरेशन के तीन प्रमुख प्रकार हैं:

  • प्रमुख अधीन
  • मास्टर मास्टर
  • आम सहमति

मास्टर-दास उदाहरण: MySQL मास्टर + MySQL दास, MongoDB

मास्टर-मास्टर उदाहरण: काउचडीबी, कैसेंड्रा, रीक

आम सहमति उदाहरण: ScalienDB

...कुछ नाम है।

इनकी अलग-अलग विशेषताएं हैं। मास्टर-स्लेव कॉन्फिगरेशन स्लेव नोड्स को रीड-रिक्वेस्ट परोसते समय मास्टर रेट को अधिकतम दर से पकड़ने की अनुमति देता है, जबकि मास्टर सर्वर डेटा अखंडता के लिए जिम्मेदार होता है। क्योंकि सभी लिखते हैं कि मास्टर के पास जाता है, कभी भी ताला विवाद नहीं होता है क्योंकि एक अपेक्षाकृत धीमा लेखक कई पाठकों को रोक रहा है, लेकिन दूसरी ओर, दास सर्वर अंततः सुसंगत हैं और आपको लेन-देन अलगाव की गारंटी नहीं मिलती है जो आपके पास होगी केवल गुरु से पढ़ने से। (आगे पढ़ने; ACID बनाम आधार, लेन-देन अलगाव स्तर, डेटाबेस प्रतिकृति, MVCC / अलगाव: स्नैपशॉट, लेन-देन प्रतिकृति)

मास्टर-मास्टर हमेशा लिखने की अनुमति देता है, इसलिए आपके पास जो सच है उस पर कई अधिकारी होंगे। आपके एप्लिकेशन क्या कर रहे हैं, इसके आधार पर यह समस्या हो सकती है या नहीं भी हो सकती है, लेकिन यदि आप परस्पर विरोधी डेटा लिखते हैं, तो अगली बार जब आप उस कुंजी / पंक्ति / कॉलम को पढ़ेंगे तो आपको कई परिणाम मिलेंगे, जिन्हें आपको एप्लिकेशन लॉजिक के साथ मर्ज करना होगा और डेटाबेस में वापस सहेजें। (आगे पढ़े: CAP-theorem, CouchDB प्रतिकृति, Riak प्रतिकृति, सुसंगत hashing, Bitcask और StormDB, Quorum- w / MongoDB नेटवर्क विभाजन पर, विलय संकल्प रणनीतियों)

नोड्स में प्रतिकृति के साथ सहमति-आधारित डेटाबेस, जैसे स्कैलियन हमेशा लिखते हैं, लेकिन लेखन को ACKing करने से पहले कई संदेशों के आदान-प्रदान की कीमत पर होगा। यह एक समस्या नहीं है यदि आपके पास एक तेज ईथरनेट है और आपको ACKing से पहले डिस्क पर लिखने की आवश्यकता नहीं है, जिसकी आपको आवश्यकता नहीं होगी यदि आपके तीन सर्वरों में से न्यूनतम अलग-अलग बिजली की आपूर्ति के साथ अलग-अलग सर्वर रैक पर हैं (एक मर जाता है, अन्य दो सुनिश्चित करते हैं कि वे डिस्क पर सहेजे गए हैं)। (आगे पढ़ने; PAXOS, PAXOS COMMIT, दो-चरण-वितरित वितरित लेनदेन के साथ, तीन-चरण-प्रतिबद्ध)

आगे पढने के तरीके: (पुस्तक: 'डिस्ट्रिब्यूटेड ऑफ डिस्ट्रिब्यूटेड कंप्यूटिंग', वेक्टर क्लॉक, वर्जन वैक्टर, मैट्रिक्स वैक्टर, लॉजिकल क्लॉक, बेकरी अल्गोरिद्म, इंटरवल ट्री क्लॉक, एक्टर्स और रिएक्टिव प्रोग्रामिंग और रिएक्टर, सॉफ्टवेयर ट्रांजैक्शनल मेमोरी, ट्रांजैक्टर, एकेका, स्टैक्ट डिस्ट्रीब्यूटेड कंप्यूटिंग, गॉसिप प्रोटोकॉल, कैसेंड्रा के एंटी-एन्ट्रापी गॉसिप प्रोटोकॉल एक्सटेंशन, डिस्ट्रीब्यूटेड हैश टेबल पर पेपर, डिस्ट्रीब्यूटेड डेटा में मर्जिंग पर पेपर, ज़ूकेर आर्किटेक्चर, इन्फोक्यू प्रेज़ेंटेशन ऑन "एसिंक्रोनस प्रोटोकॉल", एचबीएज़ आर्किटेक्चर, मेप्रेड्यूस पेपर, अमेज़ॅन डायनामो पेपर कि सभी NoSQL- सामान, कतार, खरगोश उच्च उपलब्धता क्लस्टरिंग) शुरू कर दिया

मुझे आशा है कि मैंने सोचा के लिए कुछ भोजन दिया :)। अगर आप इस सामान के बारे में ट्वीट करना चाहते हैं तो आप ट्विटर @henrikfeldt पर मुझे फॉलो कर सकते हैं।


1

ठीक है, इसलिए यहाँ स्केलिबिलिटी पर एक और दृष्टिकोण है।

आइए चर्चा करें कि डेटा होने के लिए चीजों का क्या मतलब है, व्यवहार का क्या मतलब है और एप्लिकेशन लॉजिक का क्या मतलब है।

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

हालाँकि, विशिष्ट प्रकार की लेयरिंग जिसका कोई संबंध नहीं है, के साथ दुर्व्यवहार किया गया है, जो कि 'GUI', 'बिजनेस लॉजिक लेयर' और फिर 'डेटा एक्सेस लेयर' है। मेरा मतलब है, हां, सिद्धांत में विचार अच्छा है, जैसे कि सिद्धांत में साम्यवाद अच्छा है, लेकिन वास्तव में यह नहीं है।

आइए नजर डालते हैं क्यों। मैं जिस तर्क का उपयोग करने जा रहा हूं वह युग्मन के बारे में है; एक परत से बिंदु जो दूसरी परत पर बिंदु को छूता है। जब भी आप डिफ़ॉल्ट-एंटरप्रिसिए-मोड में एक एन-टियर उर्फ ​​लेयर्ड ऐप बनाना शुरू करते हैं, जिसमें लोग जाते हैं, वे परतों के बीच संपर्क के कई बिंदु बनाते हैं।

इसके मूल में, विचार यह है कि परतें विनिमेय हैं; लेकिन वे नहीं हैं! क्यों? सभी कॉल-साइट युग्मन के कारण।

इसके बजाय, इस बात पर ध्यान दें कि नेटवर्क क्यों अपघटित होता है! क्योंकि इंटरफ़ेस एक एकल फ़ाइल पॉइंटर पर एक बाइट-स्ट्रीम है जो एक खुले सॉकेट की ओर इशारा करता है! आईएसओ मॉडल में सभी परतें ऐसी हैं जैसे कि डिजाइन पैटर्न जिसे 'जिम्मेदारी की श्रृंखला' कहा जाता है, ऑब्जेक्ट ओरिएंटेशन है! प्रत्येक परत अंतर्निहित परत को लपेटती है, उस अंतर्निहित परत में डेटा के शब्दार्थ को जाने बिना।

डेटा के एक पैकेज के रूप में ईथरनेट और कच्चे बिजली के संकेतों की ओर नीचे चलता है, यह लगातार परतों से लिपटा होता है जो केवल अपने विशिष्ट संदेश लिफाफे के बारे में जानते हैं, अपने स्वयं के विशिष्ट 'बाइट्स का बैच' जो इसे भेज सकते हैं; और कुछ नहीं। यह पैकेज की सामग्री के आधार पर कॉल-पथ को बदलने की आवश्यकता नहीं है।

इसे एन-टियर के विपरीत करें जहाँ आपको अपने लेयर्स में कॉल-पाथ को एक 'कॉल' पर बदलना होगा, जो कि डेटाबेस के रास्ते में आपकी लेयर्स को ट्रेस कर रहा है - उदाहरण के लिए, 'गोल्ड कस्टमर्स' पॉलीमॉर्फिक रूप से 'सामान्य ग्राहकों' का सुपरसेट हैं। और इसलिए क्योंकि हम 'टेबल-प्रति-उपवर्ग' का उपयोग करते हैं, हमें अब इस बारे में जानने की जरूरत है कि डेटा (इकाई) परतों का पता लगा रहा है; दोनों तथाकथित 'बिजनेस लॉजिक लेयर' और डेटा लेयर में जो वास्तव में सेविंग कर रहे हैं।

यह कंप्यूटिंग के नजरिए से न तो स्केलेबल है और न ही इष्टतम।

यह स्केलेबल क्यों नहीं है? क्योंकि वास्तुकला युग्मित है, और फिर आप अभी भी उसी पुराने DB के अंदर हैं जिसे आप कई नोड्स में विभाजित करने की कोशिश कर रहे थे! लेकिन, क्योंकि इसके लिए आपको ACID की आवश्यकता होती है, और एक तीसरी इकाई (डेटा ऑब्जेक्ट) के लिए आपको उन्हें एक ही डेटाबेस में रखने की आवश्यकता होती है जो लेनदेन करता है!

ठीक है, तो उस रास्ते से बाहर के साथ; और क्या तरीके हैं?

खैर, 'एसओए' यानी सेवा उन्मुख वास्तुकला नामक नफरत का संक्षिप्त नाम है। बेशक, दुनिया के टॉमस एरल्स , क्या आपने अपनी सभी परतों को लागू किया होगा, लेकिन एक्सएमएल और एसओएपी के बजाय।

उपरोक्त सभी कारणों से, यह जाने का गलत तरीका है, क्योंकि आप अपने आप को उन XML परदे के पीछे कर रहे हैं, जैसे आप ऊपर बताए गए तरीके से अपने आप को एप्लिकेशन परतों में जोड़ेंगे।

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

क्योंकि आपने वास्तविक संचालन से सेवा के पहलुओं को डिकोड किया है जिसे आप निष्पादित करना चाहते हैं, अब आप कई सेवाओं को जोड़ सकते हैं; वास्तव में, यह कैसे नेटफ्लिक्स करता है। इन प्रस्तुतियों पर एक नज़र: http://www.slideshare.net/adrianco/global-netflix-platformhttp://www.slideshare.net/adrianco/global-netflix-platform । वे अच्छे हैं!


0

बीटा में एक नया SQL (ACID) डेटाबेस है जिसमें दावा किया जाता है कि इसमें इलास्टिक स्केलिंग गुण हैं। अभी एक निशुल्क बीटा कार्यक्रम चल रहा है और मेरा सुझाव है कि आपको एक नज़र है, इसे NuoDB कहा जाता है।

जाहिरा तौर पर यह आसानी से एक भी थ्रेडेड मशीन पर MySQL को बेहतर बनाता है, लेकिन कुछ बेंचमार्क में खुशी से 70+ उदाहरणों तक पहुंचता है।


एक ही धागा? फिर यह एक प्रासंगिक बेंचमार्क कैसे है?
हेनरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.