CDC 实践|使用 PostgreSQL 和 RisingWave 支持实时电子商务运营

本文将分享如何使用 PostgreSQL CDC 和 RisingWave 建立强大的电子商务数据管道,使得组织能够实时分析动态市场,做出有效运营。PostgreSQL 可充当事务数据的存储库,CDC 则用于捕捉和跟踪数据库变更,以实现高效更新。RisingWave 则用于实现实时分析,如销售监控和库存管理。

变更数据捕获(Change Data Capture,CDC)是数据管理过程中的关键流程,可跟踪并将 Source 系统(如数据库和数据仓库)的实时数据变更复制到目标系统。CDC 旨在确保所有系统的数据完整性,这对于依赖准确数据的企业来说至关重要。CDC 最初用于提取、转换、加载(ETL)作业,现已成为云迁移的首选方法。它能够无缝连接本地和云环境,促进数据流动,保护基础设施投资。 如需更全面地了解 CDC 及其在各种场景中的优势,请参阅:《What Is Change Data Capture (CDC)? Definition, Benefits, and Use Cases》。

1. 在 PostgreSQL 中设置 CDC

要在 PostgreSQL 中启用 CDC、设置所需的表以及配置必要的设置,可以按照以下步骤进行:

1. 安装 PostgreSQL。 设置 CDC 之前,请确保系统中已安装 PostgreSQL。您可以从官方网站下载并安装 PostgreSQL,或使用与操作系统兼容的包管理器。

2. 创建表。 要在 PostgreSQL 实例中创建电子商务用例所需的表,可以使用 PostgreSQL 客户端或命令行界面连接 PostgreSQL 数据库。在示例电子商务场景中,我们将创建这些表:

  • users 表:
    • user_id
    • username
    • email
    • registration_date
    • last_login
    • address
  • products 表:
    • product_id
    • product_name
    • brand
    • category
    • price
    • stock_quantity
  • sales 表:
    • sale_id
    • user_id(外键,引用 users 表)
    • product_id(外键,引用 products 表)
    • sale_date
    • quantity
    • total_price

3. 在 PostgreSQL 中启用 CDC。

要在 PostgreSQL 中为 RisingWave 启用 CDC,请按照以下步骤进行操作:

  1. 运行以下命令检查当前的预写式日志(Write-Ahead Log,WAL)级别:

    ini 复制代码
    SHOW wal_level;

    默认情况下,该值设置为 replica。但对于 CDC,需要将其更改为 logical。要执行此操作,请修改数据库配置文件(postgresql.conf)或使用 psql 命令。运行以下命令将 wal_level 设置为 logical

    ini 复制代码
    ALTER SYSTEM SET wal_level = logical;

    请注意,更改 wal_level 需要重启 PostgreSQL 实例,并可能影响数据库性能。有关详细信息,请参阅 RisingWave PostgreSQL CDC 文档

  2. 修改 postgresql.confpg_hba.conf 文件中的配置设置,允许 RisingWave 从本地安装的 PostgreSQL 中读取 CDC 数据。

    postgresql.conf 文件中,更新以下行:

    ini 复制代码
    listen_addresses = '*'

    pg_hba.conf 文件中,添加以下几行,以允许逻辑复制所需的连接:

    sql 复制代码
    host    all             all             0.0.0.0/0               md5
    
    # Allow replication connections from any IP address using scram-sha-256 authentication method.
    host    replication     all             0.0.0.0/0               scram-sha-256
  3. 完成这些更改后,重启 PostgreSQL 以应用新设置,RisingWave 便能够使用逻辑复制从 PostgreSQL 读取 CDC 数据。

2. 将 RisingWave Cloud 连接到 PostgreSQL

要开始使用 RisingWave,请在 RisingWave Cloud 免费版本中创建一个 RisingWave 集群。有关详细说明,请参阅 RisingWave Cloud 文档

成功创建 RisingWave 集群后,可以继续在 RisingWave 中创建 Source,以便从 PostgreSQL 中读取 CDC 数据。

