แนวทางที่แนะนำสำหรับฐานข้อมูลแบบหลายผู้เช่าใน MongoDB คืออะไร?


99

ฉันกำลังคิดที่จะสร้างแอปหลายผู้เช่าโดยใช้ MongoDB ฉันยังไม่รู้เลยว่าจะมีผู้เช่ากี่คน แต่ฉันอยากจะขยายเป็นหลักพัน

ฉันคิดได้สามกลยุทธ์:

  1. ผู้เช่าทั้งหมดในคอลเล็กชันเดียวกันโดยใช้ฟิลด์เฉพาะผู้เช่าเพื่อความปลอดภัย
  2. 1 คอลเล็กชันต่อผู้เช่าในฐานข้อมูลที่ใช้ร่วมกันเดียว
  3. 1 ฐานข้อมูลต่อผู้เช่า

เสียงในหัวของฉันกำลังบอกให้ฉันเลือกตัวเลือกที่ 2

ความคิดและความหมายใคร?


เรียน @Braintapper ตอนนี้เราอยู่ในสถานการณ์เดียวกันกับแอปพลิเคชันของเราที่ต้องการให้มีผู้เช่าหลายราย คุณมีประสบการณ์อะไรจะแบ่งปัน? จะดีมากขอบคุณ
Joshua Muheim

3
สำหรับแอพของฉันฉันลงเอยด้วย Postgresql (เราได้รับประโยชน์จากฐานข้อมูลเชิงสัมพันธ์ที่มีฟังก์ชันคล้าย NoSQL ผ่านส่วนขยาย hstore) แทน MongoDB และจัดการการเช่าหลายรายการใน Rails ด้วยการกำหนดขอบเขต เราใช้วิธีการที่คล้ายกันกับวิธีที่ใช้ใน Railscast นี้: railscasts.com/episodes/388-multitenancy-with-scopes
Braintapper

2
ฉันรู้ว่าคำตอบที่ได้รับเลือกแล้วสำหรับคำถามนี้ แต่คนอื่นควรดูเอกสารอย่างเป็นทางการนี้ในเว็บไซต์ mongohq: support.mongohq.com/use-cases/multi-tenant.html เห็นได้ชัดว่าสนับสนุนการต่อต้านโซลูชัน @Braintapper ด้านล่าง

1
อัปเดตคำตอบแล้ว ข้อมูลในลิงค์ของคุณไม่พร้อมใช้งานในเดือนพฤษภาคม 2010
Braintapper

@Braintapper คุณใช้โซลูชัน postgresql (อ้างอิงจาก railscasts.com) อยู่ตอนนี้หรือไม่? อยากใช้ แต่ไม่แน่ใจว่ามันเพิ่มความปลอดภัยและรองรับผู้เช่าได้กี่คน! ได้โปรดฉันต้องการความคิดเห็นของคุณเกี่ยวกับประสบการณ์นี้ ขอบคุณ
medBouzid

คำตอบ:


73

ฉันมีปัญหาเดียวกันในการแก้ปัญหาและกำลังพิจารณารูปแบบต่างๆ เนื่องจากฉันมีประสบการณ์ในการสร้างแอปพลิเคชันผู้เช่าหลายคนของ SaaS ฉันก็จะเลือกตัวเลือกที่สองตามประสบการณ์เดิมของฉันกับฐานข้อมูลเชิงสัมพันธ์

ในขณะที่ทำการวิจัยฉันพบบทความนี้ในเว็บไซต์สนับสนุน mongodb (ทางกลับเพิ่มเนื่องจากมันหายไป): https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi -tenant.html

พวกเขาระบุว่าให้หลีกเลี่ยงตัวเลือกที่ 2 โดยไม่เสียค่าใช้จ่ายใด ๆ ซึ่งตามที่ฉันเข้าใจไม่ได้เจาะจงเฉพาะกับ mongodb ความประทับใจของฉันคือสิ่งนี้ใช้ได้กับฐานข้อมูล NoSQL ส่วนใหญ่ที่ฉันค้นคว้า (CoachDB, Cassandra, CouchBase Server เป็นต้น) เนื่องจากลักษณะเฉพาะของการออกแบบฐานข้อมูล

