键/值存储
项目描述
Python中支持多个后端的键/值存储实现。
键
一个键(str)可以看起来像
0123456789abcdef…(通常是一个长,十六进制编码的哈希值)
任何其他纯ASCII字符串,不包含“/”,“..”或“ ”。
命名空间
为了区分内容,键应该使用命名空间前缀,例如
config/settings
meta/0123456789abcdef…
data/0123456789abcdef…
请注意
您应该始终使用命名空间。
不支持嵌套命名空间,如namespace1/namespace2/key。
代码可以在没有命名空间(命名空间“”)的情况下工作,但之后您无法添加另一个命名空间,因为那时您已经创建了嵌套命名空间。
值
值可以是任何任意二进制数据(字节)。
存储操作
高级存储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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1a01e1ea9e24bfacc63ecfbaec101a5ae263a39e14b7d8aa75913a1b01f3a695 |
|
MD5 | 25413320f3541b9528a97307a1efefdd |
|
BLAKE2b-256 | 34273fac7f2107db735feea4f2c7554288ff668eee42c1de122a74862d071f93 |