1

我正在寻找一些关于监控每天大约 250,000 次插入的特定表的建议。规模不大,但增长迅速,我们不能继续照原样工作。

主要应用程序依赖于带有 MySQL 数据库的 RoR4。数据从许多 radius 服务器直接流入数据库。

我们需要监视特定列的特定值,然后执行简单的查找:

if column == xxx
  venue = Venue.find_by(bar: foo)
  if venue.is_monitored?
    do some other shizzle
  end
end

位置表的大小也不小,所以我不想在每次发生某些事情时都查看数十万行。

有人可以帮助推荐一种快速有效的方法吗?目前在 Rails 中检查每个插入似乎很荒谬。我们还尝试过每 60 秒在后台处理一次作业,但这似乎已经过时了。

到目前为止,最好的解决方案是观察插入的值,将其发布到 Redis 并使用节点服务器来监听事件。然后将其推回 Rails。

抱歉,如果这是主观的或不切实际的,我真的很想有人教我一种美味的方法来做到这一点。

4

1 回答 1

1

将监控转移到 MySQL 怎么样?

您可以使用在您正在监视的表的 UPDATE 和 INSERT 上运行的 TRIGGER。此触发器将执行验证,如果满足条件,它可以:(多种可能性)

  • 拉取方式:将更新/创建的记录的 ID 插入到临时表中,然后您的 Rails 应用程序可以偶尔从该临时表中获取 ID,将其清空,然后对这些特定记录执行所需的操作.
  • 推送方式:触发器使用 MySQLsys_exec()调用执行所需操作的 ruby​​/rails 脚本之一。

请注意,无论哪种方式,您都可能遇到记录在触发器执行之后和 Rails 应用程序执行之前被修改的情况,因此您应该让 Rails 应用程序也验证收到的记录是否满足所有条件。

编辑

你必须仔细计划。推送可能看起来很有吸引力,因为它节省资源并且动作是即时的,但 MySQL 触发器会“一枪毙命”。那么如果 sys_exec() 无法访问您的 Rail 脚本怎么办?(系统崩溃等),因此您的 Rails 应用程序可能无法接收或查看记录。

拉取更安全,因为相关记录的 ID 保存在临时表中,如果有附加内容,Rails 以后仍然可以找到它们。但是动作会延迟几秒钟(这并不总是可以接受的情况),而且更需要资源。

选择是您的,取决于您的要求。

此外,如果您喜欢复杂的解决方案,或者只是如果您需要数据安全性和同时立即采取行动,您可以实现两种解决方案的混合:

  1. 触发器将记录的ID保存在临时表中,并通过sys_exec()调用你的脚本。
  2. 通过 sys_exec 调用,Rails 执行所需的操作,并从临时表中删除相应的记录,因为该操作已完成,我们不再需要它。
  3. 有时,Rails 会检查临时表以确保没有丢失任何记录,如果临时表中仍有记录,您仍然可以对其执行操作。

这涵盖了一切:消耗更少的资源、立即响应以及恢复不可预测的情况。但实施起来比较困难

--

注意:我使用“临时表”一词,但我并不是指 SQL 词汇表中的“临时”,如内存表左右,最好有一个真正的基于磁盘的表来保护它免受系统崩溃。

于 2013-07-30T01:25:37.187 回答