คอลเล็กชัน (หรือที่เก็บข้อมูลหรือที่พวกเขาเรียกว่าในฐานข้อมูลที่แตกต่างกัน) ไม่ใช่สิ่งเดียวกับสกีมาความปลอดภัยใน RDBMS แม้ว่าจะมีพฤติกรรมเป็นที่เก็บเอกสาร แต่ก็ไม่มีประโยชน์สำหรับการแยกผู้เช่าที่ดี ฉันไม่พบฐานข้อมูล NoSQL ที่สามารถใช้ข้อ จำกัด ด้านความปลอดภัยตามคอลเล็กชันได้

แน่นอนคุณสามารถใช้การรักษาความปลอดภัยตามบทบาท mongodb เพื่อ จำกัด การเข้าถึงในระดับฐานข้อมูล / เซิร์ฟเวอร์ ( http://docs.mongodb.org/manual/core/authorization/ )

ฉันขอแนะนำตัวเลือกแรกเมื่อ:

  • คุณมีเวลาและทรัพยากรเพียงพอที่จะจัดการกับความซับซ้อนของการออกแบบการใช้งานและการทดสอบสถานการณ์นี้
  • หากคุณจะไม่มีความแตกต่างมากนักในโครงสร้างและการทำงานในฐานข้อมูลสำหรับผู้เช่ารายอื่น
  • การออกแบบแอปพลิเคชันของคุณจะช่วยให้ผู้เช่าทำการปรับแต่งเพียงเล็กน้อยในขณะรันไทม์
  • หากคุณต้องการเพิ่มประสิทธิภาพพื้นที่และลดการใช้ทรัพยากรฮาร์ดแวร์
  • หากคุณกำลังจะมีผู้เช่าหลายพันคน
  • หากคุณต้องการขยายขนาดอย่างรวดเร็วและมีต้นทุนที่ดี
  • หากคุณจะไม่สำรองข้อมูลตามผู้เช่า (เก็บสำรองแยกกันสำหรับผู้เช่าแต่ละราย) เป็นไปได้ที่จะทำเช่นนั้นแม้ในสถานการณ์นี้ แต่ความพยายามจะมาก

ฉันจะไปหาตัวแปร 3 ถ้า:

  • คุณจะมีรายชื่อผู้เช่าจำนวนน้อย (หลายร้อยราย)
  • ข้อมูลเฉพาะของธุรกิจต้องการให้คุณสามารถรองรับความแตกต่างใหญ่ในโครงสร้างฐานข้อมูลสำหรับผู้เช่ารายต่างๆ (เช่นการรวมเข้ากับระบบของบุคคลที่สามการนำเข้า - ส่งออกข้อมูล)
  • การออกแบบแอปพลิเคชันของคุณจะช่วยให้ลูกค้า (ผู้เช่า) ทำการเปลี่ยนแปลงที่สำคัญในรันไทม์ของแอปพลิเคชัน (การเพิ่มโมดูลการปรับแต่งฟิลด์ ฯลฯ )
  • หากคุณมีทรัพยากรเพียงพอที่จะขยายขนาดด้วยโหนดฮาร์ดแวร์ใหม่ได้อย่างรวดเร็ว
  • หากคุณจำเป็นต้องเก็บเวอร์ชัน / สำรองข้อมูลต่อผู้เช่า นอกจากนี้การคืนค่าจะง่าย
  • มีข้อ จำกัด ทางกฎหมาย / ข้อบังคับที่บังคับให้คุณเก็บผู้เช่าที่แตกต่างกันไว้ในฐานข้อมูลที่แตกต่างกัน (แม้แต่ศูนย์ข้อมูล)
  • หากคุณต้องการใช้คุณลักษณะด้านความปลอดภัยแบบสำเร็จรูปของ mongodb เช่นบทบาท
  • มีความแตกต่างกันมากในเรื่องของขนาดระหว่างผู้เช่า (คุณมีผู้เช่ารายเล็กจำนวนมากและผู้เช่ารายใหญ่เพียงไม่กี่ราย)

หากคุณโพสต์รายละเอียดเพิ่มเติมเกี่ยวกับใบสมัครของคุณฉันอาจให้คำแนะนำโดยละเอียดเพิ่มเติมแก่คุณได้


9
ฉันเดาว่าลิงค์เดิมตายไปแล้วไปเก็บไว้ที่: web.archive.org/web/20140812091703/http://support.mongohq.com/…
Peter Butkovic

สวัสดีเราจะสร้างฐานข้อมูลใหม่ด้วยฐานข้อมูลปัจจุบันโดยใช้ mongodb ได้อย่างไร
HEMAL

@ รัสเซียเราจะจัดการกับการจัดทำดัชนีอย่างไรหากเราจะเลือก 1
Robins Gupta

10

ฉันพบคำตอบที่ดีในความคิดเห็นในลิงค์นี้:

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

โดยทั่วไปตัวเลือก # 2 น่าจะเป็นวิธีที่ดีที่สุด

อ้างจากความคิดเห็นของ David Mytton:

เราตัดสินใจที่จะไม่มีฐานข้อมูลต่อลูกค้าเนื่องจากวิธีที่ MongoDB จัดสรรไฟล์ข้อมูล แต่ละฐานข้อมูลใช้ชุดไฟล์ของตัวเอง:

ไฟล์แรกสำหรับฐานข้อมูลคือ dbname.0 จากนั้น dbname.1 เป็นต้น dbname.0 จะเป็น 64MB, dbname.1 128MB เป็นต้นสูงสุด 2GB เมื่อไฟล์มีขนาดถึง 2GB ไฟล์ต่อเนื่องแต่ละไฟล์จะมีขนาด 2GB เช่นกัน

ดังนั้นหากมีการพูดถึง datafile ล่าสุด 1GB ไฟล์นั้นอาจว่างเปล่า 90% หากเพิ่งมาถึง

จากคู่มือ

เมื่อผู้ใช้ลงทะเบียนเพื่อทดลองใช้และเริ่มต้นใช้งานเราจะได้รับฐานข้อมูลที่มีขนาดอย่างน้อย 2GB มากขึ้นเรื่อย ๆ แม้ว่าไฟล์ข้อมูลทั้งหมดจะไม่ได้ใช้ เราพบว่าสิ่งนี้ใช้พื้นที่ดิสก์จำนวนมากเมื่อเทียบกับการมีฐานข้อมูลหลายฐานข้อมูลสำหรับลูกค้าทั้งหมดซึ่งสามารถใช้พื้นที่ดิสก์ได้อย่างมีประสิทธิภาพสูงสุด

การ Sharding จะเป็นแบบมาตรฐานตามคอลเลกชันซึ่งนำเสนอปัญหาที่คอลเลกชันไม่เคยถึงขนาดต่ำสุดในการเริ่มต้นการชาร์ดเช่นเดียวกับกรณีของเราบางส่วน (เช่นคอลเลกชันที่เก็บรายละเอียดการเข้าสู่ระบบของผู้ใช้) อย่างไรก็ตามเราได้ขอให้สามารถทำได้ในแต่ละระดับฐานข้อมูล ดู http://jira.mongodb.org/browse/SHARDING-41

ไม่มีการแลกเปลี่ยนประสิทธิภาพโดยใช้คอลเลกชันจำนวนมาก ดู http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections


2
ตามที่แนะนำไว้ในคำตอบอื่น ๆ # 2 ไม่ใช่แนวทางที่ดี โปรดพิจารณาเปลี่ยนคำตอบที่ได้รับการยอมรับเนื่องจากอาจทำให้นักพัฒนารายอื่นพลาด
clopez

1
คำตอบที่ยอมรับได้เปลี่ยนไปเนื่องจากสิ่งต่าง ๆ มีการเปลี่ยนแปลงอย่างมากตั้งแต่ปี 2010 เมื่อคำถามถูกถามครั้งแรก
Braintapper

3

มีบทความที่สมเหตุสมผลเกี่ยวกับ MSDN เกี่ยวกับสถาปัตยกรรมข้อมูลหลายผู้เช่าซึ่งคุณอาจต้องการอ้างถึง หัวข้อสำคัญบางส่วนที่เกี่ยวข้องกับบทความนี้:

  • ข้อพิจารณาด้านเศรษฐกิจ
  • ความปลอดภัย
  • การพิจารณาผู้เช่า
  • กฎข้อบังคับ (กฎหมาย)
  • ความกังวลเรื่องทักษะ

นอกจากนี้ยังมีรูปแบบบางอย่างสำหรับการกำหนดค่า Software as a Service (SaaS)

นอกจากนี้ตัวผู้มูลค่าเป็นเขียนขึ้นที่น่าสนใจจากคน SQL Anywhere

ส่วนตัวของฉันเอง - เว้นแต่คุณจะมั่นใจว่ามีการบังคับใช้ความปลอดภัย / ความน่าเชื่อถือฉันจะใช้ตัวเลือกที่ 3 หรือหากข้อกังวลเกี่ยวกับความสามารถในการปรับขยายได้ห้ามไม่ให้ใช้ทางเลือกที่ 2 เป็นอย่างน้อย ที่บอกว่า ... ฉันไม่ใช่มืออาชีพกับ MongoDB ฉันค่อนข้างกังวลเมื่อใช้ "สคีมา" ที่ใช้ร่วมกัน - แต่ฉันยินดีที่จะเลื่อนไปตามผู้ปฏิบัติงานที่มีประสบการณ์มากกว่า


ฉันคุ้นเคยกับบทความ MSDN เนื่องจากแผนเดิมของฉันคือการใช้ฐานข้อมูลเชิงสัมพันธ์ ข้อมูลของฉันค่อนข้างไม่มีโครงสร้างซึ่งตอนนี้ฉันตรวจสอบ NoSQL dbs เช่น MongoDB ดูเหมือนว่า MongoDB จะไม่รองรับ ACL แบบที่ Lotus Domino ทำและฉันไม่ต้องการสร้างวงล้อใหม่ซึ่งทำให้ฉันคิดว่า 2 หรือ 3 เป็นวิธีที่จะไป ฉันไม่รู้ด้วยว่ามีข้อ จำกัด ที่ฉันอาจพบในแง่ของ # คอลเลกชันหรือ dbs ที่อนุญาตใน MongoDB หรือไม่
Braintapper

3

ฉันจะไปที่ตัวเลือก 2

อย่างไรก็ตามคุณสามารถตั้งค่าตัวเลือกบรรทัดคำสั่ง mongod.exe --smallfiles ซึ่งหมายความว่าขนาดไฟล์ที่ใหญ่ที่สุดของขอบเขตจะเป็น 0.5 กิกะไบต์และไม่ใช่ 2 กิกะไบต์ ฉันทดสอบสิ่งนี้ด้วย mongo 1.42 ดังนั้นตัวเลือกที่ 3 จึงไม่เป็นไปไม่ได้


เพื่อเป็นการช่วยย้อนหลัง: http://yazezo.com/2013/10/how-to-setup-saas-cloud-multi-tenant.html
KMån

0

จากการวิจัยของฉันในMongoDB Trucos y consejos Aplicaciones multitenant ไม่แนะนำให้ใช้ตัวเลือกนั้นหากคุณไม่ทราบว่าคุณสามารถมีผู้เช่าได้กี่คนซึ่งอาจมีจำนวนหลายพันคนและจะมีความซับซ้อนเมื่อต้องใช้การแยกชิ้นส่วนลองนึกภาพว่ามีคอลเล็กชันหลายพันรายการในฐานข้อมูลเดียว ... ดังนั้นในกรณีของคุณ ขอแนะนำให้ใช้ตัวเลือกที่หนึ่ง ตอนนี้ถ้าคุณจะมีผู้ใช้จำนวน จำกัด มันก็แตกต่างกันไปแล้วและใช่คุณสามารถใช้ตัวเลือกที่สองได้อย่างที่คิด


-2

ในขณะที่การสนทนาอยู่ที่ NoSQL และส่วนใหญ่เป็น MongoDB พวกเราที่Citusกำลังใช้ PostgreSQL และสร้างฐานข้อมูลผู้เช่าหลายรายแบบกระจาย / แยกส่วน

คู่มือการใช้งานของเราจะอธิบายถึงแอปตัวอย่างซึ่งครอบคลุมสคีมาและคุณลักษณะเฉพาะของผู้เช่าหลายราย

สำหรับข้อมูลที่ไม่มีโครงสร้างเพิ่มเติมเราใช้คอลัมน์ JSONB ของ PostgreSQL เพื่อจัดเก็บข้อมูลดังกล่าวและเฉพาะผู้เช่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.