Jestem programistą SQL (nie DBA ani architektem) dla małej (ok. 50 pracowników) firmy SaaS. Zadanie polega na ustaleniu, jak:
- Odciąż raportowanie operacyjne z naszych ponad 100 baz danych OLTP
- Zezwalaj na uruchamianie tych raportów na danych z wielu baz danych klientów
- 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.
Odpowiedzi:
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.
źródło
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.
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.
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.
http://www.sqlrepl.com/sql-server/central-subscriber-model-explained/
źródło
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.
źródło