2010-02-06 11 views
93

Nasze oprogramowanie działa obecnie na MySQL. Dane wszystkich najemców są przechowywane w tym samym schemacie. Ponieważ używamy Ruby on Rails, możemy łatwo określić, które dane należą do danego najemcy. Jednak są oczywiście firmy, które obawiają się, że ich dane mogą zostać naruszone, więc oceniamy inne rozwiązania.Jak utworzyć bazę danych dla wielu dzierżawców ze współdzielonymi strukturami tabel?

tej pory widziałem trzy opcje:

  • Wielu Database (każdy lokator dostaje własny - prawie taka sama jak 1 Serwer za klienta)
  • Wielu Schema (niedostępne w MySQL, każde lokator dostaje swój własny schemat we wspólnej bazie danych)
  • Shared Schema (nasze obecne podejście, być może z dodatkowym rekordzie identyfikującym na każdej kolumnie)

Wielu Schema jest moim ulubionym (biorąc pod uwagę, co sts). Jednak tworzenie nowego konta i wykonywanie migracji wydaje się być dość bolesne, ponieważ musiałbym iterować nad wszystkimi schematami i zmieniać ich tabele/kolumny/definicje.

P: Wygląda na to, że Multi-Schema ma nieco inne tabele dla każdego lokatora - nie chcę tego. Czy istnieje system RDBMS, który pozwala mi korzystać z rozwiązania z wieloma dzierżawcami opartego na wielu schematach, w którym struktura tabel jest wspólna dla wszystkich lokatorów?

P.S. Przez multi mam na myśli coś jak ultra-multi (10.000+ najemców).

+1

"Wydaje się, że Multi-Schema ma nieco inne tabele dla każdego lokatora". Co jest nie tak w przypadku wielu schematów i wszystkich tych samych tabel? Czy chcesz powiedzieć, że nie chcesz odtwarzać identycznych struktur tabel we wszystkich schematach? A może mówisz, że nie możesz tworzyć identycznych struktur we wszystkich schematach? –

+0

+1 za dobre/interesujące pytanie – AdaTheDev

+2

@ S.Lott Spodziewam się 10.000 najemców z ponad 100 zapisami dziennie. Mając miliony wpisów w jednej definicji tabeli (definition = shared, data = isolated) czuję się lepiej niż tysiące wpisów w tysiącach definicji tabel. Ponieważ niewielu ludzi robi to w ten sposób, nie jestem tak pewny w przypadku wielu schematów. –

Odpowiedz

67

Jednakże istnieją pewne spółki oczywiście, którzy obawiają się, że ich dane mogą być zagrożona, więc oceniamy innych rozwiązań.

Jest to niefortunne, ponieważ klienci czasami cierpią z powodu błędnego przekonania, że ​​tylko fizyczna izolacja może zapewnić wystarczającą ochronę.

Istnieje interesujący artykuł MSDN, zatytułowany Multi-Tenant Data Architecture, który możesz sprawdzić. W ten sposób autorzy skierowana błędne kierunku wspólnego podejścia:

Powszechnym błędem utrzymuje, że tylko fizyczna izolacja może stanowić odpowiedniego poziomu bezpieczeństwa. W danych dane przechowywane przy użyciu współużytkowanego podejścia mogą również zapewnić silne bezpieczeństwo danych, ale wymagają użycia bardziej zaawansowanych wzorców projektowych.

Ponieważ ze względów technicznych i biznesowych, artykuł sprawia krótką analizę na którym pewna podejście może być bardziej odpowiednie niż inne:

