Openstack Swift 中的对象是否立即可用?

Are objects in Openstack Swift immediately available?

OpenStack Swift 允许在集群的多个位置复制和分发对象。

是否保证在 PUT 操作成功后,我可以立即 GET 对象,还是必须等待对象在集群中传播?

根据 documentation:

Suppose a container server is under load and a new object is put in to the system. The object will be immediately available for reads as soon as the proxy server responds to the client with success. However, the container server did not update the object listing, and so the update would be queued for a later update. Container listings, therefore, may not immediately contain the object.

当 PUT 操作 Swift returns 成功时,您可以保证它已写入法定人数(即(numReplicas / 2)+ 1)。例如,使用 3x 副本策略,在确认写入请求之前将写入两个副本。由于一个对象只需要一个副本就可以被读取,该对象立即可用。其余副本在正常对象复制器服务周期内写入,并根据环配置放置。

至于它是否存在于容器列表中,可能会更复杂一些。在 Liberty 版本中,有一个名为 container_update_timeout 的配置设置,默认值为 1。也就是说,如果对象服务器在不到 1 秒的时间内从容器服务获得确认,则更新会同步发生,并保证在成功返回给客户端。但是,如果容器服务花费的时间比这更长,或者如果该值设置得很低(例如 0),那么容器更新将被捆绑在一起并异步提交给容器服务。

这样做是为了提高多区域部署的性能,其中正在更新的容器元数据可能与请求更新的对象服务不在同一个数据中心,甚至不在同一个国家/地区。