Poszukuję porady na temat integracji danych z ponad 100 baz danych klientów w scentralizowanej bazie danych raportowania

10

Jestem programistą SQL (nie DBA ani architektem) dla małej (ok. 50 pracowników) firmy SaaS. Zadanie polega na ustaleniu, jak:

  1. Odciąż raportowanie operacyjne z naszych ponad 100 baz danych OLTP
  2. Zezwalaj na uruchamianie tych raportów na danych z wielu baz danych klientów
  3. Ustaw naszą firmę na dostarczanie w przyszłości większej liczby rozwiązań analitycznych

Przeczytałem wiele artykułów na temat różnych technologii, takich jak replikacja transakcyjna (w szczególności model abonenta centralnego), broker usług SQL, wysyłka dzienników, śledzenie zmian (CT) i przechwytywanie danych zmian (CDC, rozumiem, że dotyczy to wyłącznie przedsiębiorstw) i nie jestem pewien, którą ścieżkę najlepiej wybrać.

Mam nadzieję, że niektórzy z was posiadający wiedzę na temat integracji mogli napotkać konfigurację podobną do naszej i być w stanie wskazać mi udaną ścieżkę lub skierować mnie do niektórych zasobów, które byłyby pomocne.

Ze względu na ograniczenia kosztów nasze rozwiązanie musi działać w ramach SQL Server Standard Edition. Ponadto, rozwiązanie musi być uzasadnione, aby wspierać / utrzymywać w naszej małej organizacji.

Podstawowa konfiguracja:

Obecnie mamy ponad 100 indywidualnych baz danych klientów, większość wdrożonych na serwerach SQL w naszym centrum danych, ale niektóre wdrożone na serwerach klientów w ich centrum danych, do których możemy zdalnie. Są to wszystkie bazy danych SQL Server 2008 R2, ale wkrótce planujemy uaktualnienie do SQL 2016.

Korzystamy z projektów baz danych i dacpaców, aby upewnić się, że schemat jest taki sam we wszystkich bazach danych klientów, które byłyby zintegrowane. Ponieważ jednak nie zmuszamy wszystkich klientów do aktualizacji do nowych wersji w tym samym czasie, możliwe są pewne różnice w schemacie między aktualizacjami. Rozwiązanie musi być wystarczająco elastyczne, aby nie uległo awarii, jeśli klient A jest w wersji oprogramowania 1.0, a klient B w wersji 1.1.

Raporty operacyjne są obecnie uruchamiane bezpośrednio z bazy danych OLTP każdego klienta. Niepokoi nas wpływ, jaki będzie to miało wpływ na wydajność aplikacji, jeśli jej nie odciążymy.

Wymagania wysokiego poziomu:

Naszymi klientami są szpitalne sterylne wydziały przetwarzania (SPD), które oczekują aktualnych raportów z tego, co dotąd przetwarzały, gdzie znajdują się zapasy itp. Inwentaryzacja procesów SPD przez całą dobę, w tym w weekendy i święta. Ponieważ jednym z głównych celów tych wysiłków jest lepsze wsparcie raportowania operacyjnego, chcielibyśmy, aby dane były jak najbardziej zbliżone do czasu rzeczywistego, aby nadal spełniać potrzeby klientów.

Obecnie mamy kilka SPD w oddzielnych bazach danych, które w rzeczywistości są częścią tego samego systemu szpitalnego. Ci klienci chcą mieć możliwość raportowania względem wszystkich SPD w swoim systemie.

Mówiąc strategicznie, chcielibyśmy mieć możliwość łatwego agregowania danych u wszystkich naszych klientów, aby wspierać nasze wewnętrzne inicjatywy analityczne. Oczekujemy, że będziemy w stanie wykorzystać zebrane dane operacyjne jako źródło dla centrów danych / hurtowni.

Dotychczasowe myśli:

Wydaje się, że replikacja transakcyjna zapewniłaby najbardziej „rozwiązanie w czasie rzeczywistym”. Uważam, że ta odpowiedź jest szczególnie pomocna, ale obawiam się, że z powodu potencjalnych różnic w schemacie nie zadziała ona dla nas: replikacja wiele do jednego programu SQL Server

Przesyłanie dziennika nie wydaje się idealne, biorąc pod uwagę, że dziennika nie można przywrócić, gdy zapytania są aktywne. Muszę wyrzucić wszystkich, aby dziennik mógł zostać przywrócony, w przeciwnym razie dane staną się nieaktualne. Nie jestem pewien, czy można zastosować tę metodę do scentralizowania danych z wielu baz danych, ponieważ każdy dostarczony dziennik byłby przeznaczony tylko dla indywidualnej bazy danych, z której pochodzi.

