साझा तालिका संरचनाओं के साथ बहु-किरायेदार डेटाबेस कैसे बनाएं?


129

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

अब तक मैंने तीन विकल्प देखे हैं:

  • मल्टी-डेटाबेस (प्रत्येक किरायेदार अपना स्वयं का हो जाता है - लगभग प्रति ग्राहक 1 सर्वर के समान)
  • मल्टी-स्कीमा (MySQL में उपलब्ध नहीं है, प्रत्येक किरायेदार को साझा डेटाबेस में अपना स्कीमा मिलता है)
  • साझा स्कीमा (हमारा वर्तमान दृष्टिकोण, शायद प्रत्येक कॉलम पर अतिरिक्त पहचान रिकॉर्ड के साथ)

मल्टी-स्कीमा मेरी पसंदीदा (लागतों पर विचार) है। हालाँकि, एक नया खाता बनाना और माइग्रेशन करना काफी दर्दनाक प्रतीत होता है, क्योंकि मुझे सभी स्कीमाओं पर चलना होगा और अपनी टेबल / कॉलम / परिभाषाओं को बदलना होगा।

प्रश्न: मल्टी-स्कीमा को प्रत्येक किरायेदार के लिए थोड़ा अलग तालिकाओं के लिए डिज़ाइन किया गया लगता है - मुझे यह नहीं चाहिए। क्या कोई आरडीबीएमएस है जो मुझे मल्टी-स्कीमा मल्टी-टेनेंट समाधान का उपयोग करने की अनुमति देता है, जहां टेबल संरचना सभी किरायेदारों के बीच साझा की जाती है?

पीएस मल्टी से मेरा मतलब है कि अल्ट्रा-मल्टी (10.000+ किरायेदार) जैसा कुछ।


1
"मल्टी-स्कीमा प्रत्येक किरायेदार के लिए थोड़ा अलग तालिकाओं के लिए डिज़ाइन किया गया लगता है" तो? बहु-स्कीमा और सभी समान तालिकाओं में क्या गलत है? क्या आप कह रहे हैं कि आप सभी स्कीमा में समान टेबल संरचनाओं को फिर से बनाना नहीं चाहते हैं? या आप कह रहे हैं कि आप सभी स्कीमा में समान संरचना नहीं बना सकते हैं?
S.Lott

+1 अच्छे / रोचक सवाल के लिए
AdaTheDev

2
@ S.Lott मैं एक दिन में 100+ साइनअप के साथ 10.000+ किरायेदारों की अपेक्षा करता हूं। एक एकल तालिका-परिभाषा (परिभाषा = साझा, डेटा = पृथक) में लाखों प्रविष्टियाँ होने से मुझे हजारों तालिका परिभाषाओं में हजारों प्रविष्टियाँ होने से बेहतर महसूस होता है। चूंकि बहुत से लोग ऐसा नहीं कर रहे हैं, इसलिए मैं मल्टी-स्कीमा के साथ इतना आश्वस्त नहीं हूं।
मार्सेल जैकवर्थ

1
मैं डैनियल से सहमत हूं, उन आंकड़ों के आधार पर मल्टी-डेटाबेस को बाहर रखा गया है। मैंने अपना उत्तर अपडेट कर दिया है, लेकिन इसे इतिहास के लिए और अधिक रखने के लिए। साझा दृष्टिकोण निश्चित रूप से सबसे उचित दृष्टिकोण लगता है।
AdaTheDev

2
एक उत्तर में dynjo से : " सटीक विषय पर रयान बिग से महान लेख "
फेलिक्स गगनोन-ग्रेनियर

जवाबों:


95

हालाँकि कुछ कंपनियां ऐसी हैं जो डरती हैं कि उनके डेटा से समझौता हो सकता है, इसलिए हम अन्य समाधानों का मूल्यांकन कर रहे हैं।