ilości, charakteru i potrzeb w najemców można oczekiwać do obsługi wszystkich wpływów Twoja decyzja o architekturze danych na różne sposoby w . Niektóre z następujących pytań mogą wywoływać niepożądane pytania w kierunku bardziej izolowanego podejścia, podczas gdy inne mogą skłonić Cię do bardziej wspólnego podejścia .

  • Ilu potencjalnych najemców oczekujesz? Być może nigdzie indziej nie jesteś w stanie oszacować przyszłego wykorzystania z upoważnieniem, ale myślisz w kategoriach wielkości rzędu: czy budujesz aplikację dla setek najemców? Tysiące? Dziesiątki z tysięcy? Jeszcze? Im większy jesteś, , oczekuj, że Twoja baza najemców będzie większa, bardziej prawdopodobne, że będziesz chciał rozważyć bardziej wspólne podejście.

  • Ile przestrzeni dyskowej oczekujesz od danych przeciętnego lokatora? Jeśli spodziewasz się, że niektórzy lub wszyscy lokatorzy będą przechowywać bardzo duże ilości danych, to osobne podejście do bazy danych jest prawdopodobnie najlepsze dla . (Rzeczywiście, wymagania dotyczące przechowywania danych może zmusić cię do przyjęcia modelu oddzielny bazy danych i tak. Jeśli tak, to będzie dużo łatwiejsze do projektowania aplikacji że droga od zaczynają niż przenieść się do podejścia oddzielny bazy później.)

  • Ilu użytkowników końcowych oczekujesz od przeciętnego najemcy? Im większa liczba, tym bardziej odpowiednie bardziej izolowane podejście będzie spełniać wymagania użytkowników końcowych.

  • Czy spodziewasz się oferować usługi dodatkowe dla najemców, takie jak jako narzędzie do backupu i przywracania dla dzierżawy ? Takie usługi są łatwiejsze do spełnienia dzięki bardziej odizolowanemu podejściu .


UPDATE: Dalsze zaktualizować o spodziewanej liczby lokatorów.

Oczekiwana liczba najemców (10 000) powinna wykluczyć podejście oparte na wielu bazach danych, dla większości, jeśli nie wszystkich scenariuszy. Nie sądzę, żebyś wpadł na pomysł utrzymania 10 000 instancji bazy danych i konieczności tworzenia setek nowych każdego dnia.

Tylko z tego parametru wygląda na to, że najbardziej odpowiednia jest metoda współdzielonej bazy danych. Fakt, że będziesz przechowywać około 50 MB na dzierżawcę i że nie będzie dodatków dla najemców, czyni to podejście jeszcze bardziej odpowiednim.

W artykule MSDN ww wymienia trzy wzory zabezpieczeń przeciwdziałania względy bezpieczeństwa na podejście shared-bazy danych:

Gdy jesteś przekonany, ze W przypadku środków bezpieczeństwa dotyczących danych dotyczących Twojej aplikacji będziesz w stanie zaoferować swoim klientom Service Level Agrement, który zapewnia silne gwarancje bezpieczeństwa danych.W umowie SLA oprócz gwarancji można również opisać środki, które należy podjąć, aby zapewnić, że dane nie zostaną naruszone.

UPDATE 2: Podobno faceci Microsoft przeniósł/wykonany nowy artykuł dotyczący tego tematu, oryginalny link zniknął i to jest nowe: Multi-tenant SaaS database tenancy patterns (uznanie dla Shai Kerer)

+1

Och, wczoraj zeskanowałem ten artykuł i pominąłem tę nieporozumienie-część. Musisz przeczytać to jeszcze raz. –

+1

@Marcel: Jednak poza tym, co postrzega bezpieczeństwo przez klientów, uważam, że twoja decyzja, które podejście uwzględniać na wielu najemców, powinna opierać się na czynnikach takich jak te 4 punkty, które cytowałem z artykułu MSDN: 1. Oczekiwana liczba lokatorzy. - 2. Oczekiwany wymóg przechowywania dla każdego lokatora. - 3. Oczekiwana liczba współbieżnych użytkowników końcowych. - 4. Oczekiwane dodatki dla najemców. –

+1

Dzięki za wskazanie tej sekcji. Number = 10k, Storage = 50mb, Concurrent End-Users = 2 na dzierżawcę, Addons = 0. Dlatego obecna sytuacja mająca wspólne podejście wydaje się najbardziej rozsądna. Myślę, że w przyszłym tygodniu zrobię kilka telefonów, aby dowiedzieć się, czego klienci naprawdę potrzebują/oczekują. Niemcy i bezpieczeństwo danych/IT to naprawdę trudna historia. –

15

mojego doświadczenia (choć SQL Server) jest to, że wiele do zrobienia jest sposobem, w którym każdy klient ma swoją 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ć trochę wartości.

