Konfiguruję system SaaS, w którym planujemy udostępnić każdemu klientowi własną bazę danych. System jest już skonfigurowany, dzięki czemu możemy łatwo skalować się do dodatkowych serwerów, jeśli obciążenie staje się zbyt duże; mamy nadzieję, że będziemy mieć tysiące, a nawet dziesiątki tysięcy klientów.
pytania
- Czy istnieje jakieś praktyczne ograniczenie liczby mikrodanych, które możesz / powinieneś mieć na jednym serwerze SQL?
- Czy może to wpłynąć na wydajność serwera?
- Czy lepiej jest mieć 10 000 baz danych po 100 MB każda, czy jedną bazę danych o pojemności 1 TB?
Dodatkowe informacje
Kiedy mówię „mikro-bazy danych”, tak naprawdę nie mam na myśli „mikro”; Chodzi mi o to, że naszym celem są tysiące klientów, więc każda pojedyncza baza danych stanowiłaby tylko jedną tysięczną lub mniej całkowitej ilości danych. W rzeczywistości każda baza danych miałaby około 100 MB znaku, w zależności od tego, ile zużywa.
Głównym powodem korzystania z 10 000 baz danych jest skalowalność. Faktem jest, że V1 systemu ma jedną bazę danych i mieliśmy pewne niewygodne momenty, gdy DB obciążało się.
To obciążało procesor, pamięć, wejścia / wyjścia - wszystkie powyższe. Mimo że rozwiązaliśmy te problemy, uświadomiliśmy sobie, że w pewnym momencie, nawet przy najlepszym indeksowaniu na świecie, jeśli odniesiemy taki sukces, jaki mamy nadzieję, po prostu nie możemy umieścić wszystkich naszych danych w jednym wielkim szczerciu ' Baza danych. W przypadku wersji V2 dzielimy fragmenty, abyśmy mogli podzielić obciążenie między wiele serwerów DB.
Ostatni rok spędziłem na opracowywaniu tego odłamkowego rozwiązania. Jest to jedna licencja na serwer, ale i tak jest to załatwione, ponieważ używamy maszyn wirtualnych na platformie Azure. Powodem, dla którego pojawia się teraz pytanie, było to, że wcześniej oferowaliśmy tylko duże instytucje i zakładaliśmy każdą z nich sami. Nasze następne zamówienie to model samoobsługowy, w którym każda osoba posiadająca przeglądarkę może zarejestrować się i stworzyć własną bazę danych. Ich bazy danych będą znacznie mniejsze i znacznie liczniejsze niż duże instytucje.
Wypróbowaliśmy elastyczne pule bazy danych SQL Azure . Wydajność była bardzo rozczarowująca, więc wróciliśmy do zwykłych maszyn wirtualnych.
źródło
Są więc zalety i wady obu metod. Nie wiedząc więcej o Twojej aplikacji lub usługach, które chcesz świadczyć, nie będę w stanie udzielić ostatecznej odpowiedzi, ale podzielę się swoimi przemyśleniami na ten temat.
Mój przypadek, dlaczego warto używać 1 bazy danych dla wszystkich klientów.
Plusy
Łatwa konserwacja. Posiadanie jednego DB oznacza, że musisz wykonać zadanie konserwacyjne tylko w jednym miejscu zamiast w wielu. Wyobraź sobie koszmar obsługi 1000 różnych baz danych, których kopie zapasowe chcesz wykonać. Co powiesz na aktualizację statystyk na 1000 DB lub przebudowanie indeksów lub
DBCC CHECKDB
?Wdrażanie kodu. Załóżmy, że masz problem z procedurą przechowywaną w kodzie aplikacji lub raportowaniu. Musisz dokonać szybkiej zmiany ... Teraz musisz wdrożyć tę zmianę na ponad 1000 baz danych. Nie, dziękuję, wolałbym nie.
Dobra widoczność. Wyobraź sobie, że SSMS próbuje otworzyć ponad 1000 DB (dreszcz) . Praktycznie sprawiłoby, że problem byłby bezużyteczny, a otwarcie i renderowanie SSMS zająłoby zaskakująco dużo czasu. Pamiętaj, że jeśli jesteś w stanie wymyślić porządną konwencję nazewnictwa.
Cons
Bezpieczeństwo. Łatwiej byłoby uniemożliwić ludziom przeglądanie danych innych klientów, gdybyś miał je jako osobne bazy danych. Istnieją jednak bardzo proste rzeczy, które możesz zrobić, aby temu zapobiec.
Występ. Można argumentować, że ograniczenie go do jednego DB na klienta oznacza, że SQL Server będzie musiał skanować mniej danych, aby uzyskać informacje, o które pytasz. Jednak przy odpowiedniej strukturze danych i dobrym indeksowaniu (i możliwym partycjonowaniu) możesz to wyeliminować jako problem, jeśli zostanie to wykonane ostrożnie. Poleciłbym dać każdej tabeli, która zawiera dane specyficzne dla klienta, jakiś sposób prowadzący
CompanyID
do zmniejszenia tego narzutu.Ostatecznie myślę, że najlepszym rozwiązaniem jest posiadanie jednego DB dla Twojej aplikacji i po prostu dzielenie danych klientów w samym DB. Problemy, które ci to przyniesie, nie będą niczym w porównaniu z koszmarem zarządzania ponad 1000 bazami danych.
źródło
Specyfikacje maksymalnej pojemności dla SQL Server stwierdzają, że istnieje limit 32 767.
Jeśli chodzi o to, czy wpłynie to na wydajność, odpowiedź brzmi tak, ale sposób, w jaki wpłynie na wydajność i czy będzie znaczny, będzie zależeć od niezliczonych czynników.
Wybrałbym jedną bazę danych, chyba że istnieje dobry powód, aby podzielić ją na 10 000 baz danych. Jedna kopia zapasowa czy 10 000 kopii zapasowych? Jedna kontrola integralności, czy 10 000? Może istnieć dobry powód, aby użyć 10 000 małych baz danych, ale nie podałeś wystarczających szczegółów, aby to ustalić. Pytanie, które zadałeś, jest dość szerokie i po prostu nie ma wystarczających informacji, aby ktokolwiek wiedział, jaka jest najlepsza odpowiedź.
źródło
Mówisz tutaj o architekturze z wieloma dzierżawcami a architekturą z wieloma instancjami . Po prostu przywołuję te warunki, ponieważ nie używasz ich w swoim pytaniu, ale to, o czym rozmawiasz, nazywa się, a jeśli po prostu podłączysz do Google „architekturę wielu dzierżawców”, znajdziesz bogactwo zasobów i dyskusji o tym, napisano na nim całe książki.
Kilka dobrych zasobów dotyczących SQL Servera tutaj:
https://msdn.microsoft.com/en-us/library/ff966499.aspx
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-design-patterns-multi-tenancy-saas-applications
Byłbym z innymi odpowiedziami, ponieważ zdecydowanie skłaniałbym się ku wielu dzierżawcom jako domyślnemu, chyba że masz ważne powody, by faworyzować wiele wystąpień.
Aby skalować, nie trzeba dzielić na tysiące indywidualnych baz danych klientów, istnieje wiele innych sposobów, które mogą być lepsze. Jak klastrowanie, replikacja, dzielenie na fragmenty, partycjonowanie itp. Nie wymyślaj ponownie koła. Nie ma nic nieodłącznego, co mówi, że musisz to ręcznie rozdzielić na poziomie pojedynczego klienta, a faktycznie może to znacznie zwiększyć koszty dodawania każdego nowego klienta.
Mówisz o „milionach” klientów, myślisz o jakimkolwiek wielkoskalowym oprogramowaniu chmurowym jako usłudze, Gmailu, cokolwiek, nie wydaje ci się, żeby tworzyli zupełnie nową bazę danych dla każdej nowej rejestracji, prawda?
Mogą istnieć powody, dla których chcesz to ułatwić, na przykład, jeśli sprzedajesz produkt klientowi, który MUSI mieć go hostować we własnej infrastrukturze. Ale jako ogólna zasada SAAS, domyślnie należy zastosować architekturę wielodostępną.
źródło
Jedną z wad, które widzę w przypadku sugestii pojedynczej bazy danych, jest wycofywanie danych - jeśli masz bazę danych dla każdego najemcy, możesz przywrócić dane każdego klienta niezależnie (i do określonego momentu). Jeśli wszystkie znajdują się w jednej bazie danych, staje się to znacznie trudniejsze (i znacznie bardziej podatne na błędy, ponieważ prawdopodobnie trzeba tego dokonać za pomocą instrukcji INSERT / UPDATE / DELETE).
źródło
Dziękuję wszystkim, którzy odpowiedzieli - naprawdę doceniam punkty, o których mi pomyślałeś. Mam ogólne wrażenie, że preferowana jest jedna baza danych, ale chciałbym dodać pewne punkty równoważące na korzyść architektury dzielonej i odpowiedzieć na niektóre obawy, o których wspominali inni ludzie.
Motywacja do dzielenia
Jak wspomniano w (zaktualizowanym) pytaniu, dążymy do masowej sprzedaży na całym świecie, z dosłownie milionami użytkowników. Przy najlepszym sprzęcie i indeksowaniu na świecie pojedynczy serwer DB nie wytrzyma obciążenia, więc musimy być w stanie dystrybuować go na wielu serwerach. A kiedy musisz sprawdzić, na którym serwerze są dane danego klienta, nie jest już dużo pracy, aby dać im dedykowaną bazę danych, co upraszcza, utrzymując porządek w segregacji danych.
Odpowiedź na obawy
Z przyjemnością odpowiem od ciebie w komentarzach, jeśli uważasz, że czegoś mi brakuje!
źródło