Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak dołączyć do MySQL i Postgres w zmaterializowanym widoku na żywo

Kiedy pracujesz nad projektem, który składa się z wielu mikrousług, prawdopodobnie będzie również zawierał wiele baz danych.

Na przykład możesz mieć bazę danych MySQL i bazę danych PostgreSQL, które działają na osobnych serwerach.

Zwykle, aby połączyć dane z dwóch baz danych, należałoby wprowadzić nową mikrousługę, która łączyłaby dane razem. Ale to zwiększyłoby złożoność systemu.

W tym samouczku użyjemy Materialize, aby połączyć MySQL i Postgres w zmaterializowanym widoku na żywo. Dzięki temu będziemy mogli wysyłać zapytania bezpośrednio i uzyskiwać wyniki z obu baz danych w czasie rzeczywistym przy użyciu standardowego SQL.

Materialise to dostępna w źródle strumieniowa baza danych napisana w języku Rust, która przechowuje w pamięci wyniki zapytania SQL (widok zmaterializowany) w miarę zmian danych.

Samouczek zawiera projekt demonstracyjny, który możesz rozpocząć za pomocą docker-compose .

Projekt demonstracyjny, z którego będziemy korzystać, będzie monitorował zamówienia na naszej próbnej stronie internetowej. Wygeneruje zdarzenia, które później mogą zostać wykorzystane do wysyłania powiadomień, gdy koszyk został porzucony przez długi czas.

Architektura projektu demonstracyjnego jest następująca:

Wymagania wstępne


Wszystkie usługi, z których będziemy korzystać w demie, będą działały w kontenerach Dockera, dzięki czemu nie będziesz musiał instalować żadnych dodatkowych usług na swoim laptopie lub serwerze zamiast Docker i Docker Compose.

Jeśli nie masz jeszcze zainstalowanych programów Docker i Docker Compose, możesz postępować zgodnie z oficjalnymi instrukcjami, jak to zrobić tutaj:

  • Zainstaluj Docker
  • Zainstaluj Docker Compose

Przegląd

Jak pokazano na powyższym schemacie, będziemy mieć następujące komponenty:

  • Pozorna usługa do ciągłego generowania zamówień.
  • Zamówienia będą przechowywane w bazie danych MySQL .
  • Gdy nastąpi zapis bazy danych, Debezium przesyła zmiany z MySQL do Redpandy temat.
  • Będziemy również mieć Postgres baza danych, w której możemy uzyskać naszych użytkowników.
  • Następnie przetworzymy ten temat Redpanda w Materialize bezpośrednio wraz z użytkownikami z bazy danych Postgres.
  • W Materialize połączymy nasze zamówienia i użytkowników, wykonamy filtrowanie i utworzymy zmaterializowany widok, który pokazuje informacje o porzuconym koszyku.
  • Następnie utworzymy zlew, aby wysłać dane porzuconego koszyka do nowego tematu Redpanda.
  • Na koniec użyjemy Metabazy do wizualizacji danych.
  • Możesz później wykorzystać informacje z tego nowego tematu do wysyłania powiadomień do użytkowników i przypominania im, że mają porzucony koszyk.

Na marginesie, byłoby dobrze, gdyby używał Kafki zamiast Redpanda. Po prostu podoba mi się prostota, jaką Redpanda wnosi do stołu, ponieważ możesz uruchomić pojedynczą instancję Redpanda zamiast wszystkich komponentów Kafki.

Jak uruchomić demo

Najpierw zacznij od sklonowania repozytorium:

git clone https://github.com/bobbyiliev/materialize-tutorials.git

Następnie możesz uzyskać dostęp do katalogu:

cd materialize-tutorials/mz-join-mysql-and-postgresql

Zacznijmy od uruchomienia kontenera Redpanda:

docker-compose up -d redpanda

Zbuduj obrazy:

docker-compose build

Na koniec uruchom wszystkie usługi:

docker-compose up -d

Aby uruchomić Materialize CLI, możesz uruchomić następujące polecenie:

docker-compose run mzcli

To tylko skrót do kontenera Dockera z postgres-client wstępnie zainstalowany. Jeśli masz już psql możesz uruchomić psql -U materialize -h localhost -p 6875 materialize zamiast tego.

