5 个版本

0.2.4 2023年12月23日
0.2.3 2023年12月23日
0.1.0 2023年9月23日

#492 in 数据库接口

每月 43 次下载

MPL-2.0 和可能 GPL-3.0-only

11MB
200K SLoC

C 192K SLoC // 0.3% comments Rust 4.5K SLoC // 0.0% comments Python 2.5K SLoC // 0.2% comments Shell 220 SLoC // 0.1% comments Jupyter Notebooks 188 SLoC // 0.2% comments JavaScript 97 SLoC // 0.1% comments C++ 10 SLoC TypeScript 1 SLoC

DDCP

通过 Veilid 的数据库到数据库复制(DDCP)。

没有服务器,没有云。没有神,没有主人。

什么是 DDCP?

DDCP(数据库到数据库复制)是两件事

  • A Git-like CLI for VLCN's CR-SQLite。
  • A Rust-native networking layer, which coordinates VLCN database changes among remote peers.

两者都通过 Veilid 运行,以实现简单、私有和安全的点对点网络,并具有强大的加密身份。

我为什么要使用 DDCP?

快速开发本地优先分布式应用程序。去除 API 的样板代码和 yak-shaving,专注于数据。

将传统的 RDBMS 应用程序转换为本地优先,无需围绕低级 CRDTs 重新设计架构。

我如何使用它?

DDCP 仍处于开发初期,但已经非常有趣。以下是您可以用它做什么

初始化 SQLite 数据库

ddcp init

这将为您的数据库注册 Veilid DHT 公钥。

2023-09-27T16:50:03.646448Z  INFO ddcp: Registered database at DHT key="VLD0:73iT7NuqplS2nab1AH4P7lJYiQROR_k4NyUhag_K4DY"

发布它

ddcp serve
2023-09-27T16:50:36.319921Z  INFO ddcp: Serving database at DHT key="VLD0:73iT7NuqplS2nab1AH4P7lJYiQROR_k4NyUhag_K4DY"
2023-09-27T16:50:36.321171Z  INFO ddcp: Database changed, updated status db_version=2 key="VLD0:73iT7NuqplS2nab1AH4P7lJYiQROR_k4NyUhag_K4DY"

此过程必须保持在后台运行,以便远程节点能够从该数据库检索更改。

此过程还会打印 Veilid 公钥,供您的同伴使用。

填充它

在数据库中创建一些 VLCN CRRs(无冲突复制的关联)。这可以在 DDCP 运行并发布数据库时完成。更改将由远程订阅者自动获取。

ddcp shell < fixtures/cr_tables.sql
ddcp shell < fixtures/ins_test_schema_alice.sql

复制它

添加要同步的远程节点数据库

ddcp remote add alice 73iT7NuqplS2nab1AH4P7lJYiQROR_k4NyUhag_K4DY

前缀 VLD0: 是可选的。

在发布更改的同时,自动将远程更改应用到本地数据库。

ddcp serve
2023-09-27T17:01:30.615367Z  INFO ddcp: Pulled changes from remote database remote_name="alice" db_version=5

VLCN 注意事项

CRRs 有一定的限制,才能按预期工作,甚至根本无法工作

  • CRRs 的更改必须在加载 crsqlite.so 扩展之后发生。运行 ddcp shell 会为您自动完成此操作。但在使用 cr-sqlite 从其他应用程序时,请记住这一点。
  • 节点必须共享公共模式才能复制更改。VLCN 支持模式迁移。
  • 复制在主键上发生。避免自动递增主键,这些键无法很好地合并。更喜欢强大的内容标识符或类似于 UUID 的随机大键。

开发

OCI 图像

可能是评估 DDCP 的最简单方法。基于 Debian Bookworm 构建 OCI 图像。

docker build -t ddcp .

用法

docker run -v $(pwd)/data:/data ddcp:latest init
docker run -v $(pwd)/data:/data ddcp:latest remote add alice 73iT7NuqplS2nab1AH4P7lJYiQROR_k4NyUhag_K4DY
cat fixtures/cr_test_schema.sql | docker run -v $(pwd)/data:/data -i ddcp:latest shell
docker run -v $(pwd)/data:/data ddcp:latest pull

Nix

DDCP目前构建在Nix flake devshell中。如果您使用Nix,

nix develop
cargo build

其他平台

这可能可能工作,如果已经安装了编译器和开发库

# Install serde tooling; used in cargo build (for now)
./scripts/install_capnproto.sh
./scripts/install_protoc.sh

cargo build --release

您也可以尝试 cargo install ddcp,但构建仍然需要安装serde工具。

路线图

DDCP仍然是一个技术预览。线路协议、模式和API都是不稳定的,可能会进行破坏性更改。

DDCP仍需改进的几个领域

私有共享

DHT地址目前公开可访问;如果您知道地址,就可以从数据库中检索。这对于数据集的公开分发(博客、“任何人都可以编辑”等)是可以的,但不适用于私有应用程序。

支持认证DHT的共享。

更改集过滤和转换

更多关于如何合并更改的控制。在某些用例中,您希望将所有对等方的更改合并到一致的状态中。在其他用例中,您可能希望保持对等方的内容分离但相互链接。支持这些不同同步模式的原语。crsql_changes上的过滤器和转换。身份验证和授权(谁可以更改或检索什么)。

大更改集

克服app_call消息大小限制。目前对此没有检查,因此发送大型更改集(如猫的照片)可能会以不受控制的方式失败。Veilid消息通常限制在32k。

32k可能足以存放一行没有大型列数据。大型列数据可能需要引用块存储,如PostgreSQL的Toast。

缺少Veilid功能

用DHT更改的监控代替轮询(据我所知目前尚未实现)。

Veilid块存储集成准备就绪时。

一些应用程序

关于可以共享的数据类型的思想

  • 分布式BBS
  • 书签和链接共享
  • 网络扫描结果
  • 远程传感器聚合
  • 代码托管以将此项目从Git**b推出

关于

名称从UUCPNNCP中汲取灵感。

Veilid核心集成的一些内容来自vldpipe中的示例。

依赖关系

~46–84MB
~1.5M SLoC