- 用法
-
WAITAOF numlocal numreplicas timeout
- 复杂度
- O(1)
- 始于
- 7.2.0
- ACL 类别
- @connection, @blocking, @slow
- 当
WAITAOF
返回时,当前连接上下文中发送的所有先前写入命令,都保证已同步(fsynced)到由WAITAOF
返回的至少对应数量的主节点和副本节点的 AOF。 - 如果该命令作为
MULTI
事务的一部分(或任何其他不允许阻塞的上下文,例如在脚本内部)发送,则该命令不会阻塞,而是立即返回已同步(fsynced)所有先前写入命令的主节点和副本节点的数量。 - 超时设置为 0 意味着永久阻塞。
- 由于
WAITAOF
在成功和超时的情况下都会返回已完成 fsync 的数量,因此客户端应检查返回的值是否等于或大于所需的持久化级别。 WAITAOF
不能在副本实例上使用,并且如果本地 Valkey 未启用 AOF,则numlocal
参数不能为非零值。-
第一个是已将当前连接上下文中执行的所有写入同步(fsync)到 AOF 的本地 Valkey 节点数(0 或 1)。
-
第二个是已确认完成相同操作的副本数量。
此命令会阻塞当前客户端,直到该客户端之前的所有写入命令被确认为已同步(fsynced)到本地 Valkey 的 AOF,和/或至少已同步到指定数量的副本。
numlocal
表示在继续之前需要确认的本地 fsync 数量。当 numlocal
设置为 1 时,命令会阻塞,直到写入 Valkey 实例的数据被确认为已持久化到本地 AOF 文件。值为 0 会禁用此检查。
如果达到以毫秒为单位指定的超时时间,即使未满足指定数量的确认,命令也会返回。
无论是否达到指定的阈值,以及是否达到超时时间,此命令始终会返回在 WAITAOF
命令之前,当前客户端发送的所有写入命令已同步(fsynced)到 AOF 的主节点和副本节点的数量。
几点说明
限制
可以编写一个模块或 Lua 脚本,将写入传播到 AOF 但不传播到复制流。(对于模块,这通过使用 RedisModule_Call
或 RedisModule_Replicate
的 fmt
参数完成;对于 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 回复
数组回复:该命令返回一个包含两个整数的数组