跳转到主要内容

键/值存储

项目描述

Python中支持多个后端的键/值存储实现。

一个键(str)可以看起来像

  • 0123456789abcdef…(通常是一个长,十六进制编码的哈希值)

  • 任何其他纯ASCII字符串,不包含“/”,“..”或“ ”。

命名空间

为了区分内容,键应该使用命名空间前缀,例如

  • config/settings

  • meta/0123456789abcdef…

  • data/0123456789abcdef…

请注意

  1. 您应该始终使用命名空间。

  2. 不支持嵌套命名空间,如namespace1/namespace2/key。

  3. 代码可以在没有命名空间(命名空间“”)的情况下工作,但之后您无法添加另一个命名空间,因为那时您已经创建了嵌套命名空间。

值可以是任何任意二进制数据(字节)。

存储操作

高级存储API实现透明地处理嵌套和软删除,因此调用者不必太关心这一点,后端API可以更简单。

  • 创建/销毁:初始化或删除整个存储。

  • 列表:给定命名空间中项目的平坦列表,带或不带软删除项目。

  • 存储:将新的项目写入存储(提供其键/值对)。

  • 加载:从存储中读取值(提供其键),支持部分加载,提供偏移量和/或大小。

  • 信息:通过其键获取有关项目的信息(存在?大小?…)。

  • 删除:立即从存储中删除项目(提供其键)。

  • 移动:实现重命名、软删除/恢复删除、移动到当前嵌套级别

  • 统计:API调用计数器、API方法消耗时间、数据量/吞吐量

  • 延迟/带宽模拟器:可以模拟比后端实际提供的更高的延迟(通过BORGSTORE_LATENCY [us])和更低的带宽(通过BORGSTORE_BANDWIDTH [bit/s])。

自动嵌套

对于存储用户,项目名称例如:

命名空间/0123456789abcdef… 命名空间/abcdef0123456789…

如果命名空间中有非常多项目,这可能导致后端可扩展性问题,因此存储实现提供透明嵌套,使得后端API内部调用时名称例如:

命名空间/01/23/56/0123456789abcdef… 命名空间/ab/cd/ef/abcdef0123456789…

嵌套深度可以从0(=无嵌套)配置到N级别,并且根据命名空间可以有不同的嵌套配置。

存储支持在同一个命名空间中同时以不同的嵌套级别运行。

软删除

要软删除一个项目(以便其值仍然可以读取或可以恢复),存储只需重命名项目,将其名称追加“.del”。

恢复删除通过从名称中删除“.del”后缀来实现。

一些存储操作有一个布尔标志“deleted”,用于选择是否考虑软删除的项目。

后端

后端API相对简单,只需提供一些非常基本的操作。

目前,这些存储后端已经实现

  • POSIX文件系统(命名空间:目录,值:键命名的文件)

  • SFTP(通过sftp访问服务器,命名空间:目录,值:键命名的文件)

  • Rclone - 访问Rclone支持的100多个云提供商(更多可能在未来推出)

  • (更多可能在未来推出)

可扩展性

  • 存储在命名空间中的键/值对的数量:自动嵌套为键提供,以解决常见的可扩展性问题。

  • 键大小:对于非常长的键(例如:超过后端限制),没有特殊规定。通常这不会是问题。

  • 值大小:对于处理大值大小(例如:超过空闲内存,超过后端存储限制等),没有特殊规定。如果处理非常大的值,通常在存储到存储之前将它们切割成块。

  • 部分加载通过避免仅需要值的一部分时进行完整加载来提高性能(例如,包含元数据的标题)。

想要一个演示吗?

运行以下命令以获取运行演示的说明

python3 -m borgstore

本项目状态

API仍然不稳定,并预计在开发过程中会发生变化。

不会有涉及开发/测试版本的数据迁移工具,例如例如从alpha1升级到alpha2或从beta13升级到发布。

有一些测试并且它们已经成功通过基本功能,因此一些功能已经运行良好。

可能缺少功能或优化潜力,欢迎反馈!

有许多可能的后端仍然缺失(例如,例如云存储)。如果您想创建并支持一个:欢迎pull requests。

Borg?

请注意,此代码目前用于BorgBackup(也称为“borg”)的稳定版本,而只用于borg2 beta 10+和master分支。

许可证

BSD许可证。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

borgstore-0.0.5.tar.gz (20.8 kB 查看哈希值)

上传时间 源码

支持者