본문 바로가기
Coding

라이브 구체화된 뷰에서 MySQL 및 Postgres에 가입하는 방법

by Emily Blunt 2022. 5. 8.
반응형

라이브 구체화된 뷰에서 MySQL 및 Postgres에 가입하는 방법

 

많은 마이크로서비스로 구성된 프로젝트에서 작업할 때 여러 데이터베이스도 포함될 수 있습니다.

예를 들어, MySQL 데이터베이스와 PostgreSQL 데이터베이스가 모두 별도의 서버에서 실행 중일 수 있습니다.

일반적으로 두 데이터베이스의 데이터를 결합하려면 데이터를 결합하는 새로운 마이크로서비스를 도입해야 합니다. 그러나 이것은 시스템의 복잡성을 증가시킬 것입니다.

이 자습서에서는 Materialize를 사용하여 라이브 구체화된 보기에서 MySQL 및 Postgres를 결합합니다. 그런 다음 이를 직접 쿼리하고 표준 SQL을 사용하여 실시간으로 두 데이터베이스에서 결과를 다시 얻을 수 있습니다.

Materialise는 데이터가 변경될 때 메모리에 SQL 쿼리(구체화된 뷰)의 결과를 유지하는 Rust로 작성된 소스 사용 가능한 스트리밍 데이터베이스입니다.

튜토리얼에는 사용을 시작할 수 있는 데모 프로젝트가 포함되어 있습니다. docker-compose.

우리가 사용할 데모 프로젝트는 모의 웹사이트에서 주문을 모니터링합니다. 장바구니가 오랫동안 방치되었을 때 알림을 보내는 데 나중에 사용할 수 있는 이벤트를 생성합니다.

데모 프로젝트의 아키텍처는 다음과 같습니다.

전제 조건


데모에서 사용할 모든 서비스는 Docker 컨테이너 내에서 실행되므로 Docker 및 Docker Compose 대신 랩톱이나 서버에 추가 서비스를 설치할 필요가 없습니다.

Docker 및 Docker Compose가 이미 설치되어 있지 않은 경우 여기에서 설치 방법에 대한 공식 지침을 따를 수 있습니다.

개요

위의 다이어그램에서 볼 수 있듯이 다음 구성 요소가 있습니다.

  • 지속적으로 주문을 생성하는 모의 서비스입니다.
  • 주문은 MySQL 데이터베이스.
  • 데이터베이스 쓰기가 발생함에 따라 데베지움 MySQL의 변경 사항을 다음으로 스트리밍합니다. 레드 팬더 주제.
  • 우리는 또한 가질 것입니다 포스트그레스 사용자를 얻을 수 있는 데이터베이스입니다.
  • 그런 다음 이 Redpanda 주제를 구체화하다 Postgres 데이터베이스의 사용자와 직접
  • Materialise에서 주문과 사용자를 함께 결합하고 일부 필터링을 수행하고 버려진 장바구니 정보를 표시하는 구체화된 보기를 만듭니다.
  • 그런 다음 버려진 장바구니 데이터를 새로운 Redpanda 주제로 보내는 싱크를 생성합니다.
  • 결국 우리는 사용할 것입니다 메타베이스 데이터를 시각화합니다.
  • 나중에 새 주제의 정보를 사용하여 사용자에게 알림을 보내고 장바구니를 포기했음을 상기시킬 수 있습니다.

참고로 Redpanda 대신 Kafka를 사용하면 완벽할 것입니다. 모든 Kafka 구성 요소 대신 단일 Redpanda 인스턴스를 실행할 수 있으므로 Redpanda가 테이블에 제공하는 단순함이 마음에 듭니다.

데모 실행 방법

먼저 리포지토리를 복제하여 시작합니다.

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

그런 다음 디렉토리에 액세스할 수 있습니다.

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

먼저 Redpanda 컨테이너를 실행하여 시작하겠습니다.

docker-compose up -d redpanda

이미지 빌드:

docker-compose build

마지막으로 모든 서비스를 시작합니다.

docker-compose up -d

Materialise CLI를 시작하려면 다음 명령을 실행할 수 있습니다.

docker-compose run mzcli

이것은 Docker 컨테이너에 대한 바로 가기일 뿐입니다. postgres-client 사전 설치된. 이미 가지고 있는 경우 psql 당신은 달릴 수 있습니다 psql -U materialize -h localhost -p 6875 materialize 대신에.

Materialise Kafka 소스를 만드는 방법

이제 Materialise CLI에 있으므로 다음을 정의하겠습니다. orders 의 테이블 mysql.shop Redpanda 소스로 데이터베이스:

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

사용 가능한 열을 확인하려면 orders 다음 명령문을 실행하여 소스:

SHOW COLUMNS FROM orders;

Materialize가 Redpanda 레지스트리에서 메시지 스키마 데이터를 가져올 때 각 속성에 사용할 열 유형을 알고 있음을 알 수 있습니다.

    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

구체화된 뷰를 생성하는 방법