यह दुर्भाग्यपूर्ण है, क्योंकि ग्राहक कभी-कभी एक गलत धारणा से पीड़ित होते हैं कि केवल शारीरिक अलगाव ही पर्याप्त सुरक्षा प्रदान कर सकता है।

एक दिलचस्प एमएसडीएन लेख है, जिसका शीर्षक मल्टी-टेनेंट डेटा आर्किटेक्चर है , जिसे आप जांचना चाहते हैं। इस तरह से लेखकों ने साझा दृष्टिकोण के प्रति गलत धारणा को संबोधित किया:

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

तकनीकी और व्यावसायिक विचारों के लिए, लेख एक संक्षिप्त विश्लेषण करता है जहां एक निश्चित दृष्टिकोण दूसरे की तुलना में अधिक उपयुक्त हो सकता है:

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

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

  • औसत किरायेदार के डेटा पर कब्ज़ा करने के लिए आप कितने संग्रहण स्थान की उम्मीद करते हैं? यदि आप कुछ या सभी किरायेदारों से बहुत बड़ी मात्रा में डेटा संग्रहीत करने की अपेक्षा करते हैं, तो अलग-अलग डेटाबेस दृष्टिकोण संभवतः सबसे अच्छा है। (वास्तव में, डेटा स्टोरेज आवश्यकताएं आपको किसी भी तरह से अलग-अलग डेटाबेस मॉडल को अपनाने के लिए मजबूर कर सकती हैं। यदि ऐसा है, तो आवेदन को शुरू करने के तरीके से डिजाइन करना बहुत आसान होगा, जो कि बाद में अलग-अलग डेटाबेस दृष्टिकोण पर जाने के लिए होता है।)

  • कितने समवर्ती अंत उपयोगकर्ताओं से आपको औसत किरायेदार के समर्थन की उम्मीद है? संख्या जितनी बड़ी होगी, अंत-उपयोगकर्ता की आवश्यकताओं को पूरा करने के लिए उतना अधिक उपयुक्त और अधिक पृथक दृष्टिकोण होगा।

  • क्या आप प्रति-किरायेदार बैकअप और पुनर्स्थापना क्षमता जैसी किसी भी प्रति-मूल्य-वर्धित सेवाओं की पेशकश करने की उम्मीद करते हैं? ऐसी सेवाओं को अधिक पृथक दृष्टिकोण के माध्यम से पेश करना आसान है।


अद्यतन: आगे किरायेदारों की अपेक्षित संख्या के बारे में अद्यतन करने के लिए।

किरायेदारों की अपेक्षित संख्या (10k) को बहु-डेटाबेस दृष्टिकोण को बाहर करना चाहिए, अधिकांश के लिए, यदि सभी परिदृश्य नहीं। मुझे नहीं लगता कि आप 10,000 डेटाबेस उदाहरणों को बनाए रखने और हर दिन सैकड़ों नए बनाने के विचार को कल्पना करेंगे।

अकेले उस पैरामीटर से, यह साझा-डेटाबेस की तरह दिखता है, एकल-स्कीमा दृष्टिकोण सबसे उपयुक्त है। तथ्य यह है कि आप प्रति किराएदार के बारे में केवल 50Mb का भंडारण करेंगे, और यह कि कोई प्रति-किरायेदार ऐड-ऑन नहीं होगा, इस दृष्टिकोण को और भी अधिक उपयुक्त बनाता है।

MSDN आलेख में उपरोक्त तीन सुरक्षा पैटर्न का उल्लेख किया गया है जो साझा-डेटाबेस दृष्टिकोण के लिए सुरक्षा विचारों से निपटते हैं:

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

अद्यतन 2: जाहिर है कि माइक्रोसॉफ्ट के लोगों ने इस विषय के बारे में एक नया लेख बनाया / बनाया है, मूल लिंक चला गया है और यह नया है: मल्टी-टेनेंट सास डेटाबेस टेनेंसी पैटर्न (यश से लेकर केर तक)


