AWS RDS 到 AWS ES

Posted

技术标签:

【中文标题】AWS RDS 到 AWS ES【英文标题】:AWS RDS to AWS ES 【发布时间】:2018-03-09 14:14:19 【问题描述】:

要求:在插入/更新特定表时创建数据流并将其推送到弹性搜索。

Thought AWS RDS(MariaDb) ----- 插入/更新到用户表 ---> AWS Kinesis 流 -- 使用 AWS Lambda--> AWS ES

问题如何在插入/更新到特定表时创建运动流?我可以通过 AWS Lambda 完成吗?

【问题讨论】:

您在RDS中使用的数据库是什么? @Ashan 数据库:mariadb 【参考方案1】:

如果您使用的是 Amazon Aurora,则可以这样做。

Amazon Aurora 的最新更新之一是支持从存储过程调用 Lambda 函数。

因此,为了实现您的要求,您可以创建一个 SQL 触发器,该触发器调用一个 SQL 存储过程,然后调用一个 Lambda 函数,将该数据发送到 Elastic Search。

参考:Invoking a Lambda Function from an Amazon Aurora DB Cluster

关于交易的注意事项

正如@Ahmad Nabil 在comments below 中指出的,触发器可以在事务提交之前执行。所以调用 Lambda 的 SQL 触发器可能不是你想要的。


如果您不使用 Aurora,而是使用 mysql 或 MariaDB,如果此功能对您的应用程序非常重要,我建议您切换。

如果您使用的是 Aurora、MySQL 或 MariaDB 以外的数据库,则必须重新考虑您的应用程序以将数据并行写入 RDS 和 ElasticSearch。我还推荐以下架构模式:

Event Sourcing CQRS An example showing the above two patterns

【讨论】:

如果你用过或者对SQL很了解,建议补充一点。例如,我不知道mysql.lambda_async 是什么或在哪里,或者我应该如何处理它。使用CALL mysql.lambda_async ( ... ) 向db 发出请求以激活或在每次写入时? @Solo 什么、在哪里以及如何使用它都记录在提供的链接中。 mysql.lambda_async 过程是一个异步调用 Lambda 函数的内置存储过程。” 请注意,使用极光触发器调用 lambda 在处理事务时会导致严重问题,因为触发器可以在事务提交之前执行 @NoelLlevares 我自己实际测试了这个,例如,如果你在posts 表上创建了“AFTER INSERT”触发器,然后你做了一个事务,该事务插入到多个表中,包括posts 表,触发器将是即使事务回滚,在该表上插入后立即执行。通常这不会导致任何问题,因为如果事务失败,触发器也会回滚,但在我们的例子中,触发器正在调用 lambda 函数,其效果不会回滚。 @NoelLlevares 还有一个article 比我更好地解释了这个问题。【参考方案2】:

我尝试使用 Amazon Aurora 触发器来调用 lambda 函数,但这在使用事务时导致了一些问题,因为可以在事务提交之前执行触发器

所以我最终做的是修改应用程序层以在与向数据库发送数据相同的“事务”中异步调用 lambda 函数, 该 lambda 函数将序列化的 JSON 作为输入(来自应用层),然后将该输入发送到 elasticsearch。

如果该 lambda 函数出现故障,您可以重试并使用 DLQ(死信队列)来确保数据不会丢失并真正进入 elasticsearch。

【讨论】:

以上是关于AWS RDS 到 AWS ES的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 AWS 胶水分析 RDS 数据库并使用 ETL 将分析的数据存储到 rds mysql 表中吗

使用 Sqoop 将表从 AWS RDS 移动到 AWS EMR 的问题

Rails 部署到 AWS ElasticBeanstalk/RDS 失败

如何使用 Terraform 自动切换到 AWS 的 RDS 中的新参数组?

将 CSV 导入到 postgreSQL 中的表中,忽略重复项 - 亚马逊 AWS/RDS

Laravel 使用 Lambda 迁移到 AWS RDS