sql >> Databáze >  >> RDS >> Mysql

Jak se připojit k MySQL a Postgres v živém materializovaném zobrazení

Když pracujete na projektu, který se skládá z mnoha mikroslužeb, bude pravděpodobně zahrnovat také více databází.

Můžete mít například databázi MySQL a databázi PostgreSQL, obě běží na samostatných serverech.

Pro spojení dat ze dvou databází byste obvykle museli zavést novou mikroslužbu, která by data spojila. Ale to by zvýšilo složitost systému.

V tomto tutoriálu použijeme Materialise ke spojení MySQL a Postgres v živém materializovaném zobrazení. Poté budeme schopni dotazovat se přímo a získat zpět výsledky z obou databází v reálném čase pomocí standardního SQL.

Materialize je zdrojově dostupná streamovací databáze napsaná v Rustu, která uchovává výsledky SQL dotazu (materializované zobrazení) v paměti, jak se data mění.

Výukový program obsahuje ukázkový projekt, který můžete začít pomocí docker-compose .

Demo projekt, který budeme používat, bude sledovat objednávky na našem falešném webu. Bude generovat události, které by mohly být později použity k odesílání upozornění, když byl košík po dlouhou dobu opuštěný.

Architektura demo projektu je následující:

Předpoklady


Všechny služby, které budeme používat v ukázce, poběží v kontejnerech Docker, takže nebudete muset instalovat žádné další služby na svůj notebook nebo server, nikoli Docker a Docker Compose.

V případě, že ještě nemáte nainstalované Docker a Docker Compose, můžete postupovat podle oficiálních pokynů, jak to udělat zde:

  • Nainstalujte Docker
  • Nainstalujte Docker Compose

Přehled

Jak je znázorněno na obrázku výše, budeme mít následující součásti:

  • Simulovaná služba pro nepřetržité generování objednávek.
  • Objednávky budou uloženy v databázi MySQL .
  • Při zápisu do databáze Debezium streamuje změny z MySQL do Redpanda téma.
  • Budeme mít také Postgres databáze, kam můžeme získat naše uživatele.
  • Toto téma Redpanda pak vložíme do Materializovat přímo spolu s uživateli z databáze Postgres.
  • Ve Materialize spojíme naše objednávky a uživatele, provedeme filtrování a vytvoříme materializované zobrazení, které zobrazuje informace o opuštěném košíku.
  • Potom vytvoříme jímku, abychom odeslali data opuštěného košíku do nového tématu Redpanda.
  • Nakonec použijeme Metabázi k vizualizaci dat.
  • Později byste mohli informace z tohoto nového tématu použít k rozesílání oznámení svým uživatelům a připomínat jim, že mají opuštěný košík.

Jako okrajovou poznámku byste měli zcela v pořádku používat Kafku místo Redpanda. Líbí se mi jednoduchost, kterou Redpanda přináší, protože můžete spustit jedinou instanci Redpanda namísto všech komponent Kafka.

Jak spustit ukázku

Nejprve začněte klonováním úložiště:

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

Poté můžete vstoupit do adresáře:

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

Začněme tím, že nejprve spustíme kontejner Redpanda:

docker-compose up -d redpanda

Vytvořte obrázky:

docker-compose build

Nakonec spusťte všechny služby:

docker-compose up -d

Chcete-li spustit Materialize CLI, můžete spustit následující příkaz:

docker-compose run mzcli

Toto je jen zkratka ke kontejneru Docker s postgres-client předinstalovaný. Pokud již máte psql můžete spustit psql -U materialize -h localhost -p 6875 materialize místo toho.

Jak vytvořit materializovaný zdroj Kafky

Nyní, když jste v Materialize CLI, pojďme definovat orders tabulky v mysql.shop databáze jako zdroje Redpanda:

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

Pokud byste měli zkontrolovat dostupné sloupce z orders zdroj spuštěním následujícího příkazu:

SHOW COLUMNS FROM orders;

Mohli byste vidět, že když Materialize stahuje data schématu zpráv z registru Redpanda, zná typy sloupců, které se mají použít pro každý atribut:

    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 vytvářet materializované pohledy

Dále vytvoříme náš první materializovaný pohled, abychom získali všechna data z orders Zdroj 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;

Nyní můžete použít SELECT * FROM abandoned_orders; zobrazíte výsledky:

SELECT * FROM abandoned_orders;

Další informace o vytváření materializovaných pohledů najdete v sekci Materialized Views v dokumentaci Materialize.

Jak vytvořit zdroj Postgres

