![OpenStack 的对象存储(swift)如何知道在哪里找到对象?](https://linux22.com/image/609854/OpenStack%20%E7%9A%84%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%EF%BC%88swift%EF%BC%89%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E5%9C%A8%E5%93%AA%E9%87%8C%E6%89%BE%E5%88%B0%E5%AF%B9%E8%B1%A1%EF%BC%9F.png)
我一直在阅读 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
基本上,在环中创建一堆分区,并将分区分配给设备。存储对象时,会为该对象创建一个哈希值,并使用该哈希值查找将其存储在哪个分区。然后根据分区将其放置在设备上,位于与分区和对象的哈希值相对应的目录中。
因此,当您需要检索对象时,它会再次对其进行散列,查找分区,然后直接转到包含该对象的任何一个存储设备上的位置(通常是最近的位置)。
上面的页面解释得更详细。