Jak utworzyć zmaterializować źródło Kafki

Teraz, gdy jesteś w Materialize CLI, zdefiniujmy orders tabele w mysql.shop baza danych jako źródła Redpanda:

CREATE SOURCE orders
FROM KAFKA BROKER 'redpanda:9092' TOPIC 'mysql.shop.orders'
FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY 'http://redpanda:8081'
ENVELOPE DEBEZIUM;

Gdybyś miał sprawdzić dostępne kolumny z orders źródło, uruchamiając następującą instrukcję:

SHOW COLUMNS FROM orders;

Byłbyś w stanie zobaczyć, że ponieważ Materialize pobiera dane schematu wiadomości z rejestru Redpanda, zna typy kolumn, których należy użyć dla każdego atrybutu:

    name      | nullable |   type
--------------+----------+-----------
 id           | f        | bigint
 user_id      | t        | bigint
 order_status | t        | integer
 price        | t        | numeric
 created_at   | f        | text
 updated_at   | t        | timestamp

Jak tworzyć zmaterializowane widoki

Następnie utworzymy nasz pierwszy widok zmaterializowany, aby pobrać wszystkie dane z orders Źródło Redpanda:

CREATE MATERIALIZED VIEW orders_view AS
SELECT * FROM orders;
CREATE MATERIALIZED VIEW abandoned_orders AS
    SELECT
        user_id,
        order_status,
        SUM(price) as revenue,
        COUNT(id) AS total
    FROM orders_view
    WHERE order_status=0
    GROUP BY 1,2;

Możesz teraz użyć SELECT * FROM abandoned_orders; aby zobaczyć wyniki:

SELECT * FROM abandoned_orders;

Aby uzyskać więcej informacji na temat tworzenia widoków zmaterializowanych, zapoznaj się z sekcją Widoki zmaterializowane w dokumentacji Materializacji.

Jak utworzyć źródło Postgresa

Istnieją dwa sposoby tworzenia źródła Postgres w Materialize:

  • Korzystając z Debezium, tak jak robiliśmy to ze źródłem MySQL.
  • Korzystanie ze źródła Materialize Postgres, które umożliwia bezpośrednie połączenie Materialise z Postgresem, dzięki czemu nie musisz używać Debezium.

W tym demo użyjemy źródła Postgres Materialise tylko jako demonstracji, jak z niego korzystać, ale zamiast tego możesz użyć Debezium.

Aby utworzyć źródło Postgres Materialise, uruchom następującą instrukcję:

CREATE MATERIALIZED SOURCE "mz_source" FROM POSTGRES
CONNECTION 'user=postgres port=5432 host=postgres dbname=postgres password=postgres'
PUBLICATION 'mz_source';

Krótkie podsumowanie powyższego stwierdzenia:

  • MATERIALIZED :Materializuje dane źródła PostgreSQL. Wszystkie dane są przechowywane w pamięci i umożliwiają bezpośredni wybór źródeł.
  • mz_source :Nazwa źródła PostgreSQL.
  • CONNECTION :Parametry połączenia PostgreSQL.
  • PUBLICATION :Publikacja PostgreSQL zawierająca tabele, które mają być przesyłane strumieniowo do Materialize.

Po utworzeniu źródła PostgreSQL, aby móc odpytywać tabele PostgreSQL, musielibyśmy utworzyć widoki, które reprezentują oryginalne tabele publikacji nadrzędnej.

W naszym przypadku mamy tylko jedną tabelę o nazwie users więc stwierdzenie, które musielibyśmy uruchomić to:

CREATE VIEWS FROM SOURCE mz_source (users);

Aby zobaczyć dostępne widoki, wykonaj następującą instrukcję:

SHOW FULL VIEWS;

Gdy to zrobisz, możesz bezpośrednio zapytać o nowe widoki:

SELECT * FROM users;

Następnie przejdźmy dalej i utwórzmy jeszcze kilka widoków.

Jak utworzyć zlew Kafka

Zlewy umożliwiają wysyłanie danych z Materialise do zewnętrznego źródła.

W tym demo użyjemy Redpanda.

Redpanda jest kompatybilna z interfejsem API Kafki, a Materialize może przetwarzać z niej dane tak samo, jak przetwarza dane ze źródła Kafki.

