我一直在阅读swift的架构文档( http://docs.openstack.org/developer/swift/overview_architecture.html )。 我半知道“戒指”是什么,但我想我错过了一些细节。
在我看来,当一个对象被放入存储器时,客户端连接到一个服务器,该服务器以某种方式find一个环。 然后,它将数据写入设备,并以某种方式更新一个环(可能),以说明已写入的内容以及在哪里(文档说存储服务器本身不会修改环,所以我猜中间有一个服务器池注意更新铃声并将其推送到存储服务器)。 看来,sqlite数据库被用来存储对象ID和位置之间的映射。 然后,sqlite数据库与群集周围的对象一起被复制。
对于GET操作,客户端向服务器发出请求,该服务器以某种方式知道在哪里find将该特定对象ID映射到物理位置的数据库。 然后使用代理服务器连接来检索对象并将其返回给客户端。
如果我有这个权利,在我看来,到物理位置的SQLite“环”映射对象ID被复制到至less3个节点,所以不是整个群集。 那么当检索对象时,系统如何知道在哪里find包含对象ID到位置的映射的“环”数据库? 也许这存储在一个“账户”环,但是同样的问题适用 – 面向公众的服务器连接到哪个子系统找出哪些节点包含需要检索/删除的实际对象?
这是一个非常好的页面,描述数据的存储位置: https : //julien.danjou.info/blog/2012/openstack-swift-consistency-analysis
基本上,环中创build了一堆分区,并将分区分配给设备。 存储对象时,会为对象创build一个散列值,并用于查找要存储的分区。 然后将其放置在基于分区的设备上,存放在与对象的分区和哈希值对应的目录中。
因此,当您需要检索对象时,会再次对其进行散列,查找分区,然后直接转到包含它的任何一个存储设备(通常是最近的存储设备)的位置。
上面的页面更详细地解释。