BitVault — это распределенная система хранения с адресацией по содержимому, разработанная Microsoft Research в Китае. BitVault использует одноранговую технологию для распределения задач по хранению и управлению данными. Таким образом, нет центрального органа, ответственного за управление системой. Вместо этого она является самоуправляемой, обеспечивает высокую доступность, надежность и масштабируется самоорганизующимся образом с низкими административными издержками, которые практически постоянны независимо от размера распределенной оверлейной сети .
Система BitVault лучше всего подходит для справочных данных, которые представляют собой большой объем данных, которые изменяются очень редко. Такие данные включают архивы устаревших данных, а также мультимедийные данные, такие как музыка и видео, которые, хотя и могут часто использоваться, изменяются очень редко.
Каждый участвующий одноранговый узел в архитектуре BitVault — это Smart Brick , представляющий собой урезанный ПК с большими дисками. Все Smart Brick в системе BitVault соединены сетью с высокой пропускной способностью и низкой задержкой . Систему BitVault можно легко масштабировать — любой компьютер можно настроить для работы в качестве Smart Brick, просто установив программное обеспечение BitVault и подключив его к сети, без необходимости прерывания работы уже работающих узлов.
BitVault хранит неизменяемые объекты данных, т. е. объекты, которые нельзя изменить. Физическое местоположение объектов не фиксировано и может быть на любом из блоков. Его местоположение меняется в зависимости от частоты доступа; его даже можно реплицировать на более чем одном блоке. Чтобы обойти эту проблему изменения местоположений, BitVault делает его доступным с помощью 160-битного ключа, который уникален для каждого объекта. Система динамически ссылается на местоположение, из которого объект может быть извлечен наиболее эффективно, с помощью ключа, и делает объект доступным. Уникальный ключ генерируется из хеша данных объекта, таким образом делая систему адресуемой по содержимому, а не адресуемой по местоположению. Хэши объектов ( key ) сопоставляются с физическими адресами с помощью хеш-таблиц, которые управляются системой изнутри и не требуют вмешательства пользователя. Различные наборы узлов поддерживают различные наборы хэш-таблиц, которые касаются только данных в этом наборе узлов, тем самым создавая оверлейную сеть, в которой местоположение данных отслеживается с помощью архитектуры распределенной хэш-таблицы (DHT).
Архитектура BitVault состоит из нескольких блоков, которые составляют логическое 160-битное адресное пространство, каждый из которых связан с хешем некоторых данных. Ассоциация поддерживается в распределенной хэш-таблице (DHT). DHT разделяет всю хэш-таблицу на меньшие хэш-таблицы. Например, если есть n пиров, хэш-таблица будет разделена на n хэш-таблиц, каждая из которых начинается со строки, следующей за той, где закончился ее непосредственный предшественник. Каждый DHT имеет свой связанный блок, а объем логического адресного пространства, за которое отвечает блок, называется его Зоной. Блоки взаимодействуют с использованием одноранговой технологии через уровень членства и маршрутизации (MRL). Поиск любого объекта данных может выполняться n блоками параллельно в его собственной зоне, что дает эффективность O (log N).
Несколько копий одного объекта, называемых репликой , хранятся в системе BitVault, чтобы обеспечить достаточную избыточность . Если какой-либо индекс поврежден, ближайшая реплика может быть уведомлена о необходимости начать его восстановление. А если индекс замечает, что реплика повреждена, он может инициировать восстановление реплики. Этот метод восстановления после ошибок называется моделью Object Driven Repair . Чтобы это работало, должна быть запущена служба членства, которая будет давать логический порядок одноранговым узлам. Это достигается с помощью MRL. Служба членства гарантирует, что любое добавление или удаление блока в конечном итоге и надежно информируется обо всех других активных блоках. MRL также отвечает за маршрутизацию сообщений к блокам и связанным с ними DHT и от них.
MRL использует односкачковый DHT для выполнения маршрутизации, т. е. никогда не требуется более одного скачка через одноранговый узел для маршрутизации сообщений, когда система BitVault стабильна, т. е. не добавляются новые блоки, не происходит балансировка нагрузки или ремонт. MRL реализован с использованием архитектуры XRing, которая поддерживает распределенную таблицу маршрутизации, что облегчает односкачковую маршрутизацию.
Блок регистрирует себя в MRL с помощью 160-битного ключа, который формирует его идентификатор, а его зона в DHT начинается с его идентификатора и заканчивается идентификатором его следующего логического преемника. Архитектура блока разделена на две части — модуль индекса и модуль данных. Модуль индекса хранит список всех реплик, которые кэшируются диском, сопоставленных с их хэшами. Кроме того, для каждого сохраненного объекта IM также хранит список местоположений всех других реплик объекта. IM прослушивает MRL и обновляет себя в соответствии с изменениями членства, а также в соответствии с данными, которые вводятся в систему BitVault или извлекаются из нее. IM также отвечает за инициирование восстановления реплик, как только он получает информацию о поврежденной реплике, и за запрос на восстановление реплик в своем хранилище. IM подключен к небольшому модулю доступа, который служит шлюзом для внешних клиентов. Модуль данных хранит реплики объектов на локальном диске. Вместе с объектом сохраняются также его метаданные, такие как его хэш-ключ и степень его репликации в системе BitVault.
Вставка данных в систему BitVault называется Check In. Для Check In требуется объект, его ключ и начальная степень репликации. MRL направляет объект и все его параметры в некоторый блок. Затем блок сохраняет данные в своем модуле данных и начинает работу по репликации объекта, публикуя их в случайных блоках, чтобы достичь указанной степени репликации. Когда объект достигает требуемой степени репликации, его индекс считается полным, в противном случае он является частичным. Блок должен выполнить дальнейшую репликацию объекта, имеющего частичный индекс. Блоки также периодически проверяют, что индекс объекта все еще полон.
Check Out — это процесс извлечения данных из системы BitVault. Приложение, использующее BitVault в качестве хранилища данных, выдает хэш-ключ объекта, который необходимо извлечь, который MRL отправляет любому блоку. Если блок не имеет объекта, он передает запрос другим блокам параллельно. Если блок имеет объект, он извлекается из его модуля данных и направляется запрашивающей стороне.
Ошибки BitVault могут быть как временными, так и постоянными. Временный сбой происходит, когда блок испытывает временный сбой, такой как сбой программного обеспечения, вызывающий перезагрузку. Постоянный сбой указывает на ошибки, такие как сбой оборудования. Всякий раз, когда обнаруживается какой-либо сбой, другие блоки, имеющие реплику затронутого объекта, обновляют запись объекта в индексе, делая ее частичной, и таким образом запускают дальнейшую репликацию. Все другие блоки, содержащие реплики, совместно отправляют различные части данных объекта параллельно новому блоку, который будет содержать реплику. Эта параллельная репликация ускоряет восстановление поврежденного индекса, чтобы вернуть его в полное состояние.
Всякий раз, когда в систему BitVault добавляется новый блок, он берет случайный идентификатор и связывается с другими блоками. Блоки затем включают этот новый блок в свой список участников. Недавно добавленный блок также получает ответ от тех блоков, которые добавили его в свой список участников. Новый блок добавляет респондентов в свой список участников. Фоновая балансировка нагрузки системы включается для заполнения нового блока живыми репликами.
Блоки периодически опрашивают другие блоки о состоянии нагрузки в них. Затем блок переносит некоторые реплики на блоки с низкой нагрузкой, чтобы получить более или менее сбалансированную нагрузку на каждый блок. Он также отправляет сообщения другим блокам для обновления их индексов с целью отражения изменения.