Existují dva způsoby, jak vytvořit zdroj Postgres v Materialize:

  • Používání Debezium stejně jako u zdroje MySQL.
  • Pomocí Postgres Materialise Source, který vám umožňuje propojit Materialise přímo s Postgres, takže nemusíte používat Debezium.

Pro toto demo použijeme Postgres Materialise Source jen jako ukázku toho, jak jej používat, ale klidně místo něj použijte Debezium.

Pro vytvoření Postgres Materialise Source spusťte následující příkaz:

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

Rychlé shrnutí výše uvedeného prohlášení:

  • MATERIALIZED :Zhmotní data zdroje PostgreSQL. Všechna data jsou uchovávána v paměti a umožňují přímou volbu zdrojů.
  • mz_source :Název zdroje PostgreSQL.
  • CONNECTION :Parametry připojení PostgreSQL.
  • PUBLICATION :Publikace PostgreSQL obsahující tabulky, které mají být streamovány do Materialize.

Jakmile vytvoříme zdroj PostgreSQL, abychom mohli dotazovat tabulky PostgreSQL, museli bychom vytvořit pohledy, které představují původní tabulky upstreamové publikace.

V našem případě máme pouze jednu tabulku s názvem users takže příkaz, který bychom potřebovali spustit, je:

CREATE VIEWS FROM SOURCE mz_source (users);

Chcete-li zobrazit dostupné pohledy, proveďte následující příkaz:

SHOW FULL VIEWS;

Jakmile to uděláte, můžete se přímo dotazovat na nové pohledy:

SELECT * FROM users;

Dále pojďme do toho a vytvořte několik dalších zobrazení.

Jak vytvořit dřez Kafka

Sinks vám umožňují odesílat data z Materialize do externího zdroje.

Pro tuto ukázku budeme používat Redpanda.

Redpanda je kompatibilní s Kafka API a Materialize z ní dokáže zpracovávat data stejně jako by zpracovávala data ze zdroje Kafka.

Pojďme vytvořit materializovaný pohled, který bude obsahovat všechny nezaplacené objednávky s velkým objemem:

 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 můžete vidět, zde se ve skutečnosti připojujeme k users zobrazení, které zpracovává data přímo z našeho zdroje Postgres, a abandond_orders zobrazení, které společně zpracovává data z tématu Redpanda.

Vytvořme Sink, kam budeme posílat data výše uvedeného materializovaného pohledu:

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';

Nyní, pokud byste se měli připojit ke kontejneru Redpanda a použít rpk topic consume příkazem, budete moci číst záznamy z tématu.

Prozatím však nebudeme moci zobrazit náhled výsledků pomocí rpk protože je ve formátu AVRO. Redpanda by to s největší pravděpodobností implementovala v budoucnu, ale v tuto chvíli můžeme téma skutečně streamovat zpět do Materialize, abychom potvrdili formát.

Nejprve získejte název tématu, které bylo automaticky vygenerováno:

SELECT topic FROM mz_kafka_sinks;

Výstup:

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

Další informace o tom, jak se generují názvy témat, naleznete v dokumentaci zde.

Poté vytvořte nový materializovaný zdroj z tohoto tématu 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';

Nezapomeňte odpovídajícím způsobem změnit název tématu!

Nakonec zadejte dotaz na tento nový materializovaný pohled:

SELECT * FROM high_volume_orders_test LIMIT 2;

Nyní, když máte data v tématu, můžete se k nim připojit další služby a využívat je a poté spouštět například e-maily nebo upozornění.

Jak připojit metabázi

Chcete-li získat přístup k instanci metabáze, navštivte http://localhost:3030 pokud demo spouštíte lokálně nebo http://your_server_ip:3030 pokud spouštíte demo na serveru. Poté postupujte podle kroků k dokončení nastavení metabáze.

Ujistěte se, že jste jako zdroj dat vybrali Materialize.

Jakmile budete připraveni, budete moci svá data vizualizovat stejně jako se standardní PostgreSQL databází.

Jak zastavit ukázku

Chcete-li zastavit všechny služby, spusťte následující příkaz:

docker-compose down

Závěr

Jak vidíte, toto je velmi jednoduchý příklad toho, jak používat Materialise. Materialize můžete použít ke zpracování dat z různých zdrojů a poté je streamovat do různých cílů.

Užitečné zdroje:

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


  1. Jak uchovat data v ukotvené postgresové databázi pomocí svazků

  2. Porovnání serveru MariaDB s clusterem MariaDB

  3. Jak mohu prohledávat všechny sloupce v tabulce?

  4. Jak to_timestamp() funguje v PostgreSQL