持久数据库状态策略

时间:2012-02-28 18:49:15

标签: python backup backup-strategies

由于经过多次修改,这个问题可能会变得有点不连贯。我道歉。

我正在编写一个Python服务器。它永远不会看到超过4个活跃用户,但我是计算机科学专业的学生,​​所以无论如何我都在计划。

目前,我即将实现一个功能,将所有相关变量的当前状态备份保存到CSV文件中。在那些我目前有10个,他们永远不会真的很大,但......好吧,计算机科学专业学生等等。

所以,我现在正在考虑两件事:

  1. 何时运行备份?
  2. 什么样的备份?
  3. 何时开始:

    我可以在每次变量更改时运行备份,这样做的好处是始终在备份中具有当前状态,或类似每分钟一次,这样做的好处是不会每分钟重写文件数百次如果服务器忙碌,但如果我没有实现自上次备份以来哪些变量发生了变化的检测,那么会产生大量无用的相同数据重写。

    与此直接相关的问题是我应该做什么样的备份

    我可以对所有变量进行完整备份(如果我每次变量都运行备份,那么这是没有意义的,但如果我每隔X分钟运行一次备份就可能会很好),或者是完整备份单个变量(如果我每次变量更改时都会更好,但会涉及多个备份功能或者当前备份的变量的智能检测),或者我可以尝试某种变量-backup on the files(这可能涉及读取当前文件并用更改重写它,所以它可能非常愚蠢,除非在Python中有一个我不知道的技巧)。

    我不能使用shelves因为我希望数据可以在不同的编程语言之间移植(例如java,可能无法打开python架子),而且我不能因为不同的原因使用MySQL,主要是那台机器那个将运行服务器没有MySQL支持,我不想使用外部MySQL服务器,因为我希望服务器在互联网连接断开时继续运行。

    我也知道有几种方法可以使用python和/或其他软件的预实现函数(例如sqlite)来实现这一点。我自己只是建立这些东西的忠实粉丝,不是因为我喜欢重新发明轮子,而是因为我想知道我使用的东西是如何工作的。我正在构建这个服务器,仅仅是为了学习python,虽然知道如何使用SQLite是有用的,但我也喜欢自己做“脏工作”。

    在我的使用场景中,每天可能会有一些请求,我倾向于“备份变更”的想法,但如果由于某种原因,服务器真的出现了,那很快就会崩溃,真的忙。

    所以,我的问题基本归结为:在这种情况下哪种备份方法最有用,我是否可能错过了另一种备份策略?您如何决定在您的应用程序中使用哪种策略?

    请注意,我提出这个问题主要是出于对备份策略及其背后的想法的一般好奇心,而不是因为这个特殊情况下的问题。

2 个答案:

答案 0 :(得分:2)

使用sqlite。您要求使用csv文件构建持久存储,以及如何在更改时更新文件。您要求的是一个轻量级,可移植的关系(如基于表格)数据库。 Sqlite非常适合这种情况。

自2.5版以来,Python在标准库中使用sqlite3模块支持sqlite。由于sqlite数据库是作为单个文件实现的,因此在机器上移动它们很简单,而且Java有a number of different ways与sqlite交互。

我是为了学习而做的事情,但如果你真的想学习数据持久性,我不会嫁给自己想要“csv数据库”。我将首先查看Persistence的维基百科页面。你在想什么基本上是你的数据的“系统图像”。维基百科的文章描述了您提到的这种方法的一些缺点:

  

保存最后一张图像后对系统所做的状态更改将丢失   在系统故障或关机的情况下。为每个人保存图像   单个更改对于大多数系统来说太耗时了

我认为你不应该在每次改变时尝试更新你的州批发,而是考虑一些其他形式的持久性。例如,某种journal可以很好地运作。这使得将任何更改附加到日志文件或某些类似构造的末尾变得简单。

但是,如果您最终有许多并发用户,并且进程在多个线程上运行,您将会关注您的更改是否为atomic,或者它们是否相互冲突。虽然操作系统通常有一些方法可以处理锁定文件以进行编辑,但是您正在开辟一堆蠕虫,试图了解它是如何工作的并与您的系统进行交互。此时你又需要一个数据库了。

当然,请尝试几种不同的方法。但是,只要您希望以明确和一致的方式使其工作,请使用sqlite。

答案 1 :(得分:1)

如果您的数据是CSV文件,为什么不在这些文件上使用修订控制系统?例如。 git会很快,并且会有很好的历史。存储库将完全包含在文件所在的目录中,因此很容易处理。您还可以轻松地将该存储库复制到其他计算机或目录。