Jak utworzyć wielodostępną bazę danych ze współużytkowanymi strukturami tabel?

130

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

Marcel Jackwerth
źródło
1
„Wygląda na to, że wiele schematów ma nieco inne tabele dla każdego dzierżawcy”. Co jest nie tak z wieloma schematami i tymi samymi tabelami? Czy chcesz powiedzieć, że nie chcesz odtwarzać identycznych struktur tabel we wszystkich schematach? A może mówisz, że nie możesz stworzyć identycznych struktur we wszystkich schematach?
S.Lott
+1 za dobre / interesujące pytanie
AdaTheDev
2
@ S.Lott Spodziewam się ponad 10.000 najemców z ponad 100 rejestracjami dziennie. Posiadanie milionów wpisów w jednej definicji tabeli (definicja = udostępnione, dane = izolowane) sprawia, że ​​czuję się lepiej niż tysiące wpisów w tysiącach definicji tabel. Ponieważ niewielu ludzi robi to w ten sposób, nie jestem pewien co do wielu schematów.
Marcel Jackwerth
1
Zgadzam się z Danielem, multi-bazy danych są wykluczone na podstawie tych liczb. Zaktualizowałem swoją odpowiedź, aby to odzwierciedlić, ale zachowuję ją bardziej dla historii. Wspólne podejście zdecydowanie wydaje się najbardziej rozsądnym podejściem.
AdaTheDev
2
od dynjo w odpowiedzi: „ Świetny artykuł od Ryana Bigga na dokładny temat”
Félix Gagnon-Grenier

Odpowiedzi:

97

Jednak są oczywiście firmy, które obawiają się, że ich dane mogą zostać naruszone, dlatego oceniamy inne rozwiązania.

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:

Powszechne nieporozumienie głosi, że tylko fizyczna izolacja może zapewnić odpowiedni poziom bezpieczeństwa. W rzeczywistości dane przechowywane przy użyciu wspólnego podejścia mogą również zapewniać duże bezpieczeństwo danych, ale wymagają zastosowania bardziej wyrafinowanych wzorców projektowych.

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:

Liczba, charakter i potrzeby dzierżawców, których spodziewasz się obsłużyć, wpływają na decyzje dotyczące architektury danych w różny sposób. Niektóre z poniższych pytań mogą skłaniać cię do bardziej izolowanego podejścia, podczas gdy inne mogą skłaniać cię do bardziej wspólnego podejścia.

  • Ilu potencjalnych najemców planujesz skierować? Być może nie jesteś w stanie oszacować potencjalnego wykorzystania z urzędem, ale pomyśl w kategoriach rzędów wielkości: czy tworzysz aplikację dla setek lokatorów? Tysiące? Dziesiątki tysięcy? Jeszcze? Im większa będzie Twoja baza najemców, tym większe prawdopodobieństwo, że będziesz chciał rozważyć bardziej wspólne podejście.

  • Ile miejsca na dane będą zajmować przeciętny najemca? Jeśli spodziewasz się, że niektórzy lub wszyscy dzierżawcy będą przechowywać bardzo duże ilości danych, prawdopodobnie najlepsze będzie podejście z oddzielną bazą danych. (Rzeczywiście, wymagania dotyczące przechowywania danych mogą i tak zmusić Cię do przyjęcia modelu oddzielnej bazy danych. Jeśli tak, znacznie łatwiej będzie zaprojektować aplikację w ten sposób od samego początku, niż później przejść do podejścia z oddzielną bazą danych).

  • Ilu jednoczesnych użytkowników końcowych spodziewa się obsługiwać przeciętny dzierżawca? Im większa liczba, tym bardziej odpowiednie będzie bardziej izolowane podejście do spełnienia wymagań użytkownika końcowego.

  • Czy spodziewasz się oferować usługi o wartości dodanej dla poszczególnych dzierżawców, takie jak tworzenie kopii zapasowych i przywracanie danych na dzierżawę? Takie usługi są łatwiejsze do zaoferowania dzięki bardziej odizolowanemu podejściu.


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)

