Wie erstelle ich eine mandantenfähige Datenbank mit gemeinsam genutzten Tabellenstrukturen?


129

Unsere Software läuft derzeit auf MySQL. Die Daten aller Mandanten werden im selben Schema gespeichert. Da wir Ruby on Rails verwenden, können wir leicht feststellen, welche Daten zu welchem ​​Mandanten gehören. Es gibt jedoch natürlich einige Unternehmen, die befürchten, dass ihre Daten kompromittiert werden könnten. Daher prüfen wir andere Lösungen.

Bisher habe ich drei Optionen gesehen:

  • Multi-Datenbank (jeder Mandant erhält seine eigene - fast 1 Server pro Kunde)
  • Multi-Schema (in MySQL nicht verfügbar, jeder Mandant erhält sein eigenes Schema in einer gemeinsam genutzten Datenbank)
  • Geteiltes Schema (unser aktueller Ansatz, möglicherweise mit zusätzlichen identifizierenden Datensätzen in jeder Spalte)

Multi-Schema ist mein Favorit (unter Berücksichtigung der Kosten). Das Erstellen eines neuen Kontos und das Durchführen von Migrationen scheint jedoch ziemlich schmerzhaft zu sein, da ich alle Schemas durchlaufen und ihre Tabellen / Spalten / Definitionen ändern müsste.

F: Multi-Schema scheint so konzipiert zu sein, dass es für jeden Mandanten leicht unterschiedliche Tabellen gibt - das möchte ich nicht. Gibt es ein RDBMS, mit dem ich eine Multi-Schema-Multi-Tenant-Lösung verwenden kann, bei der die Tabellenstruktur von allen Mandanten gemeinsam genutzt wird?

PS Mit Multi meine ich so etwas wie Ultra-Multi (10.000+ Mieter).


1
"Multi-Schema scheint so konzipiert zu sein, dass für jeden Mandanten leicht unterschiedliche Tabellen vorhanden sind" Also? Was ist los mit Multi-Schema und allen gleichen Tabellen? Wollen Sie damit sagen, dass Sie nicht in allen Schemata identische Tabellenstrukturen neu erstellen möchten? Oder sagen Sie, dass Sie nicht in allen Schemata identische Strukturen erstellen können?
S.Lott

+1 für gute / interessante Frage
AdaTheDev

2
@ S.Lott Ich erwarte mehr als 10.000 Mieter mit mehr als 100 Anmeldungen pro Tag. Wenn ich Millionen von Einträgen in einer einzigen Tabellendefinition habe (Definition = gemeinsam genutzt, Daten = isoliert), fühle ich mich besser als Tausende von Einträgen in Tausenden von Tabellendefinitionen. Da es nicht viele Leute so machen, bin ich mit Multi-Schema nicht so sicher.
Marcel Jackwerth

1
Ich stimme Daniel zu, Multi-Datenbank ist aufgrund dieser Zahlen ausgeschlossen. Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln, aber mehr für die Geschichte. Ein gemeinsamer Ansatz scheint definitiv der vernünftigste zu sein.
AdaTheDev

2
von Dynjo in einer Antwort: " Großartiger Artikel von Ryan Bigg zum genauen Thema"
Félix Gagnon-Grenier

Antworten:


95

Es gibt jedoch natürlich einige Unternehmen, die befürchten, dass ihre Daten kompromittiert werden könnten. Daher prüfen wir andere Lösungen.

Dies ist bedauerlich, da Kunden manchmal unter dem Missverständnis leiden, dass nur physische Isolation genügend Sicherheit bieten kann.

Es gibt einen interessanten MSDN-Artikel mit dem Titel Multi-Tenant Data Architecture , den Sie möglicherweise überprüfen möchten. So haben die Autoren das Missverständnis gegenüber dem gemeinsamen Ansatz angegangen:

Ein weit verbreitetes Missverständnis besagt, dass nur physische Isolation ein angemessenes Sicherheitsniveau bieten kann. Tatsächlich können Daten, die unter Verwendung eines gemeinsamen Ansatzes gespeichert werden, auch eine hohe Datensicherheit bieten, erfordern jedoch die Verwendung komplexerer Entwurfsmuster.

