mysql 事件日志存储在 MongoDB 中好吗?
Is it good to store mysql event logs in MongoDB?
在我们的数据库设计早期,我们使用为每个 table 创建授权字段,几个重要字段是:
created_by
created_time
created_by_ip
updated_by
updated_time
updated_by_ip
现在,是一个无模式设计的时代。我们更喜欢 mongodb 或其他一些只写数据库。
My question here is:
Is it a good practise to maintain logs in a separate database?
Do we need to create separate log table for each mysql tables considering mongodb or is it okay to have single mongodb audit table for
all mysql tables?
What things need to be considered in querying the results from mongodb?
What should be the structure for mongodb table structure?
Any other alternatives to store logs?
考虑如果我们想在指定时间(最多 48 小时)内未通过身份验证的情况下删除注册用户的情况。
如果所有时间日志都在mongodb中处理。我们如何从 mysql?
查询相同的内容
您通常希望此(审计?)数据紧挨着真实数据,绝对不在不同的数据库引擎中,因为要支持的部分错误的数量变得非常噩梦(例如有人注册,但您未能插入审计数据 - 这样可以吗?帐户应该变成孤儿帐户吗?如果应用程序中途宕机会怎样?)。
具有这种分离的系统通常使用消息传递,并且 2 个不同的侦听器负责存储数据和存储审计(例如,一个在关系数据库中,另一个在事件存储中)。通过这种方式,您有更高的机会实现最终一致性。
编辑
关于使用消息传递有几个选项,这里的假设是两个数据源必须同步(或尽可能接近)。请记住,我仍然认为存储数据+审计是迄今为止最简单和更明智的做法。
使用消息传递,您的应用程序可以在特定事件(例如用户创建的事件)上发出消息。然后 2 个不同的听众对此消息做出反应。一个监听器将数据存储在一个数据库引擎中;另一个监听器存储审计数据。这种方法的问题是您可能需要确保消息的顺序,这使得它真的很慢。
另一种(可怕的)方法是在 MySQL 和消息系统之间使用分布式 (XA) 事务(因为 mongo 不支持事务)。然后 MySQL 的数据和消息一起提交,监听器可以接收审计数据并将其存储在 mongo.
我需要强调的是,上述 2 种方法很糟糕,不应该永远实施。
还有更明智的方法,但可能需要不同的技术堆栈。例如,使用 EventSourcing+CQRS,您可以存储事件(带有审计数据)并存储没有审计数据的最终读取模型。
在我们的数据库设计早期,我们使用为每个 table 创建授权字段,几个重要字段是:
created_by
created_time
created_by_ip
updated_by
updated_time
updated_by_ip
现在,是一个无模式设计的时代。我们更喜欢 mongodb 或其他一些只写数据库。
My question here is:
Is it a good practise to maintain logs in a separate database?
Do we need to create separate log table for each mysql tables considering mongodb or is it okay to have single mongodb audit table for all mysql tables?
What things need to be considered in querying the results from mongodb?
What should be the structure for mongodb table structure?
Any other alternatives to store logs?
考虑如果我们想在指定时间(最多 48 小时)内未通过身份验证的情况下删除注册用户的情况。
如果所有时间日志都在mongodb中处理。我们如何从 mysql?
查询相同的内容您通常希望此(审计?)数据紧挨着真实数据,绝对不在不同的数据库引擎中,因为要支持的部分错误的数量变得非常噩梦(例如有人注册,但您未能插入审计数据 - 这样可以吗?帐户应该变成孤儿帐户吗?如果应用程序中途宕机会怎样?)。
具有这种分离的系统通常使用消息传递,并且 2 个不同的侦听器负责存储数据和存储审计(例如,一个在关系数据库中,另一个在事件存储中)。通过这种方式,您有更高的机会实现最终一致性。
编辑
关于使用消息传递有几个选项,这里的假设是两个数据源必须同步(或尽可能接近)。请记住,我仍然认为存储数据+审计是迄今为止最简单和更明智的做法。
使用消息传递,您的应用程序可以在特定事件(例如用户创建的事件)上发出消息。然后 2 个不同的听众对此消息做出反应。一个监听器将数据存储在一个数据库引擎中;另一个监听器存储审计数据。这种方法的问题是您可能需要确保消息的顺序,这使得它真的很慢。
另一种(可怕的)方法是在 MySQL 和消息系统之间使用分布式 (XA) 事务(因为 mongo 不支持事务)。然后 MySQL 的数据和消息一起提交,监听器可以接收审计数据并将其存储在 mongo.
我需要强调的是,上述 2 种方法很糟糕,不应该永远实施。
还有更明智的方法,但可能需要不同的技术堆栈。例如,使用 EventSourcing+CQRS,您可以存储事件(带有审计数据)并存储没有审计数据的最终读取模型。