Korzystanie z brokera usług SQL opóźnienie może być nieprzewidywalne, jeśli kolejka nie będzie w stanie nadążyć za liczbą komunikatów do przetworzenia.

CT identyfikuje tylko wersję dla każdego wiersza tabeli. Opóźnienie zależałoby od tego, jak szybko moglibyśmy przetworzyć coś w rodzaju pakietu SSIS dla każdej bazy danych w celu pobrania danych i wstawienia ich do centralnego repozytorium.

Czy musimy rozważyć replikację każdej bazy danych osobno, a może zastosować jakąś technikę wirtualizacji danych, aby połączyć dane z różnych replikowanych źródeł?

Wszelkie porady i wskazówki, które zechcesz udzielić, będą bardzo mile widziane.

bperry
źródło
1
Ze względu na twoje (prawie) wymagania w czasie rzeczywistym, przyjrzałbym się tylko przetwarzaniu opartemu na zdarzeniach z niektórymi implementacjami kolejki komunikatów (dla gwarancji dostawy). Mam nadzieję, że to pomoże
Grimaldi
1
Wrzuciłbym HTAP do miksu. en.m.wikipedia.org/wiki/Hybrid_Transactional/... BIML i SSIS do zapełniania wspólnego sklepu.
Michael Green
@Grimaldi, czy poleciłbyś brokera usług SQL do implementacji przetwarzania / kolejek komunikatów opartych na zdarzeniach lub innej technologii przesyłania komunikatów?
bperry
Dziękuję za sugestię, @MichaelGreen. Zasadniczo wygląda na to, że HTAP pozwoliłby nam korzystać z naszych istniejących baz danych zarówno dla OLTP, jak i OLAP, dodając do naszych tabel indeksy magazynu klastrów nieklastrowane (NCCI). Zapytania dotyczące raportów wykorzystują NCCI, aby nie zakłócały operacji transakcyjnych. SQL 2016 zawiera obsługę protokołu HTAP w wersji Standard Edition (SE), ale wygląda na to, że pamięć podręczna magazynu kolumn jest ograniczona do 32 GB w całej instancji SQL. To może być dla nas problem, ponieważ w tej samej instancji mamy dziesiątki baz danych. microsoft.com/en-us/sql-server/sql-server-2016-editions
bperry
1
Tak, kolumna, ale także w pamięci, jeśli specyfikacja serwera pozwala ci tam wejść. Ostatnio słyszałem o tym Sunil Agarwal. Ogólna zasada MS polegała na około 3% degradacji OLTP na korzyść raportowania zerowych opóźnień. Niestety nie ma wolnych obiadów; możesz utworzyć nowe instancje do przechowywania bazy danych raportowania lub możesz utworzyć nową instancję, aby uzyskać wystarczającą ilość miejsca na obsługę HTAP. Nie opowiadam się za tym wzorem. To może nie działać dla ciebie. Chciałem tylko, abyś wiedział, że istnieje.
Michael Green

Odpowiedzi:

1

Czy musimy rozważyć replikację każdej bazy danych osobno, a może zastosować jakąś technikę wirtualizacji danych, aby połączyć dane z różnych replikowanych źródeł?

Tak. Możesz hostować wiele baz danych subskrybentów w jednym wystąpieniu, a następnie przeszukiwać je za pomocą widoków lub ładować je do skonsolidowanej bazy danych.

