Ist es möglich, Tausende von Benutzern in Postgres zu haben?

9

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.

David
quelle
2
Sie können kein Verbindungspooling durchführen, wenn Sie DB Auth verwenden, oder? Für die Leistung ist das wichtige Problem die Anzahl der gleichzeitigen Verbindungen und die Menge der verwendeten Ressourcen anstelle der Anzahl der Benutzer in der Datenbank.
Jack sagt, versuchen Sie es mit topanswers.xyz am
2
@JackDouglas Ja, Sie können das Verbindungspooling verwenden. Verbinden Sie sich dann als "commonUser"set role actualUser
Neil McGuigan
2
@Neil sicher, aber das ist keine DB-Authentifizierung. Wenn Sie sich mit dem Kennwort des Datenbankbenutzers authentifizieren, müssen Sie in postgres eine Art externe Authentifizierung verwenden.
Jack sagt, versuchen Sie es mit topanswers.xyz am
2
@ JackDouglas Sie haben Recht, es ist Proxy-Authentifizierung im Gegensatz zu DB-Authentifizierung.
Neil McGuigan
Die bisherigen Antworten gehen von einer hohen Anzahl gleichzeitiger Benutzer aus. Wird dies der Fall sein?
Jack sagt, versuchen Sie es mit topanswers.xyz am

Antworten:

12

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 rolemit dem tatsächlichen Benutzer verbinden. Auf diese Weise können Sie das Verbindungspooling verwenden, da die Verbindungszeichenfolge identisch ist, jedoch unterschiedliche Benutzer verwendet. Sie sollten reset rolebei 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.

Neil McGuigan
quelle
Vielen Dank für Ihre Recherche. War es überhaupt möglich, in PGAdmin zu arbeiten? War es ein großes Problem mit der Leistung dort?
David
@ David PGAdmin war okay, nur langsam. psql sollte in Ordnung sein. Könnte in der Lage sein, PGAdmin zu optimieren, um die Dinge zu beschleunigen.
Neil McGuigan
2

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 user2usw.

Aber mit unterschiedlichen application_namewäre die Verbindungszeichenfolge des jeweiligen Kunden: --user user1 --application_name costumer1, --user user1 --aplication_name costumer2usw.

Das application_namewird aufgezeichnet pg_stat_activityund kann auch protokolliert werden. Ich denke, das wäre einfacher umzusetzen. Und das application_namewird auch in der Prüfung Trigger Sie anwenden möchten protokolliert. Weitere Details hier .

Ich hoffe es hilft.

Soni Harriz
quelle
4
Wie ist die Verwaltung von 50.000 dB-Benutzern schwieriger als die Verwaltung von 50.000 App-Benutzern?
Neil McGuigan