Połączenie i częściowa synchronizacja dwóch baz PostgreSQL plus załadowanie danych do bazy in-memory w pamięci RAM

0

Witam, pytanie odnośnie PostgreSQL lub innego systemu i połączenia dwóch baz siedzących na tym samym serwerze oraz trzymania danych w pamięci RAM.

Mam bazę danych PostgreSQL do której zapisywane są dane z innego systemu (kilkadziesiąt insertów na sekunde). Zależy mi aby te dane w formie zmodyfikowanej (nie wszystko ale to co potrzebuje) były automatycznie kopiowane do drugiej bazy. Założenie jest takie, że pierwsza baza trzyma tylko małą cząstkę danych do wykonywania operacji przez inny system, a druga baza trzyma dane z długiego okresu i na niej wykonywane są różnego rodzaju zapytania. Bazy są dwie niezależne i to jest warunek konieczny.

Pierwszy problem to synchronizacja, trigery fajnie działają ale w obrębie jednej bazy. W przypadku dwóch baz PostgreSQL trigery już chyba nie nadają się, chyba żeby połączyć bazy używająć DBLink-a i wówczas triger wywoływany po insercie w DB1 mógłby robić inserta do DB2? Dobrze myślę? Nie używałem dblinka więc jeśli ktoś ma doświadczenie to proszę o poradę.

Zawsze mogę utworzyć dodatkową tabelę loga w DB1 i utworzyć trigera który będzie po insercie dodawał info do loga i zewnętrzny proces który będzie iterował po logu i przenosił dane do drugiej bazy i usuwał info z loga ale to jest takie na około i nie ładne, i za dużo CPU, i w ogóle blee.

Druga sprawa to zapytania do drugiej bazy które za względu na ilość danych mogą wykonywać się wolno. Zdecydowanie będę używał partycjonawania tabel by rozłożyć dane na wiele podrzednych tabel by przyspieszyć niektóre operacje jak kasowanie (drop table zamiast delete) ale i tu pojawia się pomysł załadowania wszystkiego do pamięci gdy system startuje i uaktualniania danych w pamięci by miały stan tego co jest w fizycznej drugiej bazie. Wiem że SQLite ma opcje in-memory jednak czy można łatwo podłączyć się do PostgreSQL by załadować taką bazę i uaktualniać? Czy lepiej dla drugiej bazy używać innego systemu zamiast PostgreSQL? PostgreSQL jest darmowy i to jest bardzo duża przewaga więc w pierwszej kolejności szukam rozwiązania podobnego a w drugim kroku wersji płatnej.

Co proponujecie, czy ktoś z Was miał podobny schemat i podzieli się rozwiązaniem?

Pozdrawiam

0

Co do dblinków to dokładnie tak to działa ale musisz mieć świadomość, że jeśli zrobisz to w ten sposób (triggerem) to może się okazać, że cała operacja na DB1 będzie "wisiała" póki trigger nie skończy działania na DB2.
Gdybyś się już zdecydował na dblink to dobrym rozwiązaniem byłoby zrobić swojego rodzaju notyfikację niezależne od bazy aby replikacja nie zakłócała procesu inserta do DB1. U mnie działa to tak (bo sytuację mam dość podobną): DB1->odpalenie funkcji z Insert->uruchomienie skryptu w plpython w skrypcie natomiast jest nic innego jak wysłanie notyfikacji (może to być np prosty xml, lub tekst co tam potrzebujesz) na port UDP. Na drugim serwerze z drugą bazą jest napisany skrypt w pythonie, który nasłuchuje na tym porcie i po otrzymaniu notyfikacji odpala odpowiednią funkcjonalność na DB2 gdzie w otrzymanej paczce mam np tablicę nowych identyfikatorów w DB1, przekazując je do funkcji na DB2 wiem o co zapytać po dblinku.
Załadowanie wszystkiego do pamięci nie jest rozwiązaniem. Z tego co piszesz to zahaczasz w tym momencie o hurtownie danych gdzie w DB1 masz dane produkcyjne w DB2 masz dane hurtowni danych. Możesz pokombinować z widokami zmaterializowanymi (np per miesiąc/rok) ale bez konkretnej specyfikacji DDL i potrzeb oraz ewentualnych problemów ciężko coś więcej napisać.

0

Potrzebujesz tych danych w drugiej bazie natychmiast?

1 użytkowników online, w tym zalogowanych: 0, gości: 1