宣布自托管 Deno KV、持续备份和副本
当我们首次宣布 Deno KV 时,开发者们被一个为 JavaScript 精心打造的零配置、强一致性、全球复制数据库的承诺所吸引。只需一行代码即可为服务器、函数和应用程序添加状态的概念受到了广泛好评。
const kv = await Deno.openKv();
随着我们扩展 Deno KV 并加入了诸如 TTL、到托管数据库的远程连接、用于降低延迟的只读副本 以及 Deno 队列 等功能,潜在的供应商锁定问题浮出水面。我们理解这一担忧的重要性。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 后端提供支持。这使您能够与广泛的 SQLite 工具集成,用于备份、复制、时间点恢复 (PITR) 等。
要启动独立的 denokv
服务器,只需执行一个 docker
命令。这会将本地文件夹挂载到容器中以存储数据库,并在 https://: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://: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://: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 队列、Web 标准 API 和 npm,是使 Web 开发更轻松、更快速、更高效的关键构建模块。我们正在不断迭代以添加功能,使使用 Deno 进行构建变得更好,并且未来还有更多功能推出。
我们始终欢迎反馈和功能请求!欢迎随时 加入我们不断壮大的 Discord 或 在此处创建问题。
您的应用程序需要异步进程或计划未来的工作吗?
Deno 队列 是一种为您的应用程序添加可扩展消息和后台处理的简单方法。