Введение

BitVault — это распределенная система хранения, адресуемая по содержимому, разработанная Microsoft Research в Китае. BitVault использует одноранговую технологию для распределения задач хранения и управления данными. Таким образом, в системе отсутствует центральный орган управления. Вместо этого она самоорганизуется, обеспечивая высокую доступность, надежность и масштабируемость с минимальными административными затратами, которые остаются практически неизменными независимо от размера распределенной сети. Система BitVault оптимально подходит для хранения эталонных данных – больших объемов информации, которые изменяются крайне редко. К таким данным относятся архивы устаревшей информации, а также мультимедийные данные, такие как музыка и видео, которые, несмотря на частое использование, меняются очень редко.

Технология

Каждый участвующий равноправный узел в архитектуре BitVault – это Smart Brick, представляющий собой упрощенный ПК с большими дисками. Все Smart Bricks в системе BitVault соединены высокоскоростной сетью с низкой задержкой. Систему BitVault можно легко масштабировать – любой компьютер можно настроить для работы в качестве Smart Brick, просто установив программное обеспечение BitVault и подключив его к сети, без необходимости прерывать работу уже существующих узлов. BitVault хранит неизменяемые объекты данных, то есть объекты, которые нельзя изменить. Физическое местоположение объектов не фиксировано и может находиться на любом из Smart Bricks. Его местоположение меняется в зависимости от частоты доступа; объект может быть даже реплицирован на нескольких Smart Bricks. Чтобы решить проблему изменения местоположения, BitVault обеспечивает доступ к объекту посредством 160-битного ключа, уникального для каждого объекта. Система динамически определяет местоположение, откуда объект можно получить наиболее эффективно, используя этот ключ, и делает объект доступным. Уникальный ключ генерируется на основе хеша данных объекта, что делает систему адресуемой по содержимому, а не по местоположению. Хеши объектов (ключи) сопоставляются с физическими адресами с помощью хеш-таблиц, которые управляются системой автоматически и не требуют вмешательства пользователя. Различные группы узлов поддерживают различные наборы хеш-таблиц, относящиеся только к данным в этой группе узлов, тем самым формируя накладную сеть, в которой местоположение данных отслеживается с помощью архитектуры распределенной хеш-таблицы (DHT).

Архитектура

Архитектура BitVault состоит из нескольких блоков, которые формируют логическое 160-битное адресное пространство, каждый из которых связан с хешем определенных данных. Эта связь поддерживается в распределенной хеш-таблице (DHT). DHT разделяет всю хеш-таблицу на более мелкие хеш-таблицы. Например, если имеется n узлов, хеш-таблица будет разделена на n хеш-таблиц, каждая из которых начинается со строки, следующей за концом предыдущей. Каждый DHT имеет связанный с ним блок, а область логического адресного пространства, за которую отвечает блок, называется его зоной. Блоки взаимодействуют друг с другом, используя одноранговую (peer-to-peer) технологию, через уровень членства и маршрутизации (MRL). Поиск любого объекта данных может выполняться n блоками параллельно, в пределах своей зоны, обеспечивая эффективность O(log N). В системе BitVault хранится несколько копий одного объекта, называемых репликами, для обеспечения достаточной избыточности. Если какой-либо индекс поврежден, ближайшая реплика может быть уведомлена о необходимости его восстановления. И если индекс обнаруживает повреждение реплики, он может инициировать восстановление реплики. Этот метод восстановления ошибок называется моделью восстановления, управляемой объектом. Для обеспечения этого требуется служба членства, которая обеспечивает логическое упорядочивание узлов. Это достигается с помощью MRL. Служба членства гарантирует, что любое добавление или удаление блока в конечном итоге и надежно будет сообщено всем остальным активным блокам. MRL также отвечает за маршрутизацию сообщений к блокам и от них, а также к связанным с ними DHT. MRL использует DHT с одним переходом для маршрутизации, то есть для маршрутизации сообщений никогда не требуется более одного перехода через узел, когда система BitVault стабильна, то есть не добавляются новые блоки и не выполняется балансировка нагрузки или восстановление. MRL реализован с использованием архитектуры XRing, которая поддерживает распределенную таблицу маршрутизации, обеспечивающую маршрутизацию с одним переходом.

