4

我们有一个GDBM键值数据库作为负载平衡的面向 Web 的应用程序的后端,该应用程序是用 C++ 实现的。应用程序提供的数据变得非常庞大,因此我们的管理员已将 GDBM 文件从“本地”存储(在网络服务器上,或非常靠近)移动到大型、共享、远程、NFS 挂载的文件系统。

这影响了性能。我们的性能测试(在测试环境中)显示页面加载时间从数百毫秒(对于本地磁盘)跳跃到几秒(通过 NFS、本地网络),有时甚至高达 30 秒。我相信问题的很大一部分是应用程序从 GDBM 文件中进行了大量随机读取,并且这些读取比 NFS 慢,这在生产中会更糟(前端和后端甚至它们之间的网络硬件更多)并且随着我们的数据库变得更大。

虽然这不是一个关键应用程序,但我想提高性能,并提供一些可用资源,包括应用程序开发人员时间和 Unix 管理员。我的主要限制是时间只有几周的资源。

在我看来,我的选择是:

  1. 通过调整参数提高 NFS 性能。我的直觉是我们不会从中得到太多,但我以前错了,我对 NFS 调优并不是很了解。

  2. 移动到不同的键值对数据库,例如memcachedbTokyo Cabinet

  3. 用其他一些协议替换 NFS(iSCSI 已经提到,但我不熟悉)。

我应该如何解决这个问题?

4

4 回答 4

10

不要太拘泥于“关系与非关系”的比较。似乎与这个问题无关。

您的应用程序跨越的界限是不同的:从本地快速文件存储上的小型数据库到通过网络访问的大型数据库。越过这条线意味着您现在可以更好地使用专用的、网络服务的数据库管理系统。管理服务器是否管理关系数据库与该方面无关。

为了快速启动和运行,MariaDB(MySQL 的继任者)可能是您最好的选择。如果您预见到它的发展会远远超出现在的水平,那么您不妨将它放在PostgreSQL中,因为无论如何它最终都需要去那里 :-)

于 2009-03-29T22:52:08.890 回答
2

这似乎不是你想听到的,但老实说,如果我是你,我会把它扔到一个 mysql 表中。与 GDBM-over-NFS 不同,它并不像使用起来更难,而且您会从中获得很多好处,尤其是实际上针对您的情况的远程访问协议。

于 2009-03-29T21:54:13.973 回答
1

如果您想坚持使用非关系数据库,您可以尝试BDB或 DJB 的CDB。到目前为止我都使用过,我认为在性能方面它们优于 GDBM。

但是请记住 bignose 的回答,因为我也认为您的瓶颈可能不是您正在使用的数据结构 (GDBM),而是您的基础设施。

于 2009-07-13T19:55:32.670 回答
0

通过网络使用平面文件的文件系统 i/o 不是一个好主意,但您应该考虑编写一个多线程的 tcp 服务器来进行 i/o、查询等。在那台机器上,然后将结果返回给您。传输小块数据而不是整个数据库文件..

我正在设计一种缓存持久性机制来克服高可用性问题。我将在 python 中对其进行编码。

于 2011-02-20T16:26:35.243 回答