Powody obejmują:

  1. odzyskiwanie danych security/awarii. Dane każdego przedsiębiorstwa są przechowywane w całości oddzielnie od innych, co zmniejsza ryzyko naruszenia danych (myśląc o tym, że wprowadzając błąd kodu, który oznacza, że ​​coś błędnie wygląda na innych danych klienta, gdy nie powinien), minimalizuje potencjalną stratę jednego klienta, jeśli konkretna baza danych zostaje uszkodzona itd. Dostrzegane korzyści bezpieczeństwa dla klienta są jeszcze większe (dodatkowy bonusowy efekt uboczny!).
  2. skalowalność. Zasadniczo dzielisz dane na partycje, aby umożliwić większą skalowalność - np. bazy danych można umieszczać na różnych dyskach, można wprowadzić wiele serwerów baz danych w trybie online i łatwiej przenosić bazy danych w celu rozłożenia obciążenia.
  3. dostrajanie wydajności. Załóżmy, że masz jednego bardzo dużego klienta i jednego bardzo małego. Wzorce użytkowania, objętości danych itp. Mogą się znacznie różnić. Możesz dostroić/zoptymalizować łatwiej dla każdego klienta, jeśli potrzebujesz.

Mam nadzieję, że oferuje to przydatne informacje! Jest więcej powodów, ale mój umysł się zmienił. Jeśli to kopie z powrotem, będę aktualizować :)

EDIT:
Od kiedy pisał tę odpowiedź, to jest teraz jasne, że mówimy 10000 lokatorów. Moje doświadczenie jest w setkach dużych baz danych - nie sądzę, że 10 000 oddzielnych baz danych będzie zbyt łatwe w zarządzaniu dla twojego scenariusza, więc nie jestem teraz zwolennikiem podejścia wielodrożnego dla twojego scenariusza. Szczególnie, że teraz jest jasne, że mówisz o małych ilościach danych dla każdego lokatora!

Trzymając moją odpowiedź tutaj jak w każdym razie, jak to może mieć jakieś zastosowanie dla innych osób w podobnej łódce (z mniejszą liczbą lokatorów)

+0

Tak, przepraszam, że nie wyjaśniłem tego wcześniej. Nadal +1. ;) –

+0

mówi o bezpieczeństwie danych, czy powiesz, że każda baza danych powinna być umieszczona na oddzielnych serwerach/VM?czy posiadanie wszystkich baz danych na pojedynczym/klastrowym serwerze z różnymi użytkownikami sql jest wystarczająco bezpieczne? – Shay

+0

@Shay - Nie, nie trzeba umieszczać ich na oddzielnych serwerach - wyobraź sobie, że masz 100, to dużo instancji serwera/licencji, które potrzebujesz na początek. Zobacz odpowiedź Daniela dalej, tam są dobre linki. – AdaTheDev

14

Poniżej znajduje się link do białego papieru na Salesforce.com o tym, jak wdrożyć wielo -tenancy:

http://www.developerforce.com/media/ForcedotcomBookLibrary/Force.com_Multitenancy_WP_101508.pdf

mają ogromny stół w 1/500 kolumny string (Value0, Value1 ... Value500). Daty i liczby są przechowywane jako ciągi w formacie takim, że można je konwertować do ich rodzimych typów 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. Dostępne są dodatkowe tabele do indeksowania, relacji, unikalnych wartości itp.

Dlaczego ten problem?

Każdy najemca 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.

7

Jak już wspomniano, jedna baza danych na dzierżawcę jest opcją i ma z nią większe kompromisy.Może działać dobrze na mniejszą skalę, na przykład jedną cyfrę lub 10-ciu najemców, ale trudniej jest nim zarządzać. Oba tylko migracje, ale także tylko utrzymanie i uruchomienie baz danych.

Każdy model schematu jest przydatny nie tylko w przypadku unikalnych schematów dla każdego, ale wciąż trwające migracje na wszystkich najemcach stają się trudne, a przy tysiącach schematów Postgres może zacząć mieć kłopoty.

Bardziej skalowalne podejście polega na tym, że lokatorzy są losowo rozdzielani, przechowywani w tej samej bazie danych, ale w różnych odłamkach logicznych (lub tables). W zależności od języka istnieje wiele bibliotek, które mogą w tym pomóc. Jeśli używasz Railsów, istnieje biblioteka, która jest w stanie zastąpić dzierżawę acts_as_tenant, pomaga to zapewnić, że zapytania dzierżawcy tylko odciągną te dane. Jest też klejnot apartment - chociaż używa modelu schematu, który pomaga w migracji we wszystkich schematach. Jeśli używasz Django, istnieje pewna liczba, ale jedna z bardziej popularnych wydaje się być dostępna pod numerem schemas. Wszystkie te pomagają bardziej na poziomie aplikacji. Jeśli szukasz czegoś więcej na poziomie bazy danych bezpośrednio, Citus skupia się na tym, aby tego typu sharding dla multi-tenancy był jeszcze bardziej gotowy do pracy z Postgresem.

Powiązane problemy