Архитектура из одного кирпича

Кирпич регистрируется в MRL с помощью 160-битного ключа, который формирует его идентификатор, а его зона в DHT простирается от его идентификатора до непосредственно перед идентификатором его следующего логического преемника. Архитектура кирпича разделена на две части – модуль индекса и модуль данных. Модуль индекса хранит список всех реплик, закэшированных диском, сопоставленный с их хешами. Кроме того, для каждого хранимого объекта модуль индекса также ведет список местоположений всех остальных реплик этого объекта. Модуль индекса отслеживает изменения в MRL и обновляется в соответствии с изменениями в членстве, а также с данными, поступающими в систему BitVault или извлекаемыми из нее. Модуль индекса также отвечает за инициирование восстановления реплик при получении информации о поврежденной реплике и за запрос восстановления реплик, хранящихся в нем. Модуль индекса подключен к небольшому модулю доступа, который служит шлюзом для внешних клиентов. Модуль данных хранит реплики объектов на локальном диске. Вместе с объектом также хранятся его метаданные, такие как его хеш-ключ и степень репликации в системе BitVault.

Зарегистрироваться

Вставка данных в систему BitVault называется Check In. Для Check In требуется объект, его ключ и начальная степень репликации. MRL направляет объект и все его параметры к одному из кирпичей. Затем кирпич сохраняет данные в своем модуле данных и начинает репликацию объекта, публикуя его случайным кирпичам для достижения заданной степени репликации. Когда объект достигает требуемой степени репликации, его индекс считается завершенным, иначе он является частичным. Кирпич должен выполнить дополнительную репликацию объекта с частичным индексом. Кирпичи также периодически проверяют, что индекс объекта остается завершенным.

Проверка

Извлечение (Check Out) — это процесс получения данных из системы BitVault. Приложение, использующее BitVault в качестве хранилища данных, предоставляет хеш-ключ объекта, который необходимо получить, который MRL отправляет любому блоку. Если блок не содержит объект, он передает запрос другим блокам параллельно. Если блок содержит объект, он извлекается из его модуля данных и направляется запросившему приложению.

Допустимость неисправности

Ошибки BitVault могут быть временными или постоянными. Временный сбой происходит, когда компонент испытывает кратковременную неисправность, например, сбой программного обеспечения, вызывающий перезагрузку. Постоянный сбой указывает на ошибки, такие как аппаратная неисправность. При обнаружении любого сбоя другие компоненты, имеющие реплику затронутого объекта, помечают запись этого объекта в индексе как частичную, что инициирует дальнейшую репликацию. Все остальные компоненты, содержащие реплики, совместно отправляют различные части данных объекта параллельно новому компоненту, который будет хранить реплику. Такая параллельная репликация ускоряет восстановление поврежденного индекса до полного состояния.

Изменения в членстве

Каждый раз, когда новый блок добавляется в систему BitVault, ему присваивается случайный идентификатор, и он связывается с другими блоками. Эти блоки затем включают новый блок в свой список участников. Новый блок также получает ответ от блоков, которые добавили его в свой список участников, и добавляет этих ответивших в свой собственный список участников. После этого в системе автоматически запускается фоновая балансировка нагрузки для заполнения нового блока действующими репликами.

Балансировка нагрузки

Кирпичи периодически запрашивают у других кирпичей информацию о текущей нагрузке. Затем кирпич переносит часть реплик на кирпичи с низкой нагрузкой, чтобы добиться более равномерного распределения нагрузки между ними. Он также отправляет сообщения другим кирпичам, чтобы они обновили свои индексы с учетом произошедших изменений.