3

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

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

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

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

4

2 回答 2

9

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

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

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

于 2012-09-19T22:30:15.280 回答
2

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

于 2012-11-07T07:52:52.340 回答