1
ओह, मैंने कल उस लेख को स्कैन किया और उस गलत धारणा को छोड़ दिया। इसे फिर से पढ़ने की जरूरत है।
मार्सेल जैकवर्थ

1
@ मार्सेल: हालाँकि, ग्राहकों की सुरक्षा की धारणा क्या है, इसके अलावा, मेरा मानना ​​है कि आपका निर्णय जिस पर लेने के लिए बहु-किरायेदार दृष्टिकोण है, उन कारकों पर आधारित होना चाहिए जिन्हें मैंने MSDN लेख से उद्धृत किया था: 1. किरायेदारों की अपेक्षित संख्या । - 2. प्रत्येक किरायेदार के लिए अपेक्षित भंडारण की आवश्यकता। - 3. समवर्ती अंत-उपयोगकर्ताओं की अपेक्षित संख्या। - 4. प्रति-किरायेदार व्यसनों की अपेक्षा।
डैनियल वेसलो

1
उस अनुभाग को इंगित करने के लिए धन्यवाद। संख्या = 10k, संग्रहण = 50mb, समवर्ती अंत-उपयोगकर्ता = 2 प्रति किरायेदार, Addons = 0. इसलिए साझा दृष्टिकोण रखने वाली वर्तमान स्थिति सबसे उचित प्रतीत होती है। मुझे लगता है कि मैं अगले सप्ताह कुछ कॉल करूंगा ताकि यह पता लगाया जा सके कि ग्राहकों को वास्तव में क्या चाहिए / उम्मीद है। जर्मनी और डेटा / आईटी-सुरक्षा वास्तव में एक कठिन कहानी है।
मार्सेल जैकवर्थ

1
अभी से इसे पढ़ने वाले उपयोगकर्ताओं के लिए, उल्लिखित लेख अब मौजूद नहीं है, किसी ने एक प्रति बनाई है, शायद?
gmslzr

1
@guillesalazar मुझे यकीन नहीं है कि यह एक ही है, लेकिन मुझे लगता है कि यह है - docs.microsoft.com/en-us/azure/sql-database/… (@DanielVassallo अगर यह एक ही है, तो शायद आपके लिंक को अपडेट करना उत्तर :-))
Shai Kerer

20

मेरा अनुभव (यद्यपि SQL सर्वर) बहु-डेटाबेस जाने का तरीका है, जहाँ प्रत्येक ग्राहक का अपना डेटाबेस होता है। इसलिए हालांकि मेरे पास कोई mySQL या रूबी ऑन रेल्स अनुभव नहीं है, मुझे उम्मीद है कि मेरा इनपुट कुछ मूल्य जोड़ सकता है।

जिन कारणों में शामिल हैं:

  1. डेटा सुरक्षा / आपदा वसूली। प्रत्येक कंपनियों के डेटा को डेटा के कम होने का जोखिम देने वाले अन्य लोगों से पूरी तरह से अलग तरीके से संग्रहीत किया जाता है (सोच की तरह अगर आप एक कोड बग का परिचय देते हैं, जिसका अर्थ है कि कुछ ग्राहक गलती से दूसरे ग्राहक डेटा को देखता है तो उसे नहीं करना चाहिए) एक ग्राहक को संभावित नुकसान को कम करता है यदि एक विशेष डेटाबेस दूषित हो जाता है आदि। ग्राहक को कथित सुरक्षा लाभ और भी अधिक हैं (अतिरिक्त बोनस साइड इफेक्ट!)
  2. scalability। अनिवार्य रूप से आप अपने डेटा को अधिक मापनीयता को सक्षम करने के लिए विभाजित कर रहे होंगे - जैसे डेटाबेस को अलग-अलग डिस्क पर रखा जा सकता है, आप कई डेटाबेस सर्वरों को ऑनलाइन ला सकते हैं और डेटाबेस को लोड को फैलाने के लिए आसान चारों ओर ले जा सकते हैं।
  3. प्रदर्शन सुधारना। मान लीजिए आपके पास एक बहुत बड़ा क्लाइंट है और एक बहुत छोटा है। उपयोग के पैटर्न, डेटा वॉल्यूम आदि में बेतहाशा अंतर हो सकता है। आपको प्रत्येक क्लाइंट के लिए आसान ट्यून / ऑप्टिमाइज़ करना चाहिए जो आपको चाहिए।

