MongoDB में बहु-किरायेदार डेटाबेस के लिए अनुशंसित दृष्टिकोण क्या है?


98

मैं MongoDB का उपयोग करके एक बहु-किरायेदार ऐप बनाने के बारे में सोच रहा हूं। मेरे पास अभी तक कितने किराएदारों के संबंध में कोई अनुमान नहीं है, लेकिन मैं हजारों में पैमाना बनाना चाहता हूं।

मैं तीन रणनीतियों के बारे में सोच सकता हूं:

  1. एक ही संग्रह में सभी किरायेदारों, सुरक्षा के लिए किरायेदार-विशिष्ट क्षेत्रों का उपयोग करते हुए
  2. एक साझा डीबी में प्रति किरायेदार 1 संग्रह
  3. 1 प्रति किरायेदार डेटाबेस

मेरे सिर में आवाज़ यह सुझाव दे रही है कि मैं विकल्प 2 के साथ जाऊँ।

विचार और निहितार्थ, कोई भी?


प्रिय @Braintapper, हम अभी अपने आवेदन के साथ उसी स्थिति में हैं, जिसे बहु-किरायेदारी सक्षम होना चाहिए। क्या आपके पास साझा करने के लिए कोई अनुभव है? बहुत अच्छा होगा, धन्यवाद।
जोशुआ मुहीम

3
अपने ऐप के लिए, मैंने पोस्टग्रेजेकल के साथ जा रहा था (हमें कुछ NoSQL के साथ एक रिलेशनल डेटाबेस का लाभ मिलता है जैसे hstore एक्सटेंशन के माध्यम से) MongoDB के बजाय और स्कॉपिंग के साथ रेल में मल्टी-टेनेंसी को संभालना। हम इस Railscast में उपयोग किए गए एक समान दृष्टिकोण का उपयोग करते हैं: railscasts.com/episodes/388-multitenancy-with-scopes
Braintapper

2
मुझे पता है कि इस प्रश्न के लिए पहले ही एक उत्तर दिया जा चुका है, लेकिन किसी और को इस आधिकारिक दस्तावेज का उल्लेख mongohq साइट पर करना चाहिए: support.mongohq.com/use-cases/multi-tenant.html । यह स्पष्ट रूप से नीचे @Braintapper समाधान के खिलाफ वकालत करता है
lafama

1
उत्तर अपडेट किया गया। आपके लिंक की जानकारी मई 2010 में आसानी से उपलब्ध नहीं थी।
ब्रेनटैपर

@Braintapper क्या आप अभी postgresql solution (railscasts.com पर आधारित) का उपयोग कर रहे हैं? मैं इसका उपयोग करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि अगर यह सुरक्षा जोड़ता है और यह कितने किरायेदार का समर्थन कर सकता है! कृपया मुझे इस अनुभव के बारे में आपकी प्रतिक्रिया चाहिए। धन्यवाद
medBouzid

जवाबों:


72

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

अपना शोध करते समय मुझे यह लेख mongodb सपोर्ट साइट (जिस तरह से चला गया है के बाद से जोड़ा गया) पर मिला: https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases-multi -tenant.html

लोगों ने किसी भी कीमत पर 2 विकल्पों से बचने के लिए कहा, जैसा कि मैं समझता हूं कि विशेष रूप से मोंगोडब के लिए विशिष्ट नहीं है। मेरी धारणा यह है कि यह डेटाबेस डिजाइन की बारीकियों के कारण, NoSQL dbs I पर शोध (CoachDB, Cassandra, CouchBase Server, आदि) के लिए लागू होता है।

संग्रह (या बाल्टियाँ या फिर भी वे इसे अलग-अलग डीबी में कहते हैं) आरडीबीएमएस में सुरक्षा स्कीमा के समान नहीं हैं क्योंकि वे दस्तावेजों के लिए कंटेनर के रूप में व्यवहार करते हैं क्योंकि वे अच्छे किरायेदार अलगाव को लागू करने के लिए बेकार हैं। मुझे NoSQL डेटाबेस नहीं मिला जो संग्रह के आधार पर सुरक्षा प्रतिबंध लागू कर सकता है।

