【问题标题】:how to create multiple logical tables in single levelDB instance?如何在单级数据库实例中创建多个逻辑表?
【发布时间】:2012-09-15 00:52:11
【问题描述】:

我正在开发一个分布式键值系统(或数据存储),它在后端使用 levelDB 作为其嵌入式数据库库。

我希望一个节点/机器托管多个表(出于复制和负载平衡的目的)。我知道 levelDB 没有表的概念,所以我不能以表的形式对我的数据进行逻辑分区(因此不能将这些表用作我的基本分布单位)。

我的问题是:是否规定在 levelDB 的单个实例中拥有多个“逻辑表”?

据我所知,我可以在我的节点上运行多个 levelDB 实例,每个实例处理一个表。但我不想这样做,因为在这种情况下,当同时访问这些多个数据库实例时,会出现严重的争用(我相信在磁盘上)。虽然在单个 DB 实例中拥有多个逻辑表可以为我提供 levelDB 优化的优势,以最大限度地减少磁盘访问。

【问题讨论】:

    标签: key-value-store leveldb


    【解决方案1】:

    如果您想在 LevelDB 中拥有多个“逻辑表”,那么您必须对您的键空间进行分区或为键添加前缀。为每个表创建不同的前缀,例如:

    0x0001 is for table 1
    0x0002 is for table 2
    0x0003 is for table 3
    and so on...
    

    因此,键将由表前缀和键本身组成:[0x0001,0xFF11] 将寻址表 1 中的键 0xFF11。然后您可以使用单个 LevelDB 实例并拥有多个“键空间”,它们对应于“表”。

    【讨论】:

    • 是的.. 看起来这是唯一的方法。我想过为每个平板电脑使用一个文件系统目录,但显然如果您打开多个目录(使用 Open(options,, &db)),只有最后一个目录用于数据存储。
    • 无论如何,open 方法并没有为每个目录(或打开操作)提供唯一的 DB 处理程序。
    • 我不知道你是如何设法用一个 LevelDB 实例打开多个目录的......所以我不知道你的意思是“只有最后一个目录用于数据存储。 "如果需要多个目录,则需要使用多个 LevelDB 实例。
    • 因为 open() 没有为多个目录抛出任何错误。我“假设”所有传递给 open 的目录都将被存储以保存数据 感谢您的回复。我最终决定使用多个levelDB 实例 .. 这让事情变得更加简单。
    【解决方案2】:

    您最好的选择是使用 Lirik 建议的键前缀对键空间进行分区。尽管可以打开多个数据库,但我不建议您将其用于您的用例,因为数据库不会共享任何缓冲区和缓存。使用多个打开的数据库可能会对性能产生负面影响,并且会使优化资源使用(主要是内存)变得更加困难。

    【讨论】:

    • @Wouter.. 是的,我完全同意你的观点。不仅缓冲区和缓存不会那么有效,而且磁盘可能会因为处理多个数据库实例而变得疯狂。我现在正在为我的系统使用多个实例,但在将其投入生产之前,我将使用密钥前缀方法。谢谢。
    • Fwiw,我的 Plyvel 项目为此提供了一个非常好的 API。请参阅plyvel.readthedocs.org/en/latest/user.html#prefixed-databases 了解更多信息。如果您不使用 Python,您可能仍然对它的工作原理感兴趣(并且您可以复制它的实现)。
    猜你喜欢
    • 2013-04-14
    • 2017-05-06
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多