我们希望实现一种应用程序架构,其中磁盘上有大量数据库,每个客户都有一个数据库文件。
当用户请求进入时,数据库被打开(如果尚未)。
在没有活动的一段时间后,服务器会自动关闭数据库,从而释放数据库服务器资源。
使用这种架构,我们应该能够在磁盘上拥有大量数据库,但只有一部分数据库可以随时加载到数据库服务器中。
问题是很少有数据库似乎支持自动关闭数据库的概念。似乎MIcrosoft SQL服务器允许这样做但我们使用所有开源技术,因此不能选择SQL服务器。
我们会考虑任何免费或开源数据库技术,但我看不到任何支持自动关闭功能。
任何人都知道有什么不同吗?
更新:寻找基于Linux而非Windows的解决方案。
由于
答案 0 :(得分:1)
您是否确定这确实是一个问题?我只提到,因为开放数据库的成本可能很小,特别是“开放”最有可能包括同步等待数据库的任何未完成的事务,并进行基本的一致性检查(特别是加载存储的几页数据)在磁盘上。)
一旦完成,没有活动,服务器上就不会有很多数据需要维护。
如果您考虑一下,数据库系统的最基本功能是管理带内存的数据库页面的缓存。当对一条数据发出请求时,系统会将实际页面置于其上,并检查RAM以查看它是否已加载。如果没有,它会从磁盘加载它。
如果您还注意到,大量的DB“meta”数据都存储在数据库中。这意味着当系统想知道任何事情时,它会有效地使用自己来定位信息,特别是数据页面缓存子系统。
与任何其他缓存一样,由于数据已过期且不再需要,它会刷新回磁盘并在必要时重新获取。
因此,这意味着一旦数据库被“打开”,维护其状态所需的任何信息都可能通过数据缓存子系统维护,而对于未使用的数据库,则释放回磁盘以为当前流量腾出空间
这就是为什么我很好奇你是否已经测试了你的候选DB,看看你是否遇到过这个问题,或者数据库是否有“打开数据库”的概念。
作为客户,当我们讨论这个问题时,重点往往是与数据库服务器的连接。但是一旦所有这些都关闭了,我认为系统不会保留任何大量关于非活动的特定数据库的内存数据。
毕竟,数据库中的所有(ALL)数据都存储“相同”,一个表是一个表是一个表,索引是一个索引是一个索引,特别是在中央服务器上所有的数据页面作为数据的一大“汤”进行管理。
您可能遇到的唯一问题是,您的数据库是否恰好为每个数据库创建了一个文件,并且该文件仍处于打开状态。最终你可能会用完文件描述符。
但是大多数现代系统都没有这样做,它们将所有内容都存储在一大块文件中,而不管它们所处的数据库或模式是什么(当然,除了您所做的特定表空间分配或服务器允许的情况) )。
所以,基本上,我不认为这是一个问题,因为我不认为现代数据库真的会产生你内心所说的那种区别。多个数据库或模式是系统内的逻辑工件,而不是技术实现,并且所有数据页最终都在同一个缓存中并使用相同的资源,而不管它们来自哪个模式,数据库,表或索引
我会对您选择的数据库进行一些测试,看看这是否有问题。例如,您可以创建1M数据库,尽可能地为数据库降低内存,然后只是开始循环访问它们,打开多个您认为合适的时间(10,100,1000,无论如何)并查看是否你有任何问题。
最后,对于任何特定的数据库,我都不“知道”这一点,它只是对历史数据库如何实现的直觉。
答案 1 :(得分:0)
我有这个想法并假设您使用的是Windows:
答案 2 :(得分:0)
带有cron作业的mySql。
此外,mySql的占用空间非常小(与Sql Server相比)......例如,它不会占用内存(是的,我知道可以限制Sql Server的内存使用量。)
mySql也有连接池,非常高效和有用。
答案 3 :(得分:0)
我知道您可以有足够的客户来处理文件句柄的过程。如何建立数据库连接池?
当用户请求到达时,查看该用户的DB是否已打开。如果是,请使用连接并重置上次访问标志的时间
如果该用户的DB未打开,请打开连接,设置上次访问时间并使用连接(如果没有可用连接,则抛出错误)。此外,在您检查的环境中分叉进程/线程/轻量级进程/您调用它的任何内容:
如果池有足够数量的未使用连接,则线程已完成
如果没有,请扫描最旧的最后一次访问的5%-25%,或最后一分钟/小时/天未使用的那些(适用于您的用户请求模式)并关闭它们,移动到未使用的池< / p>
确保在未使用的池中保留足够的可用连接以处理传入的请求。
答案 4 :(得分:0)
我认为通过“关闭数据库”你的意思是他们会释放他们的缓存?因为“关闭”磁盘上的实际文件确实没有任何好处,所以它们的资源使用量可以忽略不计。
某些数据库引擎使用操作系统的磁盘缓存。 MySQL的MyISAM存储引擎就是一个例子,但不提供完整性保证,因此排除了它的许多用途。但是,像InnoDB这样的MySQL其他引擎并没有这样做。
PostgreSQL本身使用操作系统的缓存作为二级缓存;虽然第一级缓存(shared_buffers)仍然一直消耗内存,但即使在性能关键型服务器上,也常常将其设置为内存的10-25%。其余的可用于操作系统级缓存,并在需要时分配给数据库,并在需要时可供其他应用程序使用。