Stwórzmy zmaterializowany widok, który będzie zawierał wszystkie nieopłacone zamówienia o dużej liczbie:

 CREATE MATERIALIZED VIEW high_value_orders AS
      SELECT
        users.id,
        users.email,
        abandoned_orders.revenue,
        abandoned_orders.total
      FROM users
      JOIN abandoned_orders ON abandoned_orders.user_id = users.id
      GROUP BY 1,2,3,4
      HAVING revenue > 2000;

Jak widać, tutaj faktycznie dołączamy do users widok, który pozyskuje dane bezpośrednio z naszego źródła Postgres, oraz abandond_orders widok, który jednocześnie pobiera dane z tematu Redpanda.

Stwórzmy Sink, do którego wyślemy dane powyższego zmaterializowanego widoku:

CREATE SINK high_value_orders_sink
    FROM high_value_orders
    INTO KAFKA BROKER 'redpanda:9092' TOPIC 'high-value-orders-sink'
    FORMAT AVRO USING
    CONFLUENT SCHEMA REGISTRY 'http://redpanda:8081';

Teraz, gdybyś miał połączyć się z kontenerem Redpanda i użyć rpk topic consume polecenie, będziesz mógł odczytać rekordy z tematu.

Jednak na razie nie będziemy mogli wyświetlić podglądu wyników za pomocą rpk ponieważ jest sformatowany w AVRO. Redpanda najprawdopodobniej zaimplementuje to w przyszłości, ale w tej chwili możemy przesłać temat z powrotem do Materialize, aby potwierdzić format.

Najpierw zdobądź nazwę tematu, który został automatycznie wygenerowany:

SELECT topic FROM mz_kafka_sinks;

Wyjście:

                              topic
-----------------------------------------------------------------
 high-volume-orders-sink-u12-1637586945-13670686352905873426

Aby uzyskać więcej informacji na temat generowania nazw tematów, zapoznaj się z dokumentacją tutaj.

Następnie utwórz nowe zmaterializowane źródło z tego tematu Redpanda:

CREATE MATERIALIZED SOURCE high_volume_orders_test
FROM KAFKA BROKER 'redpanda:9092' TOPIC ' high-volume-orders-sink-u12-1637586945-13670686352905873426'
FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY 'http://redpanda:8081';

Pamiętaj, aby odpowiednio zmienić nazwę tematu!

Na koniec prześlij zapytanie do nowego zmaterializowanego widoku:

SELECT * FROM high_volume_orders_test LIMIT 2;

Teraz, gdy masz dane w temacie, możesz połączyć się z innymi usługami i wykorzystać je, a następnie na przykład wywołać e-maile lub alerty.

Jak podłączyć metabazę

Aby uzyskać dostęp do instancji Metabase, odwiedź http://localhost:3030 jeśli uruchamiasz demo lokalnie lub http://your_server_ip:3030 jeśli uruchamiasz demo na serwerze. Następnie postępuj zgodnie z instrukcjami, aby zakończyć konfigurację metabazy.

Upewnij się, że jako źródło danych wybrałeś Materializuj.

Gdy będziesz gotowy, będziesz mógł wizualizować swoje dane tak samo, jak w przypadku standardowej bazy danych PostgreSQL.

Jak zatrzymać demo

Aby zatrzymać wszystkie usługi, uruchom następujące polecenie:

docker-compose down

Wniosek

Jak widać, jest to bardzo prosty przykład korzystania z Materialize. Możesz użyć Materialize, aby pozyskiwać dane z różnych źródeł, a następnie przesyłać je strumieniowo do różnych miejsc docelowych.

Przydatne zasoby:

  • CREATE SOURCE: PostgreSQL
  • CREATE SOURCE
  • CREATE VIEWS
  • SELECT


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CURDATE() Przykłady – MySQL

  2. Informacje o bazie danych information_schema w MySQL

  3. BŁĄD 2002 (HY000):Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/var/run/mysqld/mysqld.sock' (2)

  4. Jak przeprowadzić migrację z MSSQL do MySQL

  5. Potrzebuję mojej strony PHP, aby wyświetlić mój obraz BLOB z bazy danych mysql