对数据库中存储的程序进行现代化改造,以使用 Amazon Aurora PostgreSQL 联合查询、pg_cron 和 Amazon Lambda

news2024/9/21 4:37:49

作为数据库迁移和现代化的一部分,您可以继续使用存储的程序和调度作业,将远程实例中的数据整合到集中式数据存储中。 Amazon Schema Conversion Tool(Amazon SCT)可帮助您将传统的 Oracle 和 SQL Server 函数转换为其等效的开源函数。但是,如何继续使用存储的程序从远程数据库中提取数据呢? 您现有的 cron 作业怎么样? 如何处理存储的程序中的错误并通知数据库管理员? 您可以使用 postgres_fdw、 pg_cron 和 Amazon_lambda 等 PostgreSQL 扩展实现此目的。在这篇博文中,我们演示了一种模式,它允许您对数据库进行现代化改造并重构现有代码。我们使用 Amazon Aurora PostgreSQL 兼容版数据库实例来说明这种模式。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

对数据库进行现代化改造没有一刀切的方法。您需要仔细规划自己的转型之旅,并制定明确的目标和成果。如果在数据库层处理某些逻辑符合您的业务需求,则可以考虑本文中介绍的方法。有关其他指导,请参阅将 Oracle 数据库迁移到 Amazon Cloud 和将 Microsoft SQL Server 数据库迁移到 Amazon Cloud。

PostgreSQL 扩展

在开始之前,我们看看我们的解决方案中使用的 PostgreSQL 扩展。

postgres_fdw是一个外部数据封装器,用于访问远程 PostgreSQL 服务器中的数据。Amazon Relational Database Service (Amazon RDS) for PostgreSQL 和 Aurora PostgreSQL 支持此扩展。借助 postgres_fdw,您可以实现联合查询,以便从远程 PostgreSQL 数据库实例检索数据、将其存储在集中式数据库中或生成报告。

Amazon Lambda 在高度可用的计算基础设施中运行代码,无需预调配或管理服务器和操作系统维护。Lambda 中的代码以函数形式组织,支持多种编程语言,例如 Python、Node.js、Java 和 Ruby。aws_lambda扩展提供从 Aurora PostgreSQL 调用 Lambda 函数的功能。此扩展还需要 aws_commons扩展,它为 aws_lambda 和许多其他 PostgreSQL 的 Aurora 扩展提供帮助程序函数。如果存储过程中出现错误,您可以将错误消息发送到 Lambda 函数,然后使用 Amazon Simple Notification Service(Amazon SNS)向数据库管理员发送通知。

您可以使用 pg_cron 来调度 SQL 命令,它使用与标准 CRON 表达式相同的语法。我们可以使用此扩展调度存储的程序并自动执行日常维护任务。

解决方案概览

源数据库由我们要检索并加载到报告数据库中的表和数据组成。pg_cron 扩展根据预定义的计划运行存储的程序。存储的程序基于预定义的业务逻辑复制数据。如果遇到任何错误,它将调用 Lambda 函数,向订阅了 SNS 主题的用户发送错误通知。下图展示了该解决方案的架构和流程。

在这篇博文中,我们将引导您完成使用 Amazon CloudFormation 创建资源、配置存储的程序和测试解决方案的步骤。

先决条件

请务必完成以下必备步骤:

  1. 设置 Amazon 命令行界面(Amazon CLI)以运行用于与 Amazon 资源交互的命令。
  2. 拥有与您的 Amazon 账户中的资源进行交互的适当权限。

使用 Amazon CloudFormation 创建资源

此解决方案的 CloudFormation 模板部署了以下关键资源:

  • 用于源数据库和报告数据库的两个 Aurora PostgreSQL 集群,包含数据库表和存储的程序
  • 用于将错误消息转发到 Amazon SNS 的 Lambda 函数
  • 电子邮件通知的 SNS 主题
  • Amazon Cloud9 实例,用于连接到数据库进行设置和测试。

在运行此解决方案之前,使用 Amazon 定价计算器估算成本。部署的资源不符合免费套餐的条件,但如果您选择堆栈默认设置,假设您在一小时内清理了堆栈,则所产生的费用应低于 3.00 美元。

要创建资源,请完成以下步骤:

  1. 通过从终端运行以下命令克隆 GitHub 项目:
git clone https://github.com/aws-samples/amazon-aurora-postgresql-stored-proc-pgcron.git
cd amazon-aurora-postgresql-stored-proc-pgcron
  1. 使用以下代码部署 Amazon CloudFormation 资源。将 youreamil@example.com 替换为有效的电子邮件地址。
aws cloudformation create-stack \
--stack-name AmazonAuroraPostgreSQLStoredProc \
--template-body \
file://AmazonAuroraPostgreSQLStoredProc.yaml \
--parameters \
ParameterKey=ErrorEmail,ParameterValue="youremail@example.com" \
--capabilities CAPABILITY_IAM

资源预调配大约需要 15 到 20 分钟才能完成。您可以前往 Amazon CloudFormation 控制台并验证状态是否显示为 CREATE_COMPLETE,从而确保成功部署堆栈。

创建堆栈时,您会收到一封确认订阅 SNS 的电子邮件。

  1. 在电子邮件中选择确认订阅。

将打开一个浏览器窗口,其中包含您的订阅确认。

配置存储的程序

要配置存储的程序,请完成以下步骤:

  1. 在 Amazon Cloud9 控制台的 Your environments(您的环境)下,选择环境 PostgreSQLInstance
  2. 选择 Open IDE(打开 IDE)。 这将打开一个 IDE,用于配置、部署和测试存储的程序。
  3. 在您的 Cloud9 终端中,运行以下命令以克隆存储库并安装所需的工具:
git clone https://github.com/aws-samples/amazon-aurora-postgresql-stored-proc-pgcron.git 
cd amazon-aurora-postgresql-stored-proc-pgcron/scripts
sh install-db-tools.sh

该脚本需要 5 分钟来安装所有必需的工具。在进入下一步之前,请确保安装已完成。

  1. 运行以下命令初始化环境变量:

source ~/.bashrc

  1. 通过运行以下 shell 脚本命令创建源数据库对象和报告数据库对象:

sh initialize-source-reporting-dbs.sh

此脚本创建 employee 表和 department 表,并在源数据库中插入一些示例记录。

脚本在源数据库中创建数据库对象后,它会在 reporting 数据库中创建 employee 表以及 employee_sperror_handler_sp 和 schedule_sp_job 存储的程序。作为最后一步,它将创建 postgres_fdw 扩展、外部服务器、用户映射和外部表,以便从源数据库中提取数据。要了解有关 postgres_fdw 的更多信息,请参阅 PostgreSQL 文档。

sh connect-source-db.sh
\dt
\d+ department
\d+ employee

employee 表存储原始数据,其中可能包含空值和重复值。department 表用作部门名称的查找表。

  1. 使用以下命令退出源数据库:

exit

  1. 逐个运行以下命令,观察报告数据库中存储的程序和表:
sh connect-reporting-db.sh
\dfp
\d+ employee

employee_sp 存储的程序验证员工源表中的原始数据并将其复制到报告数据库中的员工表。error_handler_sp 处理错误并向注册的电子邮件地址发送通知。schedule_sp_job 通过创建 cron 作业自动调度 employee_sp程序的运行。

  1. 使用以下命令退出数据库:

exit

测试存储的程序

我们创建了所有必需的表和存储的程序之后,就可以测试解决方案了。运行以下 shell 脚本:

sh execute_sp.sh

这将调用报告数据库中的 employee_sp 存储的程序。它使用以下代码验证员工和部门数据并将其从源数据库复制到报告数据库中的 employee 表:

insert into employee (employee_id,first_name,last_name,dob,badge_id,salary,dept_name)
        select employee_id, first_name, last_name,dob,replace(badge_id,''-'',''''),salary, dfdw.dept_name
        from employee_fdw efdw, department_fdw dfdw
        where efdw.dept_id = dfdw.dept_id
        and efdw.first_name is not null
        and efdw.last_name is not null
        and efdw.badge_id is not null
        and dfdw.dept_name is not null
        and efdw.salary>0;

逐个运行以下命令,验证报告数据库的 employee 表中插入的记录:

sh connect-reporting-db.sh
select * from employee;

使用以下命令退出数据库:

exit

测试错误通知

源表可能包含重复的记录,我们不希望在报告数据库中插入重复的记录。您可以验证存储的程序在尝试将重复记录插入报告数据库的员工表时是否会引发错误并发送电子邮件通知。

我们通过运行以下 shell 脚本来模拟错误场景:

sh execute_sp_using_duplicates.sh

该脚本在源数据库的 employee 表中插入一条重复的记录,然后运行 execute_sp.sh 调用 employee_sp() 存储的程序将数据从源数据库复制到远程数据库。

在报告数据库中插入重复记录时,会发生主键冲突。此异常会在 exception 块中捕获,并调用 error_handler_sp 存储的程序。请参阅以下代码:

exception
when others then
    call error_handler_sp('TIME:  '||clock_timestamp()||' / PROCEDURE:  '||v_proc_name||' 
        / MESSAGE:  '||v_message||' / EXCEPTION:  '||v_error_exception||' / HINT:  '||v_error_hint);
end;

调用 error_handler_sp 存储的程序时,如果不存在,它将创建 aws_lambda 扩展。然后它将错误消息传递给调用该函数的 Lambda 函数 ExceptionLambda

Lambda 函数将错误消息发布到 SNS 主题。您会收到一封主题为“存储的程序错误”的电子邮件,通知您在尝试插入重复记录时出现异常。

调度您的存储的程序

在生产环境中,您可能希望调度存储的程序以自动方式运行。

  1. 运行以下 shell 脚本以调度存储的程序的运行:
sh schedule_pgcron_job.sh

该脚本刷新数据库对象以进行测试,并调用 schedule_sp_job 存储的程序。schedule_sp_job 创建 pg_cron 扩展(如果 pg_cron 不存在),并调度每 10 分钟运行一次 employee_sp 存储的程序的 cron 作业。

  1. 在报告数据库中运行以下 SQL 查询,以确认 cron 作业的创建。我们使用 cron 表达式 */10 * * * * 来允许作业每 10 分钟运行一次。
sh connect-reporting-db.sh
select * from cron.job;
  1. 您可以使用以下 SQL 查询查看计划作业的状态:
select jobid, username, status, return_message, start_time from cron.job_run_details;

10 分钟后,清理后的数据将填充到报告数据库的 employee 表中。

  1. 现在,您可以通过运行以下 SQL 命令来取消调度 cron 作业:
select cron.unschedule ('Execute employee_sp');

使用 pg_cron,您可以定期调度 SQL 命令的执行以执行重复性任务。

清理

为避免产生持续的费用,请从 Amazon CloudFormation 控制台中删除 AmazonAuroraPostgreSQLStoredProc 堆栈来清理基础设施。删除作为本练习的先决条件而创建的任何其他资源。

结论

在这篇博文中,我们演示了如何使用 Aurora PostgreSQL 扩展(例如 postgres_fdwpg_cron 和 aws_lambda)对存储的程序进行现代化改造。Aurora PostgreSQL 扩展通过提供与商业数据库同等的功能来增强数据库开发体验。在规划现代化之旅时,请仔细考虑您的业务目标和成果。

有关 Aurora 扩展的更多信息,请参阅使用扩展和外部数据封装器。有关使用数据库触发器通过 Lambda 和 Amazon SNS 启用近实时通知的信息,请参阅使用数据库触发器、Amazon Lambda 和 Amazon SNS 启用来自 Amazon Aurora PostgreSQL 的近实时通知。

告诉我们这篇博文对您的数据库现代化之旅有何帮助。

关于作者

Prathap Thoguru 是 Amazon Web Services 的一名企业解决方案构架师。他在 IT 行业拥有 15 年以上的经验,是一名已获 9 项 Amazon 认证的专业人员。他帮助客户将本地工作负载迁移到 Amazon Cloud。

Kishore Dhamodaran 是 Amazon Web Services 的高级解决方案架构师。Kishore 利用他多年的行业和云经验,帮助客户制定云企业战略和迁移之旅。

文章来源:https://dev.amazoncloud.cn/column/article/6309e07b76658473a321ffe2?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/462732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF 预览和下载你是怎么实现的?

前言 在开发过程中要求对 PDF 类型的发票提供 预览 和 下载 功能,**PDF** 类型文件的来源又包括 H5 移动端 和 **PC 端**,而针对这两个不同端的处理会有些许不同,下文会有所提及。 针对 PDF 预览 的文章不在少数,但似乎都没有提…

排查和解决CentOS系统上Nacos服务启动报错“java.net.UnknownHostException: jmenv.tbsite.net“问题

背景 环境是CentOS7操作系统,nacos服务宕掉了,启动服务的时候报错。 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.servlet.FilterRegistrationBean]: Factory method ‘di…

太酷啦,Transformer 的有效上下文长度可扩展至百万级

夕小瑶科技说 原创作者 | 智商掉了一地、iven 用 Recurrent Memory Transformer 架构:可输入长度取决于内存大小 Transformer 因其在自然语言处理领域的成功应用而备受瞩目,同时在计算机视觉领域的研究中,诸多的多模态大模型如 ViT、CLIP、BL…

iperf3使用教程

文章目录 简介1.下载2. 使用测试实例:案例一 TCP通信测试案例二:UDP测试案例三 传输东西进行测试 iperfs3简单使用样例 简介 iPerf3是用于主动测试IP网络上最大可用带宽的工具。它支持时序、缓冲区、协议(TCP,UDP,SCT…

软件测试方法——等价类划分法详解

1、等价类划分法的介绍和概念 划分 指互不相交的一组子集,这些子集的并是整个集合。 对测试的意义:完备性和无冗余性。 等价类 等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,具有等…

23.4.25总结

复习了MYSQL数据库的主键和外键的知识: 在设计表时,可以通过外键这个按钮,更改Update rule(更新规则)和Delete rule(删除规则)。 外键行为 默认情况下是:NO ACTION、RESTRICT 两…

传统机器学习(七)支持向量机(1)超平面、SVM硬间隔、软间隔模型和损失函数

传统机器学习(七)支持向量机(1) 1 算法概述 1.1 超平面的理解 1.1.1 超平面公式 我们对“平面”概念的理解,一般是定义在三维空间中的,如下: 假设M和M0为平面上的两点,n为该平面的法向量,那么,通过下图…

4.25~~~~~

接着之前PE文件结构的预习 DOS 定位到NT 怎么操作的? 用的是e_lfanew,然后是相对于文件头的偏移量(也就是raw表示方法) 现在有个问题,为什么e_lfanew 这个变量不直接存储PE头 的绝对地址呢? 比如说&…

python 基础语法学习之变量与运算符

一、注释 注释: 就是对代码的解释,方便阅读,被注释的代码不执行 分类 单行注释 # 1.单行注释 以#号开头 ,右边的所有东西都被当做说明文字 ,程序不进行编译运行。 print(hello world)多行注释 # 2.多行注释 三个单引号 或…

学习日记(刷题,学java)

先看看题目 给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 示例 1&…

Chapter 4 :Constraining I/O Delay(ug903)

4.1 About Constraining I/O Delay 要在设计中准确地建模外部时序上下文,必须为输入和输出端口提供时序信息。由于XilinxVivado集成设计环境(IDE)只能识别FPGA边界内的时序,因此必须使用以下命令来指定超出这些边界的延迟…

Linux 系统文件权限管理(参考菜鸟教程)

一、查看文件用户,用户组,其他用户的文件权限,属主,属主用户组等信息 ls -l如图所示:  1、第一个字符代表这个文件是目录、文件或链接文件等等。 当为 d 则是目录当为 - 则是文件;若是 l 则表示为链接…

SpringBoot+Shiro+Jwt+Vue+elementUI实现前后端分离单体系统Demo

记录一下使用SpringBoot集成Shiro框架和Jwt框架实现前后端分离Web项目的过程,后端使用SpringBoot整合ShiroJwt(auth0),前端使用vueelementUI框架,前后端的交互使用的是jwt的token,shiro的会话关闭,后端只需要使用Shiro…

Sqlmap Tamper 编写/改写 学习

sqlmap的 --tamper 参数可以引入用户自定义的脚本修改注入时的payload ,达到sql注入时对一些敏感字符的一些绕过 下载 sqlmap 自带的 tamper 脚本就在 /sqlmap/tamper 目录下,是用 python 编写的,所以我们可以用 python 语言自己编写一些脚本…

bismark和bsmap比对原理

1,bismark比对方法比较简单粗暴,它制作两种类型的基因组:1),将所有的C转化为T的基因组;2),将所有的G转化为A的基因组。它将bisulfate(重chong硫酸盐)处理后的…

【Kafka】面试题总结

Kafka 1、什么是消息队列2、消息队列有什么用3、Kafka 的多分区以及多副本机制有什么好处呢4、Zookeeper 在 Kafka 中的作用知道吗5、Kafka 如何保证消息的消费顺序6、Kafka 如何保证消息不丢失7、Kafka 如何保证消息不重复消费7、Kafka为什么快/吞吐量大 1、什么是消息队列 我…

【JavaScript】对象继承精华提炼

继承机制 每个函数都有一个prototype属性,指向一个对象,该对象是原型对象;构造函数生成实例时,该属性会自动成为实例对象的原型;原型对象上的所有属性和方法,都能被实例对象共享继承;原型对象的…

使用HALCON标定板快速标定,纠正成像畸变

使用HALCON标定板快速标定,纠正成像畸变 1生成标定板描述文件 gen_caltab (7, 7, 0.00375, 0.5, caltab.descr, caltab.ps)gen_caltab ( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : ) 为具有矩形排列标记的标定板生成标定板描述文…

Linux环境下安装RocketMQ(单机、集群)

目录 前置要求: 一、下载RocketMQ 二、上传解压 三、配置rocketmq的环境变量 四、查看rocketmq的目录结构 五、启动 5.1 启动nameserver 5.2 启动broker 六、测试发送消息 七、关闭 八、RocketMQ集群搭建 8.1 RocketMQ集群模式介绍 8.2 搭建 8.2.1 准…

海康机器视觉Visionmaster-VM3D常见问题及解决方法

软件及环境问题 第一个问题:软件获取问题 官网获取 第二个问题:环境配置类问题 1.软件打不开,加密狗灯不亮,6报错:加密狗未检测到或异常。解决方法:安装3DVM的驱动。 安装后加密狗无法识别&#xff0c…