部署高性能 Berkeley DB 系统的最佳实践

Posted

技术标签:

【中文标题】部署高性能 Berkeley DB 系统的最佳实践【英文标题】:Best practices for deploying a high performance Berkeley DB system 【发布时间】:2010-04-29 15:49:26 【问题描述】:

我希望使用 Berkeley DB 创建一个简单的键值存储系统。密钥将是 SHA-1 哈希,因此它们位于 160 位地址空间中。我有一个简单的服务器工作,这很容易,这要归功于 Berkeley DB 网站上写得很好的文档。但是,我对如何最好地建立这样一个系统,以获得良好的性能和灵活性有一些疑问。希望有人对 Berkeley DB 有更多经验并可以帮助我。

最简单的设置是一个进程,一个线程,处理一个数据库;使用事务在这个数据库上执行插入和获取。

方案一:单进程、多线程、单DB;进程中的所有线程都在此数据库上执行插入和获取。

使用多线程是否可以大大提高性能?有一个数据库,因此它在一个磁盘上,因此我猜我不会得到太多的提升。但是如果 Berkeley DB 在内存中缓存了很多东西,那么也许一个线程能够运行并从缓存中响应,而另一个线程阻塞等待磁盘?我正在使用 GNU Pth,用户级协作线程。我不熟悉 Pth 的细节,所以我也不确定使用 Pth 是否可以在另一个用户级线程阻塞的情况下运行一个用户级线程。

备选方案 2:单个进程、一个或多个线程、多个 DB,其中每个 DB 覆盖 160 位密钥地址空间的一小部分。

我看到了拥有多个 DB 的一些优点:我们可以将它们放在不同的磁盘上,减少争用,如果我们想这样做的话,更容易将 DB 移动/分区到不同的物理主机上。有没有人有这种设置的经验并看到显着的好处?

备选方案 3:多个进程,每个进程都有一个线程,每个进程处理一个数据库,该数据库覆盖了 160 位密钥地址空间的一小部分。

这有使用多个 DB 的优点,但我们使用的是多个进程。这比第二种选择更好吗?我怀疑使用进程而不是用户级线程来获得并行性会让你获得更好的 SMP 缓存行为(更少的无效等),但是我会因为所有进程开销和上下文切换而被杀死吗?

我很想知道是否有人尝试了这些选项,并看到了积极或消极的结果。

谢谢。

【问题讨论】:

【参考方案1】:

备选方案 2 为您提供了高可扩展性。您基本上将数据库分区 多台服务器。如果您需要高性能的分布式键/值数据库,我会 建议看membase。我现在正在这样做,但我们需要在设备上运行 并希望限制依赖项(membase)。 您可以使用 BerkeleyDB 复制,并通过服务器拥有只读副本以提供读取/获取服务 请求。

【讨论】:

以上是关于部署高性能 Berkeley DB 系统的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

优化 Berkeley DB 中的 Put 性能

系统性能提升利刃 | 缓存技术使用的实践与思考

Java Berkeley DB 读取性能与 100M 文档

多线程应用程序中的 Berkeley DB

如何在不记录/写入 __db.00x 文件的情况下使用 Berkeley Db 事务?

Hibernate 性能最佳实践?