다음으로 첫 번째 구체화된 뷰를 생성하여 모든 데이터를 가져옵니다. orders 레드판다 출처:

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;

이제 사용할 수 있습니다. SELECT * FROM abandoned_orders; 결과를 보려면:

SELECT * FROM abandoned_orders;

구체화된 보기 생성에 대한 자세한 내용은 구체화 문서의 구체화된 보기 섹션을 확인하십시오.

Postgres 소스를 만드는 방법

Materialise에서 Postgres 소스를 생성하는 방법에는 두 가지가 있습니다.

  • MySQL 소스와 마찬가지로 Debezium을 사용합니다.
  • Postgres Materialize Source를 사용하면 Materialize를 Postgres에 직접 연결할 수 있으므로 Debezium을 사용할 필요가 없습니다.

이 데모에서는 Postgres Materialize Source를 사용 방법에 대한 데모로 사용할 것이지만 대신 Debezium을 사용해도 무방합니다.

Postgres Materialize Source를 생성하려면 다음 명령문을 실행하십시오.

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

위의 진술을 간략히 요약하면 다음과 같습니다.

  • MATERIALIZED: PostgreSQL 소스의 데이터를 구체화합니다. 모든 데이터는 메모리에 유지되며 소스를 직접 선택할 수 있습니다.
  • mz_source: PostgreSQL 소스의 이름입니다.
  • CONNECTION: PostgreSQL 연결 매개변수입니다.
  • PUBLICATION: Materialize로 스트리밍할 테이블을 포함하는 PostgreSQL 출판물.

PostgreSQL 소스를 생성하고 나면 PostgreSQL 테이블을 쿼리할 수 있으려면 업스트림 발행물의 원본 테이블을 나타내는 뷰를 생성해야 합니다.

우리의 경우 라는 테이블이 하나만 있습니다. users 따라서 우리가 실행해야 하는 문장은 다음과 같습니다.

CREATE VIEWS FROM SOURCE mz_source (users);

사용 가능한 보기를 보려면 다음 명령문을 실행하십시오.

SHOW FULL VIEWS;

완료되면 새 보기를 직접 쿼리할 수 있습니다.

SELECT * FROM users;

다음으로 몇 가지 보기를 더 만들어 보겠습니다.

Kafka 싱크를 만드는 방법

싱크를 사용하면 Materialise에서 외부 소스로 데이터를 보낼 수 있습니다.

이 데모에서는 Redpanda를 사용할 것입니다.

Redpanda는 Kafka API와 호환되며 Materialise는 Kafka 소스의 데이터를 처리하는 것처럼 여기에서 데이터를 처리할 수 있습니다.

대량의 미지급 주문을 모두 보유하는 구체화된 뷰를 생성해 보겠습니다.

 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;

보시다시피 여기에서 실제로 합류합니다. users Postgres 소스에서 직접 데이터를 수집하는 뷰 및 abandond_orders Redpanda 주제에서 데이터를 수집하는 보기입니다.

위의 구체화된 뷰의 데이터를 보낼 Sink를 생성해 보겠습니다.

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

이제 Redpanda 컨테이너에 연결하고 rpk topic consume 명령을 실행하면 주제에서 레코드를 읽을 수 있습니다.

그러나 현재로서는 다음을 사용하여 결과를 미리 볼 수 없습니다. rpk AVRO 형식이기 때문입니다. Redpanda는 미래에 이를 구현할 가능성이 높지만 현재로서는 실제로 주제를 Materialize로 다시 스트리밍하여 형식을 확인할 수 있습니다.

먼저 자동으로 생성된 주제의 이름을 가져옵니다.

SELECT topic FROM mz_kafka_sinks;

산출:

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

주제 이름이 생성되는 방법에 대한 자세한 내용은 여기에서 설명서를 확인하세요.

그런 다음 이 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';

그에 따라 주제 이름을 변경하십시오!

마지막으로 이 새로운 구체화된 뷰를 쿼리합니다.

SELECT * FROM high_volume_orders_test LIMIT 2;

이제 주제에 데이터가 있으므로 다른 서비스가 해당 데이터에 연결하고 이를 사용하도록 한 다음 예를 들어 이메일이나 경고를 트리거할 수 있습니다.

Metabase 인스턴스에 액세스하려면 다음을 방문하십시오. http://localhost:3030 데모를 로컬에서 실행하거나 http://your_server_ip:3030 서버에서 데모를 실행하는 경우. 그런 다음 단계에 따라 메타베이스 설정을 완료합니다.

Materialise를 데이터 소스로 선택해야 합니다.

준비가 되면 표준 PostgreSQL 데이터베이스와 마찬가지로 데이터를 시각화할 수 있습니다.

데모를 중지하는 방법

모든 서비스를 중지하려면 다음 명령을 실행합니다.

docker-compose down

결론

보시다시피 이것은 Materialise를 사용하는 방법에 대한 매우 간단한 예입니다. Materialize를 사용하여 다양한 소스에서 데이터를 수집한 다음 다양한 대상으로 스트리밍할 수 있습니다.

유용한 리소스:

반응형

댓글