如何备份 JetStream 服务器中的所有流?

How to backup all streams in JetStream server?

问题:

我必须备份我的 JetStream 服务器的所有流。我不知道那里有什么溪流。我想将所有流备份到一个快照中。目前,我们只能使用以下命令备份单个流。

$ nats stream backup <stream-name> /backup/dir/<stream-name>.tgz

目前我尝试过的:

我试过提供通配符而不是 <stream-name>。没用。

$ nats stream backup * /backup/dir/backup.tgz
nats: error: "*" is not a valid stream name, try --help

可能的解决方法:

首先,我可以使用 nats str ls 命令列出所有流。然后,我可以遍历所有流并单独备份它们。

但是,这不能满足我的要求,因为我想将所有流备份到一个快照中。我的快照应该代表 JetStream 服务器的完整状态,而不是单个流。

[编辑,因为现在有更好的方法通过新功能来做到这一点]

更新后的答案:

您可以使用 nats account backup [<flags>] <directory to create the backup in>

备份一个帐户的所有流

原回答:

是的,创建一个脚本来使用 nats stream ls 捕获所有当前定义的流的列表,然后使用 nats stream backup 在循环中备份它们是您能做的最好的事情。

无法同时创建所有流的单个 'frozen at a point in time' 完整备份,因为:

  • NATS 和 JetStream 在备份过程中继续运行
  • NATS 和 JetStream 是分布式系统:服务器和流相互独立

创建此类备份的唯一方法是同步暂停所有流及其源主题上的所有写入(消息的发布或消费),执行备份(这可能需要相当长的时间),以及然后允许对流进行操作并恢复。许多(大多数?)nats 用户无法接受这种服务中断。