Nasze oprogramowanie obecnie działa na MySQL. Dane wszystkich dzierżawców są przechowywane w tym samym schemacie. Ponieważ używamy Ruby on Rails, możemy łatwo określić, które dane należą do którego dzierżawcy. Jednak są oczywiście firmy, które obawiają się, że ich dane mogą zostać naruszone, dlatego oceniamy inne rozwiązania.
Do tej pory widziałem trzy opcje:
- Wiele baz danych (każdy dzierżawca otrzymuje własną - prawie tyle samo, co 1 serwer na klienta)
- Multi-Schema (niedostępne w MySQL, każdy dzierżawca otrzymuje własny schemat w udostępnionej bazie danych)
- Schemat współdzielony (nasze obecne podejście, być może z dodatkowym rekordem identyfikującym w każdej kolumnie)
Multi-Schema jest moim ulubionym (biorąc pod uwagę koszty). Jednak tworzenie nowego konta i wykonywanie migracji wydaje się być dość bolesne, ponieważ musiałbym iterować po wszystkich schematach i zmieniać ich tabele / kolumny / definicje.
P: Wydaje się, że wiele schematów ma nieco inne tabele dla każdego dzierżawcy - nie chcę tego. Czy istnieje system RDBMS, który pozwala mi korzystać z rozwiązania dla wielu dzierżawców z wieloma schematami, w którym struktura tabeli jest wspólna dla wszystkich dzierżawców?
PS Przez multi mam na myśli coś w rodzaju ultra-multi (ponad 10.000 najemców).
źródło
Odpowiedzi:
Jest to niefortunne, ponieważ klienci czasami cierpią z powodu błędnego przekonania, że tylko fizyczna izolacja może zapewnić wystarczające bezpieczeństwo.
Jest interesujący artykuł MSDN zatytułowany Architektura danych wielu dzierżawców , który warto sprawdzić. Oto jak autorzy odnieśli się do błędnego przekonania o wspólnym podejściu:
Jeśli chodzi o względy techniczne i biznesowe, w artykule dokonano krótkiej analizy tego, gdzie określone podejście może być bardziej odpowiednie niż inne:
AKTUALIZACJA: Dalsze aktualizacje dotyczące spodziewanej liczby najemców.
Ta oczekiwana liczba dzierżawców (10 tys.) Powinna wykluczać podejście oparte na wielu bazach danych w większości, jeśli nie we wszystkich scenariuszach. Myślę, że nie spodoba ci się pomysł utrzymania 10 000 instancji bazy danych i konieczności tworzenia setek nowych każdego dnia.
Na podstawie samego tego parametru wygląda na to, że podejście oparte na współużytkowanej bazie danych, podejście oparte na jednym schemacie jest najbardziej odpowiednie. Fakt, że będziesz przechowywać tylko około 50 MB na dzierżawcę i że nie będzie żadnych dodatków na dzierżawcę, sprawia, że to podejście jest jeszcze bardziej odpowiednie.
W cytowanym powyżej artykule MSDN wspomniano o trzech wzorcach zabezpieczeń, które dotyczą kwestii bezpieczeństwa w podejściu opartym na współużytkowaniu bazy danych:
Gdy masz pewność co do środków bezpieczeństwa danych swojej aplikacji, możesz zaoferować swoim klientom umowę o poziomie usług, która zapewnia solidne gwarancje bezpieczeństwa danych. W swojej umowie SLA, oprócz gwarancji, możesz również opisać środki, które podejmiesz, aby zapewnić, że dane nie zostaną naruszone.
AKTUALIZACJA 2: Najwyraźniej chłopaki z Microsoftu przenieśli / napisali nowy artykuł dotyczący tego tematu, oryginalny link zniknął, a to jest nowe: Wzorce dzierżawy bazy danych SaaS dla wielu dzierżawców (pochwała dla Shai Kerer)
źródło
Z mojego doświadczenia (aczkolwiek SQL Server) wynika, że droga do obsługi wielu baz danych jest taka, w której każdy klient ma własną bazę danych. Więc chociaż nie mam doświadczenia z MySQL lub Ruby On Rails, mam nadzieję, że moje dane wejściowe mogą dodać jakąś wartość.
Powody, dla których to między innymi:
Mam nadzieję, że dostarczy to przydatnych informacji! Jest więcej powodów, ale mój umysł stał się pusty. Jeśli się uruchomi, zaktualizuję :)
EDYCJA:
Odkąd opublikowałem tę odpowiedź, teraz jest jasne, że mówimy o ponad 10000 najemców. Moje doświadczenie obejmuje setki dużych baz danych - nie sądzę, aby 10000 oddzielnych baz danych było zbyt łatwych w zarządzaniu dla Twojego scenariusza, więc teraz nie preferuję podejścia opartego na wielu bazach danych w Twoim scenariuszu. Zwłaszcza, że teraz jest już jasne, że mówisz o małych ilościach danych dla każdego dzierżawcy!
Zachowując moją odpowiedź w każdym razie, ponieważ może to być przydatne dla innych osób na podobnej łodzi (z mniejszą liczbą najemców)
źródło
Poniżej znajduje się link do białej księgi na Salesforce.com o tym, jak wdrażają wielodostępność:
http://www.developerforce.com/media/ForcedotcomBookLibrary/Force.com_Multitenancy_WP_101508.pdf
Mają 1 ogromną tabelę z 500 kolumnami łańcuchowymi (Wartość0, Wartość1, ... Wartość500). Daty i liczby są przechowywane jako ciągi znaków w takim formacie, aby można je było konwertować na ich typy natywne na poziomie bazy danych. Istnieją tabele metadanych, które definiują kształt modelu danych, który może być unikalny dla każdego dzierżawcy. Istnieją dodatkowe tabele do indeksowania, relacji, unikalnych wartości itp.
Dlaczego kłopoty?
Każdy dzierżawca może dostosować własny schemat danych w czasie wykonywania bez konieczności wprowadzania zmian na poziomie bazy danych (zmiana tabeli itp.). Jest to zdecydowanie trudny sposób na zrobienie czegoś takiego, ale jest bardzo elastyczny.
źródło
Jak wspomniałeś, jedna baza danych na dzierżawcę jest opcją, która wiąże się z większymi kompromisami. Może działać dobrze na mniejszą skalę, na przykład z pojedynczą cyfrą lub niską dziesiątką najemców, ale poza tym trudniej jest nim zarządzać. Zarówno same migracje, jak i tylko utrzymanie i działanie baz danych.
Model według schematu nie jest przydatny tylko w przypadku unikalnych schematów dla każdego z nich, chociaż nadal przeprowadzanie migracji we wszystkich dzierżawach staje się trudne, a przy tysiącach schematów Postgres może zacząć mieć problemy.
Bardziej skalowalne podejście polega na tym, że dzierżawcy są rozmieszczeni losowo, przechowywani w tej samej bazie danych, ale w różnych logicznych fragmentach (lub tabelach ). W zależności od Twojego języka istnieje wiele bibliotek, które mogą w tym pomóc. Jeśli korzystasz z Railsów, istnieje biblioteka, która obejmuje dzierżawę
acts_as_tenant
, pomaga to upewnić się, że zapytania dzierżawcy pobierają tylko te dane. Jest też perełkaapartment
- chociaż używa modelu schematu, pomaga w migracjach we wszystkich schematach. Jeśli używasz Django, jest ich kilka, ale jeden z bardziej popularnych wydaje się być w różnych schematach . Wszystko to pomaga bardziej na poziomie aplikacji. Jeśli szukasz czegoś więcej bezpośrednio na poziomie bazy danych, Citus skupia się na tworzeniu tego typu shardinguWielu najemców działa lepiej po wyjęciu z pudełka dzięki Postgres.źródło