In Bezug auf technische und geschäftliche Überlegungen enthält der Artikel eine kurze Analyse, wo ein bestimmter Ansatz geeigneter sein könnte als ein anderer:

Die Anzahl, Art und Bedürfnisse der Mandanten, die Sie voraussichtlich bedienen werden, wirken sich auf unterschiedliche Weise auf Ihre Entscheidung zur Datenarchitektur aus. Einige der folgenden Fragen neigen Sie möglicherweise zu einem isolierteren Ansatz, während andere Sie zu einem gemeinsameren Ansatz neigen.

  • Wie viele potenzielle Mieter werden Sie voraussichtlich ansprechen? Sie sind vielleicht bei weitem nicht in der Lage, die voraussichtliche Nutzung mit Autorität abzuschätzen, aber denken Sie in Größenordnungen: Erstellen Sie einen Antrag für Hunderte von Mietern? Tausende? Zigtausende? Mehr? Je größer Ihre erwartete Kundenbasis ist, desto wahrscheinlicher ist es, dass Sie einen gemeinsameren Ansatz in Betracht ziehen.

  • Wie viel Speicherplatz sollen die Daten des durchschnittlichen Mieters belegen? Wenn Sie erwarten, dass einige oder alle Mandanten sehr große Datenmengen speichern, ist der Ansatz der separaten Datenbank wahrscheinlich am besten. (In der Tat können die Anforderungen an die Datenspeicherung Sie ohnehin dazu zwingen, ein separates Datenbankmodell zu verwenden. In diesem Fall ist es viel einfacher, die Anwendung von Anfang an so zu gestalten, als später zu einem separaten Datenbankansatz überzugehen.)

  • Wie viele gleichzeitige Endbenutzer soll der durchschnittliche Mieter unterstützen? Je größer die Anzahl, desto geeigneter ist ein isolierterer Ansatz, um die Anforderungen der Endbenutzer zu erfüllen.

  • Erwarten Sie, dass Sie Mehrwertdienste pro Mandant anbieten, z. B. Sicherungs- und Wiederherstellungsfunktionen pro Mandant? Solche Dienste sind durch einen isolierteren Ansatz einfacher anzubieten.


UPDATE: Weitere Informationen zur erwarteten Anzahl der Mieter.

Diese erwartete Anzahl von Mandanten (10.000) sollte den Multi-Datenbank-Ansatz für die meisten, wenn nicht alle Szenarien ausschließen. Ich glaube nicht, dass Ihnen die Idee gefällt, 10.000 Datenbankinstanzen zu verwalten und jeden Tag Hunderte neuer Instanzen erstellen zu müssen.

Allein aufgrund dieses Parameters scheint der Einzelschema-Ansatz für gemeinsam genutzte Datenbanken am besten geeignet zu sein. Die Tatsache, dass Sie nur etwa 50 MB pro Mandant speichern und keine Add-Ons pro Mandant vorhanden sind, macht diesen Ansatz noch geeigneter.

In dem oben zitierten MSDN-Artikel werden drei Sicherheitsmuster erwähnt, die Sicherheitsaspekte für den Shared-Database-Ansatz berücksichtigen:

Wenn Sie mit den Datensicherheitsmaßnahmen Ihrer Anwendung vertraut sind, können Sie Ihren Kunden ein Service Level Agrement anbieten , das starke Datensicherheitsgarantien bietet. In Ihrem SLA können Sie neben den Garantien auch die Maßnahmen beschreiben, die Sie ergreifen würden, um sicherzustellen, dass die Daten nicht kompromittiert werden.

UPDATE 2: Anscheinend haben die Microsoft-Leute einen neuen Artikel zu diesem Thema verschoben / erstellt, der ursprüngliche Link ist weg und dies ist der neue: Mandantenmuster für SaaS-Datenbanken mit mehreren Mandanten (ein großes Lob an Shai Kerer)


1
Oh, ich habe diesen Artikel gestern gescannt und diesen Teil des Missverständnisses übersprungen. Ich muss es noch einmal lesen.
Marcel Jackwerth

