本页介绍 R2 的一致性模型,包括 R2 在哪些方面具有强全局一致性,以及哪些操作适用。
与其他分布式对象存储系统相比,R2 可以描述为"强一致"。这种强一致性确保对 R2 的操作能看到最新(准确)的状态:客户端应能立即、全局地观察到任何写入、更新和/或删除操作的效果。
在 R2 的上下文中,强一致性和最终一致性具有以下含义:
- 强一致 - 操作的效果将被全局、立即地被所有客户端观察到。客户端不会观察到"陈旧"(不一致)的状态。
- 最终一致 - 客户端可能不会立即看到操作的效果。状态可能需要一些时间(通常为几秒到一分钟)才能全局传播。
对 R2 存储桶和对象的操作遵循以下一致性保证:
| Action | Consistency |
|---|---|
| 写后读:写入(上传)对象,然后读取 | 强一致:读取者将立即在全球范围看到最新对象 |
| 元数据:更新对象的元数据 | 强一致:读取者将立即在全球范围看到更新的元数据 |
| 删除:删除对象 | 强一致:对该对象的读取将立即返回"不存在"错误 |
| 对象列表:列出存储桶中的对象 | 强一致:列表操作将列出该时间点的所有对象 |
| IAM:添加/移除 R2 Storage 权限 | 最终一致:新建或更新的 API 密钥 可能需要最多一分钟才能在全球范围反映权限 |
其他说明:
- 如果两个客户端同时写入(
PUT或DELETE)同一键,最后完成的写入者"获胜"。 - 执行分片上传时,所有分片成功上传后,写后读一致性仍然适用。如果同一分片被多个写入者(错误地)上传,最后一次写入将获胜。
- 在同一存储桶内复制对象也遵循与新对象写入相同的写后读一致性。复制操作完成后,所有客户端可以立即读取"复制的"对象。
- 要删除 R2 存储桶,必须先完全清空才能删除。如果您尝试删除仍包含对象的存储桶,将收到如下错误:
The bucket you tried to delete (X) is not empty (account Y)或Bucket X cannot be deleted because it isn't empty.有关清空和删除存储桶的说明,请参阅删除存储桶。
当将自定义域名连接到 R2 存储桶并为从该存储桶提供的对象启用缓存时,通过启用了缓存的域名访问内容时,一致性模型必然有所放宽。
具体而言,您应预期:
- 您从 R2 删除但仍在缓存中的对象仍然可用。如果需要反映删除操作,您应清除缓存。
- 默认情况下,Cloudflare 的缓存会自动缓存 HTTP 404(Not Found)响应。如果您向同一路径上传对象,缓存可能继续返回 HTTP 404,直到缓存 TTL(Time to Live)过期并从 R2 获取新对象,或清除缓存。
- 给定键的对象被新对象覆盖:旧(先前)对象将继续提供给客户端,直到缓存 TTL 过期(或对象被逐出),或清除缓存。
缓存不影响通过 Worker API 绑定 或 S3 API 的访问,因为这些操作直接针对存储桶进行,不经过缓存。