使用DVCS进行RDBMS审计跟踪

时间:2011-06-17 01:55:15

标签: python git mercurial rdbms audit-trail

我正在寻找一个相当复杂的关系数据库的审计跟踪,它的架构很容易改变。我正在考虑的一个途径是使用DVCS来跟踪变化。

(我能想象的好处是:无模式历史,整个系统状态的快照,分析,回放和迁移的标准工具,高效存储,独立系统,保持数据库清洁。数据库不会重写历史不是一个核心特征,更多的是为了拥有审计线索。哦,我喜欢尝试疯狂的新方法解决问题。)

我不是这些系统的专家(我只有基本的git熟悉程度),所以我不确定实施起来有多困难。我正在考虑采用mercurial的方法,但可能将文件内容/清单/更改集存储在键值数据存储中,而不是使用实际文件。

数据行将序列化为json,每个“文件”可以是一行。或者,整个表可以存储在“文件”中,每行驻留在行号上等于其主键(假设表不是太大,我希望所有行都少于4000行。这个可能意味着可以自动生成更改集,而无需查询表“文件”的其余部分。

(但我对此表示怀疑,因为我认为我们需要整个文件的SHA-1哈希。这些文件可能会被可预测的行数分开,例如文件1中的0 < primary key < 1000 ,文件2中的1000 < primary key < 2000等,使它们变小;

是否有人熟悉DVCS的内部结构或一般数据结构可能能够评论这样的方法?它怎么可能成功,甚至应该完成呢?

我想这样的系统有两个方面:1)将SQL数据映射到DVCS系统; 2)将DVCS数据存储在键/值数据存储(而不是文件)中以提高效率。

(注意,json序列化位由我的ORM覆盖)

3 个答案:

答案 0 :(得分:2)

我自己对此进行了一些调查,这里有一些评论要分享。

虽然我曾经想过使用python中的mercurial会让事情变得更容易,但是DVCS的许多功能都不是必需的(特别是分支,合并)。我认为简单地窃取一些设计决策并为我的需求实现一个基本系统会更容易。所以,这就是我想出来的。

<强>斑点

系统对要记录的记录进行json表示,并生成一个SHA-1哈希(a&#34;节点ID&#34;如果愿意的话)。此哈希表示在给定时间点记录的状态,与git&#34;&#34; blob&#34;相同。

<强>变更

更改分组为变更集。变更集会记录一些元数据(时间戳,提交者等)以及指向任何父变更集和当前&#34;树的链接&#34;。

<强>树

而不是使用Mercurial&#34; Manifest&#34;方法,我已经去了git&#34;树&#34;结构体。树只是blob(模型实例)或其他树的列表。在顶层,每个数据库表都有自己的树。然后,下一级可以是所有记录。如果有很多记录(经常有),它们可以分成子树。

这样做意味着如果您只更改一条记录,则可以单独保留未触动的树木。它还允许每个记录拥有自己的blob,这使得事情更容易管理。

<强>存储

我喜欢Mercurial的revlog想法,因为它允许您最小化数据存储(仅存储变更集)并同时保持快速检索(所有变更集都在相同的数据结构中)。这是按记录完成的。

我认为像MongoDB这样的系统最适合存储数据(它必须是键值,我认为Redis过于专注于将所有内容保存在内存中,这对于存档并不重要)。它将存储变更集,树和revlog。当前HEAD等的一些额外键和系统已完成。

因为我们正在使用树,所以我们可能不需要将外键明确地链接到确切的&#34; blob&#34;它指的是。仅仅使用主键就足够了。我希望!

使用案例:1。存档更改

一旦进行了更改,记录的当前状态就会被序列化为json,并为其状态生成哈希值。这是针对所有其他相关更改完成的,并打包到变更集中。完成后,将更新相关的revlog,使用新对象(&#34; blob&#34;)哈希生成新的树和子树,并且变更集已被提交&#34;与元信息。

使用案例2.检索旧状态

找到相关的变更集(MongoDB搜索?)之后,遍历树,直到找到我们正在寻找的blob ID。我们转到revlog并检索记录的状态或使用可用的快照和变更集生成它。然后,用户必须确定是否还需要检索外键,但这样做很容易(使用我们开始使用的相同变更集)。

<强>摘要

这些操作都不应该太昂贵,我们对数据库的所有更改都有空间有效的描述。存档与生产数据库分开保存,允许它执行其操作并允许随时间更改数据库模式。

答案 1 :(得分:0)

如果数据库没有写入(如你所说),为什么不以实现目标的方式实现实际的数据库表?例如,添加“版本”列。然后永远不要更新或删除行,除了这个特殊列,您可以将其设置为NULL表示“当前”,1表示“已知最早的”,然后从那里上升。如果要更新行,请将其版本设置为下一个更高版本,然后插入一个没有版本的新版本。然后在查询时,只需选择空版本的行。

答案 2 :(得分:0)

看看cqrs和Greg Young的活动采购。我还有一篇关于在meta事件中工作的博客文章,它指出了商业事件河流中的模式变化。

http://adventuresinagile.blogspot.com/2009/09/rewind-button-for-your-application.html

如果您查看我的博客,您还可以找到版本脚本方案,您可以使用源代码控制这些方案。