Я читал архитектурную документацию для swift (http://docs.openstack.org/developer/swift/overview_architecture.html). Я наполовину понимаю, что такое «кольца», но мне кажется, что мне не хватает некоторых деталей.
Мне кажется, что когда объект помещается в хранилище, клиент подключается к серверу, который каким-то образом находит кольцо. Затем он записывает данные на устройство и каким-то образом обновляет кольцо (возможно), чтобы сказать, что было написано и где (в документах говорится, что серверы хранения не изменяют сами кольца, поэтому я предполагаю, что есть центральный пул серверов, который позаботьтесь об обновлении колец и отправке их на серверы хранения). Кажется, что базы данных sqlite используются для хранения сопоставления между идентификаторами объектов и местоположениями. Затем базы данных sqlite реплицируются вместе с объектами в кластере.
Для операции GET клиент делает запрос на сервер, который каким-то образом знает, где найти базу данных, отображающую этот конкретный идентификатор объекта в физическое местоположение. Затем он подключается с помощью прокси-сервера, чтобы получить объект и вернуть его клиенту.
Если у меня есть это право, мне кажется, что идентификаторы объектов сопоставления sqlite «кольцо» с физическими местоположениями реплицируются как минимум на 3 узла, а не на весь кластер. Итак, как система при извлечении объекта узнает, где найти «кольцевую» базу данных, которая содержит сопоставление идентификатора объекта с местоположением? Возможно, это хранится в кольце «учетных записей», но тогда возникает тот же вопрос - к какой подсистеме подключается общедоступный сервер, чтобы узнать, какие узлы содержат фактические объекты, которые необходимо получить / удалить?
Вот действительно хорошая страница, описывающая, где хранятся данные: https://julien.danjou.info/blog/2012/openstack-swift-consistency-analysis
В основном в кольце создается группа разделов, которые назначаются устройствам. Когда объект сохраняется, для него создается хеш-значение, которое используется для поиска раздела, в котором его хранить. Затем он размещается на устройстве на основе раздела в каталогах, соответствующих разделу и хеш-значению объекта.
Поэтому, когда вам нужно получить объект, он снова хеширует его, просматривает раздел, а затем переходит прямо к месту на любом из устройств хранения, которое его содержит, обычно ближайшем.
Страница выше объясняет более подробно.