MySQL,Oracle,SQL Server等准实时同步到PostgreSQL的方案之一 - FDW外部访问接口

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

标签

PostgreSQL , MySQL , Oracle , SQL Server , DRDS , 数据同步 , FDW , 调度 , 逻辑删除 , 空洞 , 事务时间


背景

PostgreSQL历经几十年的发展,厚积薄发,每年一个大版本,每年都有惊喜,2017年10月推出的10版本,包含重大重磅特性。PostgreSQL在逐渐成为企业的核心库。

pic

企业数据源可能众多,为了实现数据的同步,方法有很多,较为常见的是这样的方法,将数据变更汇总到消息队列,通过消息订阅的方式,传播数据。消息队列可以承担持久化存储、幂等消费、数据清洗、流式计算等工作。当然,为了提高消息队列的吞吐率,越简单越好。就像路由器和交换机一样,各司其职。

《debezium - 数据实时捕获和传输管道(CDC)》

pic

在阿里云的PostgreSQL生态中,还可以有这样的方法(数据实时写入PG,经过PG的清洗,通过OSS流入HDB PG。实现OLTP和OLAP的数据流动。):

pic

除了以上方法,实际上PostgreSQL还有一个杀手级功能,FDW,通过FDW,可以连接各种数据源,目前已有的接口如下(看样子包含了地球上所有的数据源):

https://wiki.postgresql.org/wiki/Fdw

下面我们来看一下,如何基于FDW构建一个简单的准实时同步方案。

FDW是什么

pic

FDW是PostgreSQL的一个外部数据访问接口规范,用户可以自定义任何数据源的FDW handler,这样就能访问你要访问的数据接口了。

https://www.postgresql.org/docs/10/static/fdwhandler.html

上游数据源设计规范

为了适应使用FDW来实现准实时同步的需求,上游数据源必须要符合一定的规约。

1、被同步的表必须有主键。

2、被同步的表必须有修改时间(非空),修改时间字段的初始值为记录创建时间,每次更新记录,更新为当前时间。

3、被同步的表必须有逻辑删除标记(不要使用delete直接删除数据)

或者DELETE的操作与DDL操作一样,采用调度(业务系统与PG系统同时操作的模式)。

4、被同步的表,修改时间字段,必须有索引。

逻辑删除

简单介绍一下逻辑删除。

create table tbl(  
  id int primary key,            -- 主键  
  info text,   
  state char(1),                 -- 逻辑删除标记  
  crt_time timestamp not null,   -- 写入时间  
  mod_time timestamp not null    -- 记录被修改的时间,记录创建时,设置mod_time为创建时间。  
);  

逻辑删除时,并非调用delete,而是更新state这个标记。

update tbl set state='d' , mod_time=now() where id=?;  

PostgreSQL支持使用RULE,将DELETE操作转换为UPDATE操作,例子

postgres=# create table log(id serial8 primary key, info text, state char(1), crt_time timestamp, mod_time timestamp);
CREATE TABLE

postgres=# create rule r1 as on delete to log do instead update log set state='d',mod_time=now() where id=OLD.id;
CREATE RULE
postgres=# insert into log (info,crt_time,mod_time) values ('abc',now(),now());
INSERT 0 1
postgres=# select * from log;
 id | info | state |          crt_time          |          mod_time          
----+------+-------+----------------------------+----------------------------
  1 | abc  |       | 2017-10-27 15:15:44.577036 | 2017-10-27 15:15:44.577036
(1 row)

postgres=# delete from log where id=1;
DELETE 0
postgres=# select * from log;
 id | info | state |          crt_time          |          mod_time          
----+------+-------+----------------------------+----------------------------
  1 | abc  | d     | 2017-10-27 15:15:44.577036 | 2017-10-27 15:15:54.367215
(1 row)

postgres=# update log set info='test';
UPDATE 1
postgres=# select * from log;
 id | info | state |          crt_time          |          mod_time          
----+------+-------+----------------------------+----------------------------
  1 | test | d     | 2017-10-27 15:15:44.577036 | 2017-10-27 15:15:54.367215
(1 row)

下游同步时,就可以同步到这样的操作。

如果业务上一定要DELETE,那么不适合本方案。请使用binlog的同步方式。例如rds_dbsync这个工具。

https://github.com/aliyun/rds_dbsync/

《MySQL准实时同步到PostgreSQL, Greenplum的方案之一 - rds_dbsync》

调度设计与例子

设计

1、创建外部表

2、创建本地表,结构与外部表一致

3、创建同步函数

