Tworzymy SAAS, w którym będziemy mieli co najwyżej 50 000 klientów. Rozważamy utworzenie użytkownika w bazie danych Postgres dla każdego klienta. Mapujemy każdego użytkownika, który loguje się w naszym serwisie, do użytkownika w bazie danych, aby mieć pewność, że mają oni dostęp tylko do własnych danych. Chcemy również wdrożyć ścieżkę audytu bezpośrednio w bazie danych za pomocą tych rozwiązań , które wykorzystują wyzwalacze. Jeśli każdy klient ma własnego użytkownika bazy danych, bardzo łatwo byłoby zobaczyć, kto co zrobił, nawet jeśli dwóch klientów podzieliłoby te same dane.
Czy napotkamy jakieś nieoczekiwane problemy, ponieważ w naszej bazie danych znajduje się 50 000 użytkowników? Pod względem wydajności lub administracji. Może pula połączeń byłaby trudniejsza, ale tak naprawdę nie wiem, czy byśmy tego potrzebowali.
set role actualUser
Odpowiedzi:
Tak, powinno być dobrze. Powinieneś jednak używać puli połączeń, ponieważ pg zużywa sporo pamięci na połączenie (około 10 MB AFAIK).
Problemem będzie jednak ponad 500 jednoczesnych połączeń na skrzynkę (np. Aktywne odpytywanie bazy danych w tym samym czasie). Więcej procesorów / rdzeni jest lepsze. Używaj dysków SSD z macierzą RAID 10.
Twoja aplikacja SaaS powinna łączyć się jako jeden użytkownik, a następnie
set role
prawdziwy użytkownik. Pozwala to na użycie puli połączeń, ponieważ parametry połączenia będą takie same, ale będą używać różnych użytkowników. Powinieneśreset role
powracać do puli.To nie jest tak naprawdę uwierzytelnianie bazy danych. To uwierzytelnianie przez proxy (inaczej Personifikacja).
Można również rozważyć oddzielne pule dla firmy lub roli.
Aby ułatwić administrowanie, możesz umieszczać użytkowników w grupach i ustawiać uprawnienia za pośrednictwem grup. Nazywa się to RBAC.
Aktualizacja: Udało mi się utworzyć 50 000 użytkowników w 2,4 sekundy. PGAdmin jest zauważalnie wolniejszy ze względu na liczbę użytkowników. Jednak łączenie przez JDBC jest tak szybkie, jak wcześniej. Nie mogłem zrzucić 50 000 użytkowników naraz, ale mogłem zrobić około 10 000 naraz.
źródło
Wydajność: tysiące równoczesnych połączeń pochłonie Twoją pamięć, w przybliżeniu wartość powyżej 1000 równoczesnych połączeń zaleca się korzystanie z puli połączeń, pgbouncer jest dobrym rozwiązaniem opracowanym przez skype.
Administrowanie: administracja 50 000 użytkowników będzie wielkim zadaniem IMO. Co powiesz na różnicowanie klienta z tym samym dostępem do danych przy użyciu różnych
application_name
, więc każdy klient będzie łączył się z bazą danych przy użyciu tej samej nazwy użytkownika.Przykład:
używając innej nazwy użytkownika, ciąg połączenia z każdym klientem byłoby:
--user user1
,--user user2
, itd.Ale stosując różne
application_name
, ciąg połączenia z każdym klientem byłoby:--user user1 --application_name costumer1
,--user user1 --aplication_name costumer2
, itd.application_name
Jest rejestrowana wpg_stat_activity
i mogą być również rejestrowane. Myślę, że łatwiej byłoby to wdrożyć. Iapplication_name
jest również zalogowany w wyzwalaczu kontroli, który chcesz zastosować. Więcej informacji tutaj .Mam nadzieję, że to pomoże.
źródło