Daniel Vassallo
źródło
1
Och, wczoraj zeskanowałem ten artykuł i pominąłem część dotyczącą błędnego przekonania. Muszę to przeczytać ponownie.
Marcel Jackwerth
1
@Marcel: Jednak oprócz tego, jakie jest postrzeganie bezpieczeństwa przez klientów, uważam, że twoja decyzja o tym, które podejście do wielu najemców przyjąć, powinna być oparta na takich czynnikach, jak te 4 punkty, które zacytowałem z artykułu MSDN: 1. Spodziewana liczba najemców . - 2. Oczekiwane zapotrzebowanie na miejsce na przechowywanie dla każdego najemcy. - 3. Oczekiwana liczba jednoczesnych użytkowników końcowych. - 4. Oczekiwane dodatki na najemcę.
Daniel Vassallo
1
Dzięki za wskazanie tej sekcji. Liczba = 10k, pamięć masowa = 50mb, równoczesnych użytkowników końcowych = 2 na dzierżawę, dodatki = 0. Tak więc obecna sytuacja, w której istnieje wspólne podejście, wydaje się najbardziej rozsądna. Myślę, że w przyszłym tygodniu wykonam kilka telefonów, aby dowiedzieć się, czego naprawdę potrzebują / oczekują klienci. Niemcy i bezpieczeństwo danych / IT to naprawdę trudna historia.
Marcel Jackwerth
1
Tylko dla użytkowników, którzy to czytają od tej pory, wspomniany artykuł już nie istnieje, może ktoś zrobił kopię?
gmslzr
1
@guillesalazar Nie jestem pewien, czy to to samo, ale myślę, że tak jest - docs.microsoft.com/en-us/azure/sql-database/ ... (@DanielVassallo, jeśli to to samo, może rozważ aktualizację odpowiedź :-))
Shai Kerer
20

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:

  1. bezpieczeństwo danych / odtwarzanie po awarii. Dane każdej firmy są przechowywane całkowicie oddzielnie od innych, co zmniejsza ryzyko naruszenia bezpieczeństwa danych (myśląc o tym, że wprowadzasz błąd w kodzie, co oznacza, że ​​coś błędnie sprawdza inne dane klienta, a nie powinno), minimalizuje potencjalną stratę jednego klienta konkretna baza danych ulega uszkodzeniu itp. Korzyści dla klienta w zakresie bezpieczeństwa są jeszcze większe (dodatkowy efekt uboczny!)
  2. skalowalność. Zasadniczo należałoby podzielić dane na partycje, aby umożliwić większą skalowalność - np. Bazy danych można umieścić na różnych dyskach, można podłączyć wiele serwerów baz danych do trybu online i przenosić bazy danych w celu łatwiejszego rozłożenia obciążenia.
  3. podnoszenie wydajności. Załóżmy, że masz jednego bardzo dużego klienta i jednego bardzo małego. Wzorce użytkowania, wolumeny danych itp. Mogą się znacznie różnić. W razie potrzeby możesz łatwiej dostroić / zoptymalizować dla każdego klienta.

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)

AdaTheDev
źródło
Tak, przepraszam, że nie wyjaśniłem tego wcześniej. Wciąż +1. ;)
Marcel Jackwerth
Mówiąc o bezpieczeństwie danych, czy powiesz, że każda baza danych powinna być umieszczona na oddzielnych serwerach / maszynach wirtualnych? czy posiadanie wszystkich baz danych na jednym / klastrowym serwerze z różnymi użytkownikami sql jest wystarczająco bezpieczne?
Shay,
@Shay - Nie, nie powinno być potrzeby umieszczania ich na osobnych serwerach - wyobraź sobie, że masz 100, czyli wiele instancji / licencji serwerowych, których potrzebujesz na początek. Zobacz odpowiedź Daniela dalej, jest tam kilka dobrych linków.
AdaTheDev
Twierdzę, że nawet jeśli multi-DB oznacza 10000 oddzielnych baz danych, a z kolei znacznie zwiększa koszty utrzymania, nadal możesz oswoić tę bestię za pomocą skryptów automatyzacji na infrastrukturze chmury, tak że wszystko jest zarządzane programowo, wymagając niewielkiego lub żadnego wysiłku ludzkiego.
Korayem
18

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.

dana
źródło
10

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łka apartment- 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.

CraigKerstiens
źródło