1
@Marcel: Abgesehen von der Wahrnehmung der Sicherheit durch die Kunden glaube ich jedoch, dass Ihre Entscheidung für einen mandantenfähigen Ansatz auf Faktoren wie den 4 Punkten basieren sollte, die ich aus dem MSDN-Artikel zitiert habe: 1. Erwartete Anzahl von Mietern . - 2. Erwarteter Speicherbedarf für jeden Mieter. - 3. Erwartete Anzahl gleichzeitiger Endbenutzer. - 4. Erwartete Addons pro Mieter.
Daniel Vassallo

1
Vielen Dank, dass Sie auf diesen Abschnitt hingewiesen haben. Anzahl = 10.000, Speicher = 50 MB, gleichzeitige Endbenutzer = 2 pro Mandant, Addons = 0. Die aktuelle Situation mit einem gemeinsamen Ansatz scheint also die vernünftigste zu sein. Ich denke, ich werde nächste Woche einige Anrufe tätigen, um herauszufinden, was Kunden wirklich brauchen / erwarten. Deutschland und Daten- / IT-Sicherheit sind eine wirklich schwierige Geschichte.
Marcel Jackwerth

1
Nur für die Benutzer, die dies von nun an lesen, existiert der erwähnte Artikel nicht mehr, jemand hat vielleicht eine Kopie gemacht?
gmslzr

1
@guillesalazar Ich bin mir nicht sicher, ob es dasselbe ist, aber ich denke, es ist - docs.microsoft.com/en-us/azure/sql-database/… (@DanielVassallo, wenn es dasselbe ist, erwägen Sie möglicherweise, den Link in Ihrem zu aktualisieren Antwort :-))
Shai Kerer

20

Meine Erfahrung (wenn auch SQL Server) ist, dass Multi-Datenbank der richtige Weg ist, bei dem jeder Client seine eigene Datenbank hat. Obwohl ich keine Erfahrung mit mySQL oder Ruby On Rails habe, hoffe ich, dass meine Eingabe einen Mehrwert bietet.

Die Gründe dafür sind:

  1. Datensicherheit / Disaster Recovery. Die Daten jedes Unternehmens werden vollständig getrennt von anderen Daten gespeichert, wodurch das Risiko einer Datenkompromittierung verringert wird (wenn Sie beispielsweise einen Codefehler einführen, der bedeutet, dass andere Kundendaten fälschlicherweise angezeigt werden, wenn dies nicht der Fall sein sollte), wird der potenzielle Verlust für einen Kunden minimiert, falls dies der Fall ist Eine bestimmte Datenbank wird beschädigt usw. Die wahrgenommenen Sicherheitsvorteile für den Kunden sind sogar noch größer (zusätzlicher Bonus-Nebeneffekt!).
  2. Skalierbarkeit. Im Wesentlichen würden Sie Ihre Daten partitionieren, um eine größere Skalierbarkeit zu ermöglichen. Beispielsweise können Datenbanken auf verschiedenen Datenträgern gespeichert werden. Sie können mehrere Datenbankserver online schalten und Datenbanken verschieben, um die Last leichter zu verteilen.
  3. Leistungsoptimierung. Angenommen, Sie haben einen sehr großen und einen sehr kleinen Kunden. Verwendungsmuster, Datenmengen usw. können stark variieren. Sie können bei Bedarf einfacher für jeden Client optimieren / optimieren.

Ich hoffe, dies bietet einige nützliche Beiträge! Es gibt noch mehr Gründe, aber meine Gedanken wurden leer. Wenn es wieder losgeht, werde ich aktualisieren :)

EDIT:
Seit ich diese Antwort gepostet habe, ist jetzt klar, dass es sich um mehr als 10.000 Mieter handelt. Meine Erfahrung liegt in Hunderten von großen Datenbanken - ich denke nicht, dass 10.000 separate Datenbanken für Ihr Szenario zu verwaltbar sein werden, daher bevorzuge ich jetzt nicht den Multi-DB-Ansatz für Ihr Szenario. Zumal jetzt klar ist, dass es sich bei jedem Mieter um kleine Datenmengen handelt!

