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

时间:2010-04-29 15:49:26

标签: performance berkeley-db

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

最简单的设置是单个进程,只需一个线程,处理单个数据库;使用事务在这一个DB上执行inserted和gets。

备选方案1:单个进程,多个线程,单个DB;这个DB中的insert和gets由进程中的所有线程执行。

  • 使用多个线程是否可以提高性能?有一个单独的DB,因此它在一个磁盘上,因此我猜我不会得到太多的提升。但是如果Berkeley DB在内存中缓存了很多东西,那么也许一个线程可以运行并从缓存中回答而另一个线程阻止等待磁盘?我正在使用GNU Pth,用户级协作线程。我不熟悉Pth的细节,所以我也不确定使用Pth是否可以在另一个用户级别线程被阻止时运行用户级线程。

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

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:0)

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