라이브 구체화된 뷰에서 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를 사용하여 다양한 소스에서 데이터를 수집한 다음 다양한 대상으로 스트리밍할 수 있습니다.
유용한 리소스:
'Coding' 카테고리의 다른 글
Web 3.0에 대한 Web 2.0 개발자 가이드 (0) | 2022.05.14 |
---|---|
event.preventDefault() 및 event.stopPropagation()을 사용하여 브라우저 기본값을 관리하는 방법 (0) | 2022.05.09 |
Python으로 웹 스크래핑 지역 타겟팅에서 프록시를 사용하는 방법 (0) | 2022.05.07 |
시니어 개발자가 되기 위해 내가 한 가장 중요한 일 (0) | 2022.05.02 |
JavaScript의 브리지 디자인 패턴하는 방법 (0) | 2022.04.29 |
댓글