4、同步函数逻辑

设置栅栏,对于一张外部表,同一时刻只允许开启一个任务,防止重复拖数据(虽然insert on conflict会幂等处理,但是也浪费资源)。

设置上一次同步的截止时间戳

从上一次截止的时间戳开始同步,直到N分钟前的数据(可调),目的是防止空洞(比如一些老事务未提交,时间戳还是老的,会成为空洞)。

5、使用linux crontab,创建定时任务

例子

环境部署,MySQL fdw的使用,详见:

《PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户)》

假设mysql_fdw foreign data wrapper, foreign server, user mapping, 权限 都已经配置好了。

1、外部表

CREATE FOREIGN TABLE remote_table1(  
     id int,  
     info text,  
     state char(1),  
     crt_time timestamp,  
     mod_time timestamp  
     )  
SERVER mysql_server1  
     OPTIONS (dbname 'db1', table_name 'remote_table1');  

2、本地表(与远程表定义一致)

create table local_table1(  
  id int primary key,            -- 主键  
  info text,   
  state char(1),                 -- 逻辑删除标记  
  crt_time timestamp not null,   -- 写入时间  
  mod_time timestamp not null    -- 记录被修改的时间,记录创建时,设置mod_time为创建时间。  
);  

3、同步函数1

create or replace function sync_tbl1(rmt_table name) returns void as $$   -- 每个表配置一个独立的advisory ID,防止单个表有多个任务同时跑。  
declare  
  v_mod_time timestamp;        -- 起始时间  
  v_upper_mod_time timestamp;  -- 截止时间  
begin  
  if not pg_try_advisory_lock(hashtext(rmt_table)) then return; end if;   -- 保护,确保同一个表,只有单个任务在同步。不同的表不会干扰。  
  
  select max(mod_time) into v_mod_time from local_table1 ;  
  if v_mod_time is null then   
    v_mod_time='0001-01-01'::timestamp;   
  end if;  
  
  v_upper_mod_time := now()-interval '5 min';     -- 最多同步到5分钟前,防止空洞(比如一些老事务未提交,时间戳还是老的,会成为空洞)。  
  
  insert into local_table1    
  (  
    select * from remote_table1 where mod_time > v_mod_time and mod_time <= v_upper_mod_time;  
  )   
  on conflict (id) do update set info=excluded.info,state=excluded.state,crt_time=excluded.crt_time,mod_time=excluded.mod_time ;   -- 每个表的主键,以及字段可能不一样,需要修改一下。  
    
  return;  
end;  
$$ language plpgsql strict;  

4、调度

假设每分钟调度一次。

crontab -e  
* * * * * psql -c "select sync_tbl1('remote_table1');"  

对于很大数据量的数据,PostgreSQL可以使用分区表。

《PostgreSQL 10.0 preview 功能增强 - 内置分区表》

注意

空洞问题。

最多同步到5分钟前,防止空洞(比如一些老事务未提交,时间戳还是老的,会成为空洞)。

参考

《debezium - 数据实时捕获和传输管道(CDC)》

《PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户)》

《PostgreSQL 10.0 preview 功能增强 - 内置分区表》

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
10月前
|
Oracle 关系型数据库 MySQL
Oracle linux 8 二进制安装 MySQL 8.4企业版
Oracle linux 8 二进制安装 MySQL 8.4企业版
436 1
|
12月前
|
SQL Oracle 关系型数据库
MySQL 和 Oracle 的区别?
本文对比了Oracle和MySQL数据库的多个方面。Oracle适用于大型数据库,支持高并发和大访问量,市场占有率为40%,安装占用空间较大,约3G;而MySQL适合中小型应用,是开源免费的,安装仅需152M。两者在主键生成、字符串处理、SQL语句、事务处理等方面存在差异。Oracle功能更为强大,尤其在企业级应用中表现突出,而MySQL则以简单易用见长。
1368 7
MySQL 和 Oracle 的区别?
|
11月前
|
Oracle 关系型数据库 MySQL
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
|
12月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
644 9
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
554 9
|
监控 Oracle 关系型数据库
Mysql、Oracle审计日志的开启
通过上述步骤,可以在 MySQL 和 Oracle 数据库中启用和配置审计日志。这些日志对于监控数据库操作、提高安全性和满足合规性要求非常重要。确保正确配置审计参数和策略,定期查看和分析审计日志,有助于及时发现并处理潜在的安全问题。
765 11
|
5月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
479 93
|
4月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
276 0
|
7月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。

相关产品

  • 云数据库 RDS MySQL 版
  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多