David Browne - Microsoft
źródło
Czy istnieje bardziej elegancki sposób skonfigurowania tych widoków poza czymś takim jak ... WYBIERZ Pole1, Pole2, Pole3 Z [Baza danych1]. [Schemat]. [Nazwa tabeli] UNION ALL SELECT Pole1, Pole2, Pole3 Z [Baza danych2]. [Schemat ]. [
TableName
1

Zgodnie z powyższym opisem poniższy link pomoże ci i ja również pracować nad tym samym scenariuszem. Wiele wydawców z jednym subskrybentem.

  1. Dodaj jeszcze jedną kolumnę, taką jak server_id z wartością domyślną, taką jak 1,2,3 itd. I uczyń ją złożonym kluczem podstawowym.

  2. Podczas tworzenia publikacji i dodawania artykułów właściwość artykułu Działanie, jeśli nazwa jest używana, musi być ustawiona na Usuń dane. Jeśli artykuł ma filtr wierszy, usuń tylko te dane, które pasują do filtra. Można to ustawić za pomocą okna dialogowego Właściwości artykułu Kreatora nowej publikacji lub za pomocą procedur przechowywanych replikacji sp_addarticle i określając wartość delete dla argumentu @pre_creation_cmd. W ten sposób, gdy centralny subskrybent zostanie zainicjowany lub ponownie zainicjowany z wielu migawek publikacji, wcześniej zastosowane dane migawki zostaną zachowane, ponieważ zostaną usunięte tylko dane pasujące do klauzuli filtru.

wprowadź opis zdjęcia tutaj

http://www.sqlrepl.com/sql-server/central-subscriber-model-explained/

Gulrez Khan
źródło
dzięki za artykuł. Czy na podstawie modelu centralnego abonenta opracowałeś sposób obsługi aktualizacji schematu wydawcy (na przykład w przypadku aktualizacji wersji)? Czy wymusisz jednoczesną aktualizację wszystkich baz danych wydawców? W moim środowisku nie zawsze mamy tę opcję i to było moje podstawowe wahanie w realizacji centralnego modelu replikacji subskrybenta. Jeśli istnieje sposób na obejście tej bariery, chciałbym wiedzieć!
bperry
Nie używam „Aktualizuj wydawcę”. Podzieliłem bazę danych na dwie części, takie jak (dwa typy replikacji), niektóre tabele w szczegółowym wydawcy (wydawca na scentralizowanego subskrybenta), a niektóre to główny wydawca (scentralizowany subskrybent dla wszystkich wydawców) .... Mój scentralizowany subskrybent jest również częścią grupy AlwaysOn, dlatego moja replika pomocnicza działa jako serwer raportów.
Gulrez Khan,
Pozwól mi upewnić się, że rozumiem twoje rozwiązanie. Powiedzmy, że Wydawca A jest w wersji 1, a Wydawca B jest w wersji 2. 1) Wyłączyłeś replikację zmian schematu u obu wydawców (używając setup_ddl = 0 podczas instalacji). 2) Wersja 2 zawiera nową kolumnę, więc należy ją ręcznie dodać u centralnego abonenta. 3) W Wydawcy B (zaktualizowanym) należy ręcznie dodać nową kolumnę do replikacji (używając sp_articlecolumn). Wydawca A. nie wprowadza żadnych zmian. Czy pozwoliłoby to obu wydawcom na kontynuowanie replikacji do centralnego subskrybenta bez przerywania replikacji?
bperry
patrz poniższy link .. dba.stackexchange.com/questions/142449/…
Gulrez Khan
zobacz także to .. dba.stackexchange.com/questions/146070/…
Gulrez Khan
1

Jedna możliwa architektura:

Rozważ raportowanie jako rozwiązanie oparte na hurtowni danych.

Zazwyczaj hurtownia danych to baza danych ze schematem reprezentującym wymagany podzbiór systemów źródłowych. AdventureWorks i AdventureworksDW demonstrują to modelowanie.

Następnie ETL: Przenoszenie danych ze źródeł do hurtowni danych.

Możliwą implementacją tutaj jest użycie śledzenia zmian.

Po pierwsze, można wdrożyć widoki, które są specyficzne dla wersji pod względem zużycia, ale pod względem tego, co zwracają, są jednolite. np. jeśli Person.Gender istnieje w wersji 2, ale nie w wersji 1, widok osoby dla wersji 1 może zwrócić, powiedzmy, null dla wersji 1.

Dla konsumenta magazynu, który tylko czyta widoki, dane mają ten sam kształt (z różną kompletnością).

Śledzenie zmian zapewnia (stosunkowo) lekki sposób określania, które dane wymagają zmiany przy każdym odświeżeniu.

Realizacja powyższego polega na ręcznym stosowaniu tego wszystkiego, więc musisz być pewny w kodowaniu SQL i testować scenariusze wydajności, aby zobaczyć, jak szybkie są przyrosty. W wielu przypadkach mogą być krótsze niż 1 sekunda, ale niektóre wysokie tabele transakcji mogą generować duże obciążenie podczas przetwarzania zmian. (Śledzenie zmian jest „stosunkowo” lekkie… tylko testy to potwierdzają).

Dobrą rzeczą jest to, że masz wysoki stopień kontroli nad tym, jak manifestują się różnice w schemacie, a dzięki śledzeniu zmian nie ma szans na problemy z integralnością przy prawidłowym wdrożeniu, ponieważ śledzenie odbywa się na poziomie silnika.

Trudno powiedzieć, czy jest to dla Ciebie odpowiednie.

Paul Holmes
źródło