宣布自托管 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
服务器由与 Deno CLI 中烘焙的 Deno KV 实现相同的强大 SQLite 后端支持。这使您能够与用于备份、复制、时间点恢复 (PITR) 等的各种 SQLite 工具集成。
要启动一个独立的 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 或 在此创建问题。
你的应用程序是否需要异步进程或计划未来的工作?
Deno Queues 是一种将可扩展的消息传递和后台处理添加到应用程序的简单方法。