CodamAIDocs
Themafertig

SINGLE und MULTI

Die zwei Betriebsarten der Datenhaltung: eine Datenbank für alle oder eine pro Mandant. Was sich dadurch ändert.

Ausprägungen
SINGLEMULTIBetriebsart fehlt → Start scheitertalter und neuer Schlüssel widersprechen sich → Start scheitertBetriebsart später wechseln

Worum es geht

Ein Mandant ist ein Kunde, dessen Daten von den Daten anderer Kunden getrennt bleiben müssen. Wie streng CDMS trennt, legt die Betriebsart fest. Es gibt genau zwei:

  • SINGLE: eine Datenbank für alles. Es gibt keine Mandanten.
  • MULTI: eine System-Datenbank für Daten der ganzen Installation und dazu eine eigene Datenbank je Mandant.

Die Betriebsart gilt für die ganze Installation, also für Datenbank und Dateiablage zugleich. Sie steht in der Umgebungsvariable CODAMAI_PERSISTENCE_TENANT_MODE.

Zwei Bilder

flowchart TB
    subgraph S["SINGLE"]
        direction TB
        SA(["Anfrage"]) --> SDB[("Datenbank single<br/>System-, Mandanten- und Benutzer-Modelle")]
    end
    subgraph M["MULTI"]
        direction TB
        MA(["Anfrage von Mandant acme"]) --> SYS[("Datenbank system<br/>System-Modelle")]
        MA --> T1[("Datenbank acme<br/>Mandanten- und Benutzer-Modelle")]
        T2[("Datenbank globex<br/>Mandanten- und Benutzer-Modelle")]
    end

In MULTI erreicht die Anfrage von acme nur zwei Datenbanken: die System-Datenbank, die alle teilen, und ihre eigene. Die Datenbank von globex kommt in ihrem Weg nicht vor. Welche Modelle wohin gehören, steht unter Modell-Ebenen.

Was sich unterscheidet

SINGLE und MULTI im Vergleich
SINGLE
eine Datenbank
  • eine Datenbank für alle Modelle
  • der Mandant im Token wird ignoriert
  • kein Mandantenwechsel, keine Prüfung, ob ein Mandant bedient wird
  • Dateien ohne Mandanten-Verzeichnis
  • Owner-Filter der Benutzer-Modelle wirkt trotzdem
  • für Installationen mit genau einem Kunden, für Entwicklung und Test
MULTI
eine Datenbank je Mandant
  • System-Datenbank plus eine Datenbank je Mandant
  • jede Anfrage einer Person braucht einen Mandanten, sonst 403
  • CIAS prüft bei jeder Anfrage, ob der Mandant bedient wird
  • Mandantenwechsel per Header für berechtigte Personen
  • Dateien in einem Verzeichnis je Mandant
  • für Installationen mit mehreren Kunden
Wohin ein Modell in welcher Betriebsart geht
Ebene des ModellsBetriebsartDatenbank
SystemSINGLEdie eine Datenbank
Mandant oder BenutzerSINGLEdie eine Datenbank
SystemMULTISystem-Datenbank
Mandant oder BenutzerMULTIDatenbank des Mandanten der Anfrage

Die ganze Entscheidung, auch für die Fehlerfälle, steht unter Welche Datenbank? Das Persistenzziel.

Was SINGLE mit dem Mandanten im Token macht

Auch in SINGLE kann ein Token einen Mandanten tragen, etwa weil derselbe Keycloak mehrere Anwendungen bedient. CDMS wertet ihn dann gar nicht aus:

  • CIAS ermittelt keinen Mandanten und fragt auch nicht nach, ob er bedient wird.
  • Die Liste der erlaubten Mandanten bleibt leer. Ein Header tenant kann deshalb nichts wechseln.
  • Alle Modelle landen in der einen Datenbank.

Die Trennung nach Personen hängt nicht an der Betriebsart: Der Owner-Filter der Benutzer-Modelle wirkt in SINGLE genauso wie in MULTI.

Einstellen

Die Betriebsart beim Start

Wann: CODAMAI_PERSISTENCE_TENANT_MODE=SINGLE oder =MULTI

  1. 1
    CDMS
    liest die Betriebsart beim Start
  2. 2
    CDMS
    richtet Datenbankzugriff, Dateiablage und die Mandantenprüfung von CIAS danach aus

Ergebnis: Die Anwendung startet.

Wann: Die Variable ist nicht gesetzt.

  1. 1
    CDMS
    findet keine Betriebsart; einen Standardwert gibt es absichtlich nicht
  2. 2
    CDMS
    bricht den Start mit einer Fehlermeldung ab, die den Namen der Einstellung nennt

Ergebnis: Ein Standardwert würde still eine Trennung abschalten, die jemand erwartet hat, oder eine erfinden, die niemand bestellt hat.

Wann: Zusätzlich ist der alte Schlüssel CODAMAI_PERSISTENCE_DATABASE_MODE (früher CDMS_DATABASE_MODE) gesetzt.

  1. 1
    CDMS
    vergleicht den alten mit dem neuen Wert
  2. 2
    CDMS
    gleich → Warnung im Log, der alte Schlüssel soll entfernt werden
  3. 3
    CDMS
    verschieden → Start bricht ab, die Meldung nennt beide Werte

Ergebnis: Keiner der beiden Werte gewinnt still. Ein Widerspruch ist ein Konfigurationsfehler.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • commons-persistence – TenantMode, TenantProperties (codamai.persistence.tenant.mode, @NotNull), TenantModeConsistencyCheck, LegacyPersistencePropertyMapper
  • commons-persistence – DataSourceManager.getConnection (Schlüssel single), TenantEntityManagerFactory.cacheKey, DatabaseRequestContext.resolveTenant
  • CDMS/cdms-persistence-database – EntityClassFilterService (singleDatabasEntity, multiDatabasEntity)
  • CIAS/cias-kernel – TenantRequirement; CIAS/cias-authentication – TokenParser.admit (ADR-035), JwtSessionFilter.tenantMissing
  • commons-persistence – TenantProvisioningConfiguration (NoOp bei SINGLE)
Suchen