Behalte meine Antwort hier sowieso bei, da sie für andere Leute in einem ähnlichen Boot (mit weniger Mietern) von Nutzen sein kann.


Ja, tut mir leid, dass ich das vorher nicht geklärt habe. Immer noch +1. ;)
Marcel Jackwerth

Wenn Sie über Datensicherheit sprechen, werden Sie sagen, dass jede Datenbank auf getrennten Servern / VMs platziert werden sollte? oder ist es sicher genug, alle Datenbanken auf einem einzelnen / Cluster-Server mit verschiedenen SQL-Benutzern zu haben?
Shay

@Shay - Nein, Sie sollten sie nicht auf separaten Servern platzieren müssen. Stellen Sie sich vor, Sie haben 100, das sind viele Serverinstanzen / Lizenzen, die Sie für den Start benötigen. Siehe Daniels Antwort weiter oben, da sind einige gute Links drin.
AdaTheDev

Ich würde zurück argumentieren, dass selbst wenn Multi-DB 10.000 separate Datenbanken bedeutet und die Wartungskosten erheblich steigen, Sie dieses Biest mithilfe von Automatisierungsskripten über Ihre Cloud-Infrastruktur zähmen können, sodass alles programmgesteuert verwaltet wird und nur wenig bis gar keinen menschlichen Aufwand erfordert
Korayem

17

Unten finden Sie einen Link zu einem Whitepaper auf Salesforce.com zur Implementierung von Mandantenfähigkeit:

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

Sie haben 1 große Tabelle mit 500 Zeichenfolgenspalten (Wert0, Wert1, ... Wert500). Daten und Zahlen werden als Zeichenfolgen in einem Format gespeichert, sodass sie auf Datenbankebene in ihre nativen Typen konvertiert werden können. Es gibt Metadatentabellen, die die Form des Datenmodells definieren, die pro Mandant eindeutig sein kann. Es gibt zusätzliche Tabellen für die Indizierung, Beziehungen, eindeutige Werte usw.

Warum der Ärger?

Jeder Mandant kann zur Laufzeit sein eigenes Datenschema anpassen, ohne Änderungen auf Datenbankebene vornehmen zu müssen (Tabelle ändern usw.). Dies ist definitiv der schwierige Weg, so etwas zu tun, ist aber sehr flexibel.


10

Wie Sie bereits erwähnt haben, ist eine Datenbank pro Mandant eine Option und hat einige größere Kompromisse. Es kann gut in kleineren Maßstäben wie einer einstelligen oder niedrigen Zehnern von Mietern funktionieren, aber darüber hinaus wird es schwieriger zu verwalten. Sowohl nur die Migrationen als auch die Aufrechterhaltung des Betriebs der Datenbanken.

Das Modell pro Schema ist nicht nur für eindeutige Schemas für jedes Schema nützlich, obwohl es immer noch schwierig wird, Migrationen über alle Mandanten hinweg auszuführen, und bei Tausenden von Schemas kann Postgres Probleme haben.

Ein skalierbarer Ansatz besteht darin, Mandanten zufällig zu verteilen, in derselben Datenbank zu speichern, jedoch über verschiedene logische Shards (oder Tabellen ). Abhängig von Ihrer Sprache gibt es eine Reihe von Bibliotheken, die Ihnen dabei helfen können. Wenn Sie Rails verwenden, gibt es eine Bibliothek, die vor dem Mandanten erstellt werden acts_as_tenantkann. Dadurch wird sichergestellt, dass Ihre Mandantenabfragen nur diese Daten zurückziehen . Es gibt auch ein Juwel apartment- obwohl es das Schemamodell verwendet, hilft es bei den Migrationen über alle Schemas hinweg. Wenn Sie Django verwenden, gibt es eine Nummer, aber eine der beliebtesten scheint schemaübergreifend zu sein . All dies hilft mehr auf Anwendungsebene. Wenn Sie direkt auf Datenbankebene nach etwas mehr suchen, ist Citus konzentriert sich darauf, diese Art von Sharding zu entwickelnMandantenfähigkeitsarbeit Arbeiten Sie mit Postgres mehr aus der Box heraus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.