बेशक आप डेटाबेस / सर्वर स्तर पर पहुंच को प्रतिबंधित करने के लिए मोंगॉडब भूमिका आधारित सुरक्षा का उपयोग कर सकते हैं। ( http://docs.mongodb.org/manual/core/authorization/ )

मैं 1 विकल्प की सिफारिश करूंगा जब:

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

मैं वैरिएंट 3 के लिए जाऊंगा अगर:

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

यदि आप अपने आवेदन के बारे में अतिरिक्त विवरण पोस्ट करते हैं, तो शायद मैं आपको अधिक विस्तृत सलाह दे सकता हूं।


9
मुझे लगता है कि मूल लिंक मर चुका है, संग्रहीत के लिए गया है: web.archive.org/web/2014081202091703/http://support.mongohq.com/ ...
पीटर बुटकोविक

हैलो, हम mongodb का उपयोग करके वर्तमान db के साथ नया db कैसे बना सकते हैं?
हेमल

@ रूसी हम कैसे अनुक्रमण को संभालने जा रहे हैं यदि हम 1 को चुनने जा रहे हैं
रॉबिन्स गुप्ता

10

मुझे इस लिंक में टिप्पणियों में एक अच्छा जवाब मिला:

http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb-deployment/

मूल रूप से विकल्प # 2 जाने का सबसे अच्छा तरीका लगता है।

डेविड माइटन की टिप्पणी का उद्धरण:

मोंगोबीडी ने अपनी डेटा फ़ाइलों को आवंटित करने के तरीके के कारण हमने प्रति ग्राहक एक डेटाबेस नहीं रखने का फैसला किया। प्रत्येक डेटाबेस यह फ़ाइलों का अपना सेट उपयोग करता है:

एक डेटाबेस के लिए पहली फ़ाइल dbname.0 है, फिर dbname.1, आदि dbname.0 64GB, dbname.1 128MB, आदि, 2GB तक होगी। एक बार जब फाइलें 2GB आकार में पहुँच जाती हैं, तो प्रत्येक क्रमिक फ़ाइल भी 2GB होती है।

इस प्रकार यदि अंतिम डेटाफाइल मौजूद है, तो 1GB, वह फाइल 90% खाली हो सकती है यदि वह हाल ही में पहुंची हो।

मैनुअल से।

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

साझाकरण मानक के अनुसार प्रति संग्रह के आधार पर होगा जो एक समस्या प्रस्तुत करता है जहां संग्रह को शुरू करने के लिए न्यूनतम आकार तक कभी नहीं पहुंचता है, जैसा कि हमारे कुछ के लिए मामला है (जैसे संग्रह सिर्फ उपयोगकर्ता लॉगिन विवरण संग्रहीत करता है)। हालाँकि, हमने अनुरोध किया है कि यह प्रति डेटाबेस स्तर पर भी किया जा सकेगा। Http://jira.mongodb.org/browse/SHARDING-41 देखें

बहुत सारे संग्रह का उपयोग करके कोई प्रदर्शन ट्रेडऑफ़ नहीं हैं। Http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Eollections देखें


2
जैसा कि अन्य उत्तरों में सुझाया गया है, # 2 एक अच्छा दृष्टिकोण नहीं है। कृपया स्वीकार किए गए उत्तर को बदलने पर विचार करें, क्योंकि इससे अन्य डेवलपर्स को याद किया जा सकता है।
क्लोपेज़

1
स्वीकार किए गए उत्तर को बदल दिया, क्योंकि 2010 से चीजें काफी बदल गई हैं, जब पहली बार सवाल पूछा गया था।
Braintapper

3

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

  • आर्थिक विचार
  • सुरक्षा
  • किरायेदार के विचार
  • नियामक (कानूनी)
  • कौशल ने चिंताओं को निर्धारित किया

इसके अलावा सेवा (SaaS) कॉन्फ़िगरेशन के रूप में सॉफ़्टवेयर के लिए कुछ पैटर्न स्पर्श किए गए हैं।

इसके अतिरिक्त, एक जेंडर के लायक SQL एनीवेयर लोगों का एक दिलचस्प लेखन है

मेरा अपना निजी लेना - जब तक आप लागू सुरक्षा / विश्वास के बारे में निश्चित नहीं हैं, मैं विकल्प 3 के साथ जाऊंगा, या यदि स्केलेबिलिटी की चिंताओं के कारण कम से कम 2 विकल्प 2 में वापसी पर प्रतिबंध लगा दिया जाए। उस ने कहा ... मैं MongoDB के साथ कोई समर्थक नहीं हूँ। मैं एक साझा "स्कीमा" का उपयोग करके बहुत घबरा जाता हूं - लेकिन मैं और अधिक अनुभवी चिकित्सकों को खुशी-खुशी विदा करूंगा।


मैं उस MSDN लेख से परिचित हूं, क्योंकि मेरी मूल योजना एक संबंधपरक डेटाबेस का उपयोग करने की थी। हालांकि, मेरा डेटा काफी असंरचित है, जो अब मुझे MongoDB जैसे NoSQL dbs की जांच कर रहा है। ऐसा नहीं लगता है कि MongoDB को लोटस डॉमिनो ने जिस तरह से ACL का समर्थन किया है, और मैं वास्तव में पहिया को सुदृढ़ नहीं करना चाहता हूं, जिससे मुझे भी लगता है कि 2 या 3 जाने का रास्ता है। मुझे यह भी पता नहीं है कि क्या सीमाएँ हैं जो मैं संग्रहों के # के संदर्भ में सामना कर सकता हूं या हालांकि MongoDB में अनुमति दी गई हो।
ब्रेनटाॅपर

3

मैं विकल्प 2 के लिए जाऊंगा।

हालाँकि आप mongod.exe कमांड लाइन विकल्प --smallfiles सेट कर सकते हैं। इसका मतलब है कि एक सीमा का सबसे बड़ा फ़ाइल आकार 0.5 गीगाबाइट होगा न कि 2 गीगाबाइट। मैंने 1.42 के साथ इसका परीक्षण किया। तो विकल्प 3 असंभव नहीं है।


बस इतना ही मदद करता है, पूर्वव्यापी में: http://yazezo.com/2013/10/how-to-setup-saas-cloud-multi-tenant.html
KMån

0

MongoDB में मेरे शोध के अनुसार ट्रुकोस वाई कंसेजोस। Aplicaciones multitenant। उस विकल्प की अनुशंसा नहीं की जाती है यदि आप नहीं जानते हैं कि आपके पास कितने किरायेदार हो सकते हैं, तो यह हजारों हो सकते हैं और यह जटिल हो जाएगा जब इसे बनाने की बात आती है, एक डेटाबेस में हजारों संग्रह होने की भी कल्पना करें ... तो आपके मामले में यह विकल्प एक का उपयोग करने के लिए अनुशंसित है। अब अगर आपके पास सीमित संख्या में उपयोगकर्ता हैं, तो यह पहले से ही अलग है और हाँ, आप विकल्प दो का उपयोग कर सकते हैं जैसा आपने सोचा था।


-2

जबकि यहाँ चर्चा NoSQL और मुख्य रूप से MongoDB पर है, हम Citus में PostgreSQL का उपयोग कर रहे हैं और एक वितरित / शार्प मल्टी-टेनेंट डेटाबेस का निर्माण कर रहे हैं।

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

अधिक असंरचित डेटा के लिए, हम ऐसे और किरायेदार-विशिष्ट डेटा को संग्रहीत करने के लिए PostgreSQL के JSONB कॉलम का उपयोग करते हैं।

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