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).
quelle
Antworten:
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:
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:
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)
quelle
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:
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.
quelle
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.
quelle
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_tenant
kann. Dadurch wird sichergestellt, dass Ihre Mandantenabfragen nur diese Daten zurückziehen . Es gibt auch ein Juwelapartment
- 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.quelle