WAITAOF

用法
WAITAOF numlocal numreplicas timeout
复杂度
O(1)
始于
7.2.0
ACL 类别
@connection, @blocking, @slow

此命令会阻塞当前客户端,直到该客户端之前的所有写入命令被确认为已同步(fsynced)到本地 Valkey 的 AOF,和/或至少已同步到指定数量的副本。

numlocal 表示在继续之前需要确认的本地 fsync 数量。当 numlocal 设置为 1 时,命令会阻塞,直到写入 Valkey 实例的数据被确认为已持久化到本地 AOF 文件。值为 0 会禁用此检查。

如果达到以毫秒为单位指定的超时时间,即使未满足指定数量的确认,命令也会返回。

无论是否达到指定的阈值,以及是否达到超时时间,此命令始终会返回WAITAOF 命令之前,当前客户端发送的所有写入命令已同步(fsynced)到 AOF 的主节点和副本节点的数量。

几点说明

  1. WAITAOF 返回时,当前连接上下文中发送的所有先前写入命令,都保证已同步(fsynced)到由 WAITAOF 返回的至少对应数量的主节点和副本节点的 AOF。
  2. 如果该命令作为 MULTI 事务的一部分(或任何其他不允许阻塞的上下文,例如在脚本内部)发送,则该命令不会阻塞,而是立即返回已同步(fsynced)所有先前写入命令的主节点和副本节点的数量。
  3. 超时设置为 0 意味着永久阻塞。
  4. 由于 WAITAOF 在成功和超时的情况下都会返回已完成 fsync 的数量,因此客户端应检查返回的值是否等于或大于所需的持久化级别。
  5. WAITAOF 不能在副本实例上使用,并且如果本地 Valkey 未启用 AOF,则 numlocal 参数不能为非零值。

限制

可以编写一个模块或 Lua 脚本,将写入传播到 AOF 但不传播到复制流。(对于模块,这通过使用 RedisModule_CallRedisModule_Replicatefmt 参数完成;对于 Lua 脚本,这通过使用 server.set_repl 实现。)

这些功能与当前实现的 WAITAOF 命令不兼容,结合使用它们可能会导致不正确的行为。

一致性与 WAITAOF

请注意,与 WAIT 类似,WAITAOF 并不能使 Valkey 成为一个强一致性存储。除非等待集群的所有成员将写入同步(fsync)到磁盘,否则在故障转移或 Valkey 重启期间仍可能丢失数据。然而,WAITAOF 确实提高了实际数据安全性。

实现细节

即使未配置副本(只要 AOF 存在),Valkey 也会跟踪并增加复制偏移量。

此外,Valkey 副本会异步地向其主节点发送带有两个复制偏移量的 ping:它们在复制流中已处理的偏移量,以及它们已同步(fsync)到其 AOF 的偏移量。

Valkey 会为每个客户端记住在执行该客户端上下文中最后一个写入命令时,所产生的复制流的复制偏移量。当调用 WAITAOF 时,Valkey 会检查本地 Valkey 和/或指定数量的副本是否已确认将此偏移量或更大的偏移量同步(fsync)到其 AOF。

示例

> SET foo bar
OK
> WAITAOF 1 0 0
1) (integer) 1
2) (integer) 0
> WAITAOF 0 1 1000
1) (integer) 1
2) (integer) 0

在上述示例中,第一次调用 WAITAOF 未使用超时,并要求写入仅同步(fsync)到本地 Valkey;完成后它返回 [1, 0]。

在第二次尝试中,我们转而指定了一个超时,并要求由单个副本确认写入已同步(fsync)。由于没有连接的副本,WAITAOF 命令在一秒后解除阻塞并再次返回 [1, 0],表明写入已在本地 Valkey 上同步,但没有副本同步。

RESP2/RESP3 回复

数组回复:该命令返回一个包含两个整数的数组

  1. 第一个是已将当前连接上下文中执行的所有写入同步(fsync)到 AOF 的本地 Valkey 节点数(0 或 1)。

  2. 第二个是已确认完成相同操作的副本数量。