मुझे आशा है कि यह कुछ उपयोगी इनपुट प्रदान करता है! और भी कारण हैं, लेकिन मेरा दिमाग खाली हो गया। अगर यह वापस किक करता है, तो मैं अपडेट करूंगा :)

संपादित करें:
जब से मैंने यह उत्तर पोस्ट किया है, अब यह स्पष्ट है कि हम 10,000+ किरायेदारों से बात कर रहे हैं। मेरा अनुभव सैकड़ों बड़े पैमाने पर डेटाबेस में है - मुझे नहीं लगता कि 10,000 अलग-अलग डेटाबेस आपके परिदृश्य के लिए बहुत अधिक प्रबंधनीय हैं, इसलिए मैं अब आपके परिदृश्य के लिए मल्टी-डीबी दृष्टिकोण का समर्थन नहीं कर रहा हूं। विशेष रूप से अब यह स्पष्ट है कि आप प्रत्येक किरायेदार के लिए छोटे डेटा वॉल्यूम पर बात कर रहे हैं!

मेरे उत्तर को यहाँ भी रखते हैं क्योंकि इसका समान नाव में (कम किराएदारों के साथ) अन्य लोगों के लिए कुछ उपयोग हो सकता है


हाँ, खेद है कि मैंने पहले स्पष्ट नहीं किया था। अभी भी +1। ;)
मार्सेल जैकवर्थ

डेटा सुरक्षा के बारे में बात करते हुए, क्या आप कहेंगे कि प्रत्येक डेटाबेस को अलग सर्वर / वीएम पर रखा जाना चाहिए? या विभिन्न sql उपयोगकर्ताओं के साथ एक एकल / संकुल सर्वर पर सभी डेटाबेस पर्याप्त सुरक्षित है?
शाय

@ सहाय - नहीं, उन्हें अलग-अलग सर्वरों पर रखने की आवश्यकता नहीं है - कल्पना करें कि आपके पास 100s हैं, जो कि बहुत सारे सर्वर इंस्टेंसेस / लाइसेंस हैं जिनकी आपको शुरुआत के लिए आवश्यकता होगी। डैनियल का जवाब आगे देखें, वहाँ कुछ अच्छे लिंक हैं।
AdaTheDev

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

17

नीचे Salesforce.com पर एक श्वेत पत्र के लिए एक लिंक दिया गया है कि वे बहु-किरायेदारी कैसे लागू करते हैं:

http://www.developerforce.com/media/ForcedotcomBookLibrary/Force.com_Multitenancy_WP_101508.pdf

उनके पास 1 विशाल टेबल w / 500 स्ट्रिंग कॉलम (Value0, Value1, ... Value500) हैं। तिथियां और संख्याएं एक प्रारूप में तार के रूप में संग्रहीत की जाती हैं, ताकि वे डेटाबेस स्तर पर अपने मूल प्रकारों में परिवर्तित हो सकें। मेटा डेटा टेबल हैं जो डेटा मॉडल के आकार को परिभाषित करते हैं जो प्रति किरायेदार अद्वितीय हो सकता है। अनुक्रमण, संबंध, अद्वितीय मान आदि के लिए अतिरिक्त तालिकाएँ हैं

क्यों हुई परेशानी?

प्रत्येक किरायेदार डेटाबेस स्तर (परिवर्तन तालिका आदि) में परिवर्तन किए बिना रन-टाइम पर अपने स्वयं के डेटा स्कीमा को अनुकूलित कर सकता है। यह निश्चित रूप से कुछ ऐसा करने का कठिन तरीका है लेकिन बहुत लचीला है।


10

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

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

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

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