我们将使用以下查询来创建 Source,该 Source 连接到本地运行的 PostgreSQL。请确保填写了相应的认证参数。

ini 复制代码
CREATE SOURCE postgres_source WITH(
   connector='postgres-cdc',
   hostname='127.0.0.1',
   port='5432',
   username='postgres',
   password='qwerty1245',
   database.name='postgres',
   schema.name='public'
);

接下来,您可以创建一个名为 users 的表,该表与 PostgreSQL 中的 public.users 表相对应。此表包含用户信息列,如用户 ID、用户名、电子邮件、注册日期、最后登录时间戳和地址。其数据来自 RisingWave 中的 postgres_source

sql 复制代码
CREATE TABLE users (
    user_id INTEGER PRIMARY KEY,
    username VARCHAR,
    email VARCHAR,
    registration_date DATE,
    last_login TIMESTAMP,
    address VARCHAR
    )
FROM postgres_source TABLE 'public.users';

同样,您可以创建一个名为 products 的表,其中包含产品详细信息列,如产品 ID、名称、品牌、类别、价格和库存数量,主键设为产品 ID。其数据也来自 RisingWave 中的 postgres_source 和名为 public.products 的 PostgreSQL 表:

sql 复制代码
CREATE TABLE products (
    product_id INTEGER,
    product_name VARCHAR,
    brand VARCHAR,
    category VARCHAR,
    price NUMERIC,
    stock_quantity INTEGER,
    PRIMARY KEY (product_id)
)
FROM postgres_source TABLE 'public.products';

最后,您可以创建一个名为 sales 的表,其中包含销售详细信息列,如销售 ID、用户 ID、产品 ID、销售日期、销售数量和总价,主键设为销售 ID。其数据将来自 RisingWave 中的 postgres_source 和名为 public.sales 的 PostgreSQL 表:

sql 复制代码
CREATE TABLE sales (
    sale_id INTEGER PRIMARY KEY,
    user_id INTEGER,
    product_id INTEGER,
    sale_date DATE,
    quantity INTEGER,
    total_price NUMERIC   
)
FROM postgres_source TABLE 'public.sales';

3. RisingWave 中的数据分析

成功创建 postgres_source Source 以及相关的 users 表、products 表和 sales 表后,就可以在 RisingWave 中分析 CDC 数据了。

要计算 1 分钟间隔内产品的销售数据合计,并从结果中选择特定列进行分析或报告,可以使用以下查询。该查询使用名为 product_sales 的通用表表达式(Common Table Expression,CTE)来执行计算并检索所需的列:

vbnet 复制代码
WITH product_sales AS (
    SELECT
        window_start,
        window_end,
        s.sale_id,
        p.product_id,
        SUM(s.total_price) AS total_sales,
        AVG(s.total_price) AS average_revenue_per_sale
    FROM
        TUMBLE (sales, sale_timestamp, INTERVAL '1 MINUTES') as s
    JOIN
        products p ON s.product_id = p.product_id
    GROUP BY
        s.sale_id,
        p.product_id,
        s.window_start,
        s.window_end
)
SELECT
    ps.sale_id,
    ps.product_id,
    ps.total_sales,
    ps.average_revenue_per_sale,
    ps.window_start,
    ps.window_end
FROM
    product_sales ps;

要根据最后登录时间计算 1 分钟间隔内不同活跃用户的数量,可以使用以下查询。该查询使用 TUMBLE 函数定义时间窗口,并按用户 ID、窗口开始时间和窗口结束时间对结果进行分组,以计算每个间隔内的活跃用户总数:

sql 复制代码
SELECT
    COUNT(DISTINCT user_id) AS total_active_users,
    window_start,
    window_end
FROM 
     TUMBLE (users, last_login, INTERVAL '1 MINUTES')
GROUP BY
    user_id,
    window_start,
    window_end;

要检索 1 分钟间隔内按销售总量排名前五的产品,可以使用以下查询。该查询使用 TUMBLE 函数,根据销售时间戳定义时间窗口,并连接 sales 表和 products 表以收集有关产品类别、名称和销售数量的数据。然后按类别、产品名称、窗口开始时间和窗口结束时间对结果进行分组。查询按总销售量降序排序,且仅限于前五种产品:

vbnet 复制代码
SELECT
    p.category,
    p.product_name,
    SUM(s.quantity) AS total_quantity_sold,
    window_start,
    window_end
FROM
    TUMBLE (sales, sale_timestamp, INTERVAL '1 MINUTES') as s
JOIN
    products p
ON
    s.product_id = p.product_id
GROUP BY
    p.category, p.product_name, 
    window_start,
    window_end
ORDER BY
    total_quantity_sold DESC
LIMIT
    5;

要根据 1 分钟间隔内的消费总额计算前 10 名用户,可以使用以下查询。该查询使用 TUMBLE 函数,根据用户登录时间定义时间窗口,并连接 users 表和 sales 表以收集用户信息和销售数据。然后按用户 ID、用户名、电子邮件、窗口开始时间和窗口结束时间对结果进行分组。查询按总消费金额降序排序,且仅限于前 10 名用户:

vbnet 复制代码
SELECT
        u.user_id,
        u.username,
        u.email,
        SUM(s.total_price) AS total_spent,
        window_start,
        window_end
    FROM
        TUMBLE (users, last_login, INTERVAL '1 MINUTES') as u
    JOIN
        sales s
    ON
        u.user_id = s.user_id
    GROUP BY
        u.user_id,
        u.username,
        u.email,
        window_start,
        window_end
    ORDER BY
    total_spent DESC
LIMIT
    10;

4. 结论

本文探讨了如何将 PostgreSQL CDC 和 RisingWave 结合起来,以建立强大的电子商务数据管道。PostgreSQL 可作为事务数据的存储,CDC 可有效捕获和跟踪变更,RisingWave 则用于实现实时分析,如销售监控和库存管理。此外,RisingWave 还可用于数据预处理,以支持下游个性化推荐系统。

这种架构使得电子商务系统能够灵活应对动态的市场条件,提高企业的即时洞察力,并提升其明智决策的能力。通过 PostgreSQL、CDC 和 RisingWave 的协同工作,企业可以建立数据管道,从而有效支持电子商务运营。

5. 关于 RisingWave

RisingWave 是一款分布式 SQL 流处理数据库,旨在帮助用户降低实时应用的的开发成本。作为专为云上分布式流处理而设计的系统,RisingWave 为用户提供了与 PostgreSQL 类似的使用体验,并且具备比 Flink 高出 10 倍的性能以及更低的成本。

🧑‍💻想要了解和探索 RisingWave,欢迎浏览官网:risingwave.com/

🔧快速上手 RisingWave,欢迎体验入门教程:github.com/risingwave

💻深入理解使用 RisingWave,欢迎阅读用户文档:zh-cn.risingwave.com/docs

🔍关于更多常见问题及答案,欢迎大家来这里搜索留言: risingwavelabs/discussions

相关推荐
CC呢9 分钟前
基于单片机的智能婴儿床监护系统多功能婴儿床摇篮系统
数据库·mongodb
vvw&22 分钟前
Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程
linux·运维·服务器·ubuntu·docker·容器·开源
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
HEU_firejef1 小时前
Redis——缓存预热+缓存雪崩+缓存击穿+缓存穿透
数据库·redis·缓存
KELLENSHAW2 小时前
MySQL45讲 第三十七讲 什么时候会使用内部临时表?——阅读总结
数据库·mysql
-芒果酱-2 小时前
HNUST-数据分析技术课堂实验
数据挖掘·数据分析
hans7748829683 小时前
Python入门项目:一个简单的办公自动化需求
前端·爬虫·数据分析
SelectDB3 小时前
飞轮科技荣获中国电信星海大数据最佳合作伙伴奖!
大数据·数据库·数据分析
m0_748241703 小时前
前端学习:从零开始做一个前端开源项目
前端·学习·开源
小刘鸭!3 小时前
Hbase的特点、特性
大数据·数据库·hbase