Wir schaffen SAAS, wo wir höchstens 50.000 Kunden haben werden. Wir erwägen, für jeden Kunden einen Benutzer in der Postgres-Datenbank zu erstellen. Wir werden jeden Benutzer, der sich bei unserem Dienst anmeldet, einem Benutzer in der Datenbank zuordnen, um sicherzugehen, dass er nur Zugriff auf seine eigenen Daten hat. Mit dieser Lösung möchten wir auch einen Audit-Trail direkt in der Datenbank implementieren , der Trigger verwendet. Wenn jeder Kunde einen eigenen Datenbankbenutzer hat, ist es sehr einfach zu erkennen, wer was getan hat, selbst wenn zwei Kunden dieselben Daten gemeinsam nutzen würden.
Werden wir auf unerwartete Probleme stoßen, weil wir 50.000 Benutzer in unserer Datenbank haben? In Bezug auf Leistung oder Verwaltung. Vielleicht wäre das Verbindungspooling schwieriger, aber ich weiß nicht wirklich, ob wir es brauchen würden.
set role actualUser
Antworten:
Ja, es sollte in Ordnung sein. Sie sollten jedoch das Verbindungspooling verwenden, da pg eine angemessene Menge an Speicher pro Verbindung verwendet (ca. 10 MB AFAIK).
Mehr als 500 gleichzeitige Verbindungen pro Box sind jedoch ein Problem (z. B. das aktive Abfragen der Datenbank genau zur gleichen Zeit). Mehr CPU / Kerne sind besser. Verwenden Sie SSDs mit RAID 10.
Ihre SaaS-Anwendung sollte sich als ein Benutzer und dann
set role
mit dem tatsächlichen Benutzer verbinden. Auf diese Weise können Sie das Verbindungspooling verwenden, da die Verbindungszeichenfolge identisch ist, jedoch unterschiedliche Benutzer verwendet. Sie solltenreset role
bei der Rückgabe der Verbindung zum Pool.Dies ist nicht wirklich eine Datenbankauthentifizierung. Es ist eine Proxy-Authentifizierung (auch bekannt als Identitätswechsel).
Sie können auch separate Pools pro Unternehmen oder pro Rolle in Betracht ziehen.
Um die Verwaltung zu vereinfachen, können Sie Benutzer in Gruppen einteilen und Berechtigungen über Gruppen festlegen. Dies wird als RBAC bezeichnet.
Update: Ich konnte in 2,4 Sekunden 50.000 Benutzer erstellen. PGAdmin ist aufgrund der Anzahl der Benutzer deutlich langsamer. Die Verbindung über JDBC ist jedoch so schnell wie zuvor. Ich konnte nicht 50.000 Benutzer gleichzeitig löschen, konnte aber ungefähr 10.000 gleichzeitig ausführen.
quelle
Leistung: Tausende gleichzeitige Verbindungen verbrauchen Ihren Speicher, ungefähr ein Wert über 1.000 gleichzeitige Verbindungen, die für die Verwendung von Verbindungspooling empfohlen werden. Pgbouncer ist eine gute, von Skype entwickelte Verbindung.
Verwalten: Das Verwalten von 50.000 Benutzern wird eine große Aufgabe sein, IMO. Wie wäre es, Kunden mit demselben Datenzugriff mit unterschiedlichen zu unterscheiden
application_name
, sodass jeder Kunde mit demselben Benutzernamen eine Verbindung zur Datenbank herstellt.Beispiel:
mit anderen Benutzernamen, würde die Verbindungszeichenfolge eines jeden Kunden sein:
--user user1
,--user user2
usw.Aber mit unterschiedlichen
application_name
wäre die Verbindungszeichenfolge des jeweiligen Kunden:--user user1 --application_name costumer1
,--user user1 --aplication_name costumer2
usw.Das
application_name
wird aufgezeichnetpg_stat_activity
und kann auch protokolliert werden. Ich denke, das wäre einfacher umzusetzen. Und dasapplication_name
wird auch in der Prüfung Trigger Sie anwenden möchten protokolliert. Weitere Details hier .Ich hoffe es hilft.
quelle