跳到主要内容

如何将 PostgreSQL 的数据实时同步到 Clickhouse

ClickHouse 是一个高性能列式存储数据库,它的特点就是一个字,快!但是 ClickHouse 又不仅仅只是快这么简单,它的列式存储方式决定了它非常适用于在线分析处理(OLAP)的场景,在复杂查询和聚合操作的情况下性能非常好。这也就能解释为什么越来越多的企业将其作为实时数仓的首选。

在实际应用中,PostgreSQL 和 ClickHouse 的组合是非常普遍的,可以充分发挥两者的优势,原因如下。

PostgreSQL 作为一个强大的在线事务处理系统(OLTP),具备稳定、扩展性强、功能丰富、高性能等优势,适用于各种规模和类型的 OLTP 场景。但是在实时数据分析上,PostgreSQL 还存在一定的性能短板。

因此,通过 ClickHouse 在执行分析查询时的速度优势能很好地弥补 PostgreSQL 在查询性能上的不足。

如何将 PostgreSQL 的数据实时同步到 ClickHouse?

众所周知,在两个毫不相干的数据管理系统之间进行数据同步,特别是实时同步,其复杂程度足以让高级 DBA 脑瓜疼。因为有几个不得不解决的问题:

  • 表的初始化:在同步数据之前,需要手动在 ClickHouse 端创建和源端一致的表结构,然后才能从源端接收数据。当源端有大量表且表结构很复杂的情况下,是不是想亖的心都有?
  • 数据结构的映射:两者数据结构不同,怎么确保数据从源端同步过来后的完整性?除非你对两者的数据模型的理解非常极致,且保证绝对不出错,才能达到理想的结果。
  • 实时同步的速率:通过 ClickHouse 进行数据实时分析的大前提是,当前 ClickHouse 中的数据必须是最新的,即和源端的 PostgreSQL 完全一致,分析结果才有意义。要保证这一点,可不是一个轻松的工作。
  • 源端 DDL 语句的联动:最痛的一个点,如何保证源端的数据结构发生变化时,同步链路不中断?那就需要实时捕获源端 PostgreSQL 的 DDL 变更,并及时在目标端的 ClickHouse 中同步执行。

这些问题如果可以顺利解决,那实时同步工作将会相当丝滑。那么如何解决呢?方法自然是有的,而且丝毫不费力。对于上述 4 个问题,NineData 有绝对的发言权,我们先来看看它是如何解决这些问题的:

  • 结构复制:基于目标端数据源的特性,自动高效地完成表的创建、数据结构的映射等工作。
  • 复制性能:基于动态攒批、并行复制、Stream Load 等技术,复制性能轻松达到 200 MB/S。
  • DDL 捕获与执行:实时检测源端中的 DDL 操作,并同步在目标端中执行,保证其他业务变更能够稳定地进行。

轻松解决且非常愉快,下面来看看怎么操作。

步骤一:录入源和目标数据源

  1. 登录 NineData 控制台,单击数据源管理>数据源,然后在页面中单击创建数据源,选择需要录入的数据源。

    image-20240321112625957

  2. 根据页面提示进行配置,然后单击创建数据源完成创建。

    image-20240319150009254

步骤二:配置同步链路

  1. 登录 NineData 控制台,单击数据复制>数据复制,然后单击创建复制

    image-20240319150313727

  2. 根据页面提示配置复制任务,由于我们想要实现长期的实时数据同步,需要在复制类型处额外勾选增量复制

    image-20240319162149015

  3. 配置完成后启动任务,针对您配置的所有同步对象,NineData 会先对所有的存量数据进行全量迁移,接下来就是实时同步 PostgreSQL 中新增的增量数据,所有新写入的数据都将一条不漏地同步到 Doris,每当目标端的增量数据追平源端时,任务面板中会显示延迟 0 秒,如下图所示。

    image-20240320100557991

步骤三(可选):校验目标端同步数据的完整性

除了同步功能以外,NineData 还提供了同步后源端和目标端同步数据的对比功能,以确保目标端数据的完整性。

  1. 登录 NineData 控制台,单击数据复制>数据复制,然后单击步骤二中创建的复制任务 ID。

    image-20240320101420287

  2. 单击数据对比页签,并单击开启数据对比(如果步骤二的任务配置中已勾选开启数据一致性对比,则此处直接展示对比结果)。

    image-20240320101520639

    提示

    开启后,系统将自动对比源端和目标端的同步对象,并给出对比结果。

    image-20240320101823011

  3. 您可以在一段时间后,单击页面中的重新对比,校验最新增量数据的同步结果。

    image-20240320102016394

步骤四(可选):配置任务异常告警

由于是长期任务,您可能需要系统实时监控任务状态,在任务有异常时即刻通知您。

  1. 登录 NineData 控制台,单击数据复制>数据复制,然后单击步骤二中创建的复制任务 ID。

    image-20240320101420287

  2. 单击右上角的配置告警

    image-20240320104731392

  3. 输入策略名称,单击保存配置即可。您可以直接使用内置的默认规则,在任务运行失败,或复制延迟大于等于 10 分钟的时候,发送短信提醒您。您也可以自定义创建规则,根据您的需求来进行通知。

    image-20240320105025912

总结

至此,您已经得到了一条长期稳定的 PostgreSQL 到 ClickHouse 的实时同步链路,对于需要使用 ClickHouse 实时分析业务数据的用户来说,这样的链路不可或缺。同时,在把存量的旧数据同步至 ClickHouse 后,就可以在 PostgreSQL 端进行旧数据清理,空出存储空间,特别是对于使用云上资源的企业来说,云资源是较为昂贵的,这样做可以极大程度上降低存储成本,转而投入到更为重要的业务中。