宣布自托管 Deno KV、持续备份和副本
当我们首次发布 Deno KV 时,开发者们被这款专为 JavaScript 打造的零配置、强一致性和全局复制数据库的前景所吸引。仅用一行代码即可为服务器、函数和应用程序添加状态的概念广受欢迎。
const kv = await Deno.openKv();
随着我们通过 TTL、远程连接到托管数据库、用于降低延迟的读取副本和 Deno Queues 等功能扩展 Deno KV,潜在的供应商锁定问题也随之出现。我们理解这种担忧的重要性。Deno 有意基于 Web 标准 构建。这与我们的理念相符:了解 Deno 意味着了解 Web,这使您能够触达超过十亿的互联网用户。
为了践行我们对灵活性和开放性的承诺,我们很高兴推出这些新功能,使您能够以最适合您需求的方式利用 Deno KV。
此版本标志着我们在提供通用且强大的数据库解决方案方面迈出了重要一步。它可以针对任何环境进行定制,从云原生应用程序到本地部署。
denokv
自托管 Deno KV
使用 Deno KV 目前有两种形式
- 内置于 Deno 运行时,由进程内运行的 SQLite 提供支持,适用于测试、开发和单服务器生产用例
- 托管在 Deno Deploy 上,由 FoundationDB 提供支持,具有无缝扩展和全局复制功能,适用于生产应用程序和企业用例
今天,我们宣布第三种使用 Deno KV 的方式,专为喜欢自托管数据库的用户而设:一个独立的 denokv
二进制文件,您可以在自己的服务器上运行它,并通过 KV Connect 从 Deno CLI 连接到它。与 Deno 本身一样,此二进制文件是 开源 的,采用 MIT 许可证,并且永久免费使用。
独立的 denokv
服务器由相同的强大 SQLite 后端提供支持,该后端为内置于 Deno CLI 中的 Deno KV 实现提供动力。这使您能够与各种 SQLite 工具集成,以进行备份、复制、时间点恢复 (PITR) 等。
要启动独立的 denokv
服务器,只需执行单个 docker
命令。这会将本地文件夹挂载到容器中以存储数据库,并在 https://127.0.0.1:4512
上托管 KV Connect 端点以进行连接。
$ export DENO_KV_ACCESS_TOKEN=$(openssl rand -base64 15)
$ docker run -it --init -p 4512:4512 -v ./data:/data ghcr.io/denoland/denokv --sqlite-path /data/denokv.sqlite serve --access-token $DENO_KV_ACCESS_TOKEN
Opened database at /data/denokv.sqlite
Listening on http://0.0.0.0:4512
然后,您可以像往常一样使用 Deno.openKv
进行连接
const kv = await Deno.openKv("https://127.0.0.1:4512");
await kv.set(["users", "alice"], {
name: "Alice",
birthday: new Date(2018, 5, 13),
});
const { value } = await kv.get(["users", "alice"]);
console.log(value);
如果您有兴趣尝试,我们创建了 在 Fly.io 上运行独立 denokv
服务器的指南。
请注意,与我们在 Deno Deploy 上的托管服务 不同,当使用独立的
denokv
二进制文件时,您完全负责备份、复制、扩展和高可用性。我们建议您配置 Litestream 或 LiteFS 等工具,以持续备份denokv
使用的 SQLite 数据库。
持续备份到 S3 或 GCS
我们很高兴地宣布,从今天开始,您可以将托管在 Deno Deploy 上的 Deno KV 数据库中存储的数据持续复制或备份到您自己的 S3 或 Google Cloud Storage 存储桶中。这是对我们为托管 Deno KV 数据库中存储的所有数据执行的内部持续备份的补充,以确保高可用性和数据持久性。
这种复制持续进行,延迟非常小,从而实现时间点恢复和实时复制。启用此复制解锁了各种有趣的用例
- 检索过去任何时间点的数据库一致快照
- 运行独立于 Deno Deploy 的只读数据副本
- 通过将突变管道传输到 Kafka、BigQuery 和 ClickHouse 等流平台和分析数据库中,将数据推送到您喜爱的数据管道中
您只需几个步骤即可在 Deno Deploy 上设置复制。我们有一份深入的指南,引导您完成 S3 和 Google Cloud Storage 存储桶的流程,请参阅文档。
一旦您的复制目标处于“活动”状态,复制即为最新状态,并且 Deno KV 数据库的一致副本将存储在存储桶中。在“活动”状态下,新的突变会持续实时写入存储桶,以保持副本为最新状态。
但是现在,您如何从存储桶中读取数据呢?
自托管 Deno KV 副本
这就是今天第三个新功能发挥作用的地方:自托管托管在 Deno Deploy 上的 Deno KV 数据库的副本。为此,我们将再次使用之前的 denokv
工具,并带有 --sync-from-s3
标志。这将创建 S3 存储桶中数据的本地副本,持续同步并使本地副本与存储桶中的数据保持同步。
$ export AWS_REGION=us-east-1
$ export AWS_ACCESS_KEY_ID=your-access-key
$ export AWS_SECRET_ACCESS_KEY=your-secret-key
$ export DENO_KV_ACCESS_TOKEN=$(openssl rand -base64 15)
$ denokv --sqlite-path=./data.sqlite3 serve --sync-from-s3 --s3-bucket your-bucket --s3-prefix some-prefix/6aea9765-2b1e-41c7-8904-0bdcd70b21d3/
Initial snapshot is complete, starting sync.
Listening on http://localhost:4512
现在您可以使用 Deno.openKv
连接到本地服务器
const kv = await Deno.openKv("https://127.0.0.1:4512");
const { value } = await kv.get(["users", "alice"]);
console.log(value);
这是一个只读副本。不支持
kv.set()
等写入操作。
除了远程数据库的一致快照外,本地副本还包含自添加 S3 备份目标以来数据库的完整历史记录。这可以用于时间点恢复:查看数据库在过去任何时间点的数据的能力。
时间点恢复
本地数据库的初始同步完成后,您可以使用子命令 denokv pitr list
列出所有可恢复点
$ denokv --sqlite-path=./data.sqlite3 pitr list
0100000002d0fa520000 2023-11-09T10:37:23.935Z
0100000002d0fa510000 2023-11-09T10:37:23.935Z
0100000002d0fa500000 2023-11-09T10:37:23.935Z
0100000002c0f4c10000 2023-11-09T09:19:00.603Z
0100000002c0f4c00000 2023-11-09T09:19:00.603Z
0100000002b0ef310000 2023-11-09T09:15:32.815Z
要检出特定的可恢复点,请首先停止当前在此数据库上运行的所有 denokv serve --sync-from-s3
进程。然后,运行 denokv pitr checkout
$ denokv --sqlite-path=./data.sqlite3 pitr checkout 0100000002b0ef310000
Snapshot is now at versionstamp 0100000002b0ef310000
您现在可以重新启动 denokv serve
,这次使用 --read-only
标志而不是 --sync-from-s3
标志。现在,所有连接到此数据库的客户端都将看到时间戳为 2023-11-09T09:15:32.815Z
时的数据。
请注意,denokv serve
的 --sync-from-s3
标志会自动同步并保持检出最新的快照,因此如果您已检出特定的版本时间戳,则不应显式指定此标志。
下一步是什么
Deno KV 以及 Deno Queues、Web 标准 API 和 npm 是使 Web 开发更轻松、更快速、更高效的关键构建块。我们不断迭代以添加功能,使使用 Deno 构建变得更好,并且未来会有更多功能推出。
我们始终乐于接受反馈和功能请求!请随时加入我们不断壮大的 Discord 社区,或者在此处创建 issue。
您的应用是否需要异步进程或计划将来的工作?
Deno Queues 是一种将可扩展的消息传递和后台处理添加到您的应用程序的简单方法。