0

我们想实现一种应用程序架构,其中我们在磁盘上有大量数据库,每个客户一个数据库文件。

当用户请求进入数据库时​​(如果尚未打开)。

在一段时间没有活动后,数据库会被服务器自动关闭,从而释放数据库服务器资源。

使用这种架构,我们应该能够在磁盘上拥有大量数据库,但在任何时候都只能将其中的一部分加载到数据库服务器中。

问题是很少有数据库似乎支持自动关闭数据库的概念。似乎 MIcrosoft SQL Server 可能允许这样做,但我们正在使用所有开源技术,因此 SQL Server 不是一个选项。

我们会考虑任何免费或开源的数据库技术,但我看不到任何支持自动关闭功能的技术。

有谁知道有什么不同吗?

更新:寻找基于 Linux 而不是 Windows 的解决方案。

谢谢

4

5 回答 5

1

你确定这真的是一个问题吗?我只提到因为开放数据库的成本可能很小,特别是“开放”很可能包括同步等待数据库的所有未完成的事务,并进行基本的一致性检查(特别是加载几页存储的数据)在磁盘上)。

一旦完成,没有活动,服务器上就不需要维护很多数据了。

如果您考虑一下,数据库系统最基本的功能就是使用内存管理数据库页面的缓存。当对一条数据发出请求时,系统会定位它所在的实际页面,并检查 RAM 以查看它是否已加载。如果没有,它会从磁盘加载它。

如果您还注意到,大量的数据库“元”数据存储在数据库中。这意味着当系统想知道任何事情时,它会有效地使用自己来定位信息,特别是数据页面缓存子系统。

像任何其他缓存一样,当数据过期并且不再需要时,它会被刷新回磁盘并在必要时重新获取。

因此,这意味着一旦数据库“打开”,维护其状态所需的任何信息都可能通过数据缓存子系统进行维护,并且对于未使用的数据库,将其释放回磁盘以为当前流量腾出空间。

这就是为什么我很好奇您是否测试过您的候选数据库以查看您是否遇到了有关此问题的问题,或者数据库是否甚至具有“打开数据库”的概念。

当我们作为客户端讨论这个问题时,重点往往是与数据库服务器的连接。但是一旦所有这些都关闭,我认为系统不会在内存中保留任何大量关于非活动特定数据库的数据。

毕竟,数据库中的所有(ALL)数据都存储“相同”,表是表是表,索引是索引是索引,特别是在管理所有数据页面的中央服务器上作为一个单一的大数据“汤”。

您可能遇到的唯一问题是,如果您的数据库碰巧专门为每个数据库创建了一个文件,并且该文件保持打开状态。最终你可能会用完文件描述符。

但是大多数现代系统不这样做,它们将所有内容存储在一大堆文件中,而不管它们位于哪个数据库或模式中(当然,除非您进行特定的表空间分配或服务器允许)。

所以,本质上,我不认为这是一个问题,因为我认为现代数据库并没有真正做出你在内部谈论的那种区别。多个数据库或模式是系统内的逻辑工件,而不是技术实现,并且所有数据页最终都位于同一个缓存中并使用相同的资源,而不管它们来自什么模式、数据库、表或索引.

我会对您选择的数据库进行一些测试,看看这是否是一个问题。例如,您可以创建 1M 个数据库,尽可能降低数据库的内存,然后开始循环浏览它们,一次打开多个您认为合适的(10、100、1000,等等),看看是否你有任何问题。

最后,对于任何特定的数据库,我都不“知道”任何这些,这只是对历史数据库如何实现的直觉。

于 2010-01-30T23:31:55.147 回答
0

我知道您可能有足够的客户来处理文件句柄不足的过程。数据库连接池怎么样?

当用户请求到达时,查看该用户的数据库是否已打开。如果是这样,请使用连接并重置上次访问标志的时间

如果该用户的数据库未打开,请打开连接,设置上次访问时间,然后使用连接(如果没有可用连接,则抛出错误)。此外,fork 一个进程/线程/轻量级进程/在您的环境中调用它来检查:

如果池中有足够数量的未使用连接,则线程完成

如果没有,请扫描最旧的最后访问的 5%-25%,或在最后一分钟/小时/天未使用的那些(适合您的用户请求模式的任何内容)并关闭它们,移动到未使用的池

确保在未使用的池中保留足够的可用连接来处理传入请求。

于 2010-01-30T23:50:50.007 回答
0

我假设“关闭数据库”是指他们会释放缓存内存?因为“关闭”磁盘上的实际文件确实没有任何好处,所以它们的资源使用可以忽略不计。

一些数据库引擎使用操作系统的磁盘缓存。MySQL 的 MyISAM 存储引擎就是一个例子,但不提供完整性保证,因此排除了它的许多用途。然而,MySQL 的其他引擎(如 InnoDB)不提供此功能。

PostgreSQL 原生使用操作系统的缓存作为二级缓存;虽然一级缓存 (shared_buffers) 仍然一直在消耗内存,但通常将其设置为仅占内存的 10-25%,即使在性能关键的服务器上也是如此。其余的对于操作系统级别的缓存是免费的,并且会在需要时分配给数据库,并在需要时可供其他应用程序使用。

于 2010-05-05T00:39:10.250 回答
0

我有这个想法并假设您使用的是 Windows:

  1. 您的数据库将作为服务运行,每个客户端都有自己唯一的服务名称。
  2. 您编写一个批处理文件,它将启动/停止该服务。
  3. 批处理文件将在您需要时从您的服务器调用。
于 2010-01-30T22:33:23.407 回答
0

mySql 有一个 cron 作业。

此外,mySql 的占用空间非常小(与 Sql Server 相比)......一个例子是它不占用内存(是的,我知道可以限制 Sql Server 内存使用量)。

mySql 也有连接池,非常有效和有用。

于 2010-01-30T23:17:39.100 回答