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 中的新参数组?