OpenStack 的对象存储(swift)如何知道在哪里找到对象?

OpenStack 的对象存储(swift)如何知道在哪里找到对象?

我一直在阅读 swift 的架构文档(http://docs.openstack.org/developer/swift/overview_architecture.html)我一半明白“环”的用途,但我认为我遗漏了一些细节。

在我看来,当一个对象被放入存储中时,客户端会连接到服务器,该服务器会以某种方式找到一个环。然后它将数据写入设备并以某种方式更新环(可能)以说明已写入的内容和位置(文档说存储服务器本身不会修改环,所以我猜有一个中央服务器池负责更新环并将其推送到存储服务器)。似乎使用 sqlite 数据库来存储对象 ID 和位置之间的映射。然后,sqlite 数据库与群集周围的对象一起复制。

对于 GET 操作,客户端向服务器发出请求,服务器以某种方式知道在哪里可以找到将特定对象 ID 映射到物理位置的数据库。然后,它使用代理服务器进行连接以检索对象并将其返回给客户端。

如果我理解正确的话,我认为将对象 ID 映射到物理位置的 sqlite“环”至少复制到 3 个节点,而不是整个集群。那么系统在检索对象时如何知道在哪里找到包含对象 ID 到位置映射的“环”数据库?也许它存储在“帐户”环中,但同样的问题也适用 - 面向公众的服务器连接到哪个子系统来找出哪些节点包含需要检索/删除的实际对象?

答案1

这是一个非常好的页面,描述了数据存储的位置: https://julien.danjou.info/blog/2012/openstack-swift-consistency-analysis

基本上,在环中创建一堆分区,并将分区分配给设备。存储对象时,会为该对象创建一个哈希值,并使用该哈希值查找将其存储在哪个分区。然后根据分区将其放置在设备上,位于与分区和对象的哈希值相对应的目录中。

因此,当您需要检索对象时,它会再次对其进行散列,查找分区,然后直接转到包含该对象的任何一个存储设备上的位置(通常是最近的位置)。

上面的页面解释得更详细。

相关内容