Распределенная хэш-таблица ( DHT ) — это распределенная система , которая предоставляет услугу поиска, похожую на хэш-таблицу . Пары ключ-значение хранятся в DHT, и любой участвующий узел может эффективно извлекать значение, связанное с данным ключом. Главное преимущество DHT заключается в том, что узлы можно добавлять или удалять с минимальными усилиями по перераспределению ключей. [1] Ключи — это уникальные идентификаторы, которые сопоставляются с определенными значениями , которые, в свою очередь, могут быть чем угодно: от адресов до документов и произвольных данных . [2] Ответственность за поддержание сопоставления ключей со значениями распределяется между узлами таким образом, что изменение в наборе участников вызывает минимальное количество сбоев. Это позволяет DHT масштабироваться до чрезвычайно большого количества узлов и обрабатывать постоянные прибытия, отправления и сбои узлов.
DHT формируют инфраструктуру, которую можно использовать для создания более сложных сервисов, таких как anycast , кооперативное веб-кэширование , распределенные файловые системы , службы доменных имен , мгновенные сообщения , многоадресная рассылка , а также одноранговые системы обмена файлами и распространения контента . Известные распределенные сети, которые используют DHT, включают распределенный трекер BitTorrent, сеть Kad , ботнет Storm , мгновенный мессенджер Tox , Freenet , поисковую систему YaCy и файловую систему InterPlanetary .
Исследования DHT изначально были мотивированы, в частности, одноранговыми (P2P) системами, такими как Freenet , Gnutella , BitTorrent и Napster , которые использовали ресурсы, распределенные по Интернету, для предоставления единого полезного приложения. В частности, они использовали преимущества увеличенной пропускной способности и емкости жесткого диска для предоставления службы обмена файлами. [3]
Эти системы различались тем, как они находили данные, предлагаемые их коллегами. Napster, первая крупномасштабная система доставки контента P2P, требовала центрального индексного сервера: каждый узел при присоединении отправлял список локально хранящихся файлов на сервер, который выполнял поиск и направлял запросы на узлы, хранящие результаты. Этот центральный компонент делал систему уязвимой для атак и судебных исков.
Gnutella и подобные сети перешли на модель затопления запросов — по сути, каждый поиск приводил к трансляции сообщения на каждую машину в сети. Избегая единой точки отказа , этот метод был значительно менее эффективен, чем Napster. Более поздние версии клиентов Gnutella перешли на динамическую модель запросов, что значительно повысило эффективность. [4]
Freenet полностью распределен, но использует эвристическую маршрутизацию на основе ключей , в которой каждый файл связан с ключом, а файлы с похожими ключами имеют тенденцию группироваться на похожем наборе узлов. Запросы, скорее всего, будут направляться через сеть в такой кластер без необходимости посещать множество пиров. [5] Однако Freenet не гарантирует, что данные будут найдены.
Распределенные хэш-таблицы используют более структурированную маршрутизацию на основе ключей для достижения как децентрализации Freenet и Gnutella, так и эффективности и гарантированных результатов Napster. Один из недостатков заключается в том, что, как и Freenet, DHT напрямую поддерживают только поиск по точному совпадению, а не поиск по ключевым словам, хотя алгоритм маршрутизации Freenet можно обобщить для любого типа ключа, где можно определить операцию близости. [6]
В 2001 году четыре системы — CAN , [7] Chord , [8] Pastry и Tapestry — зажгли DHT как популярную тему исследований. Проект под названием Infrastructure for Resilient Internet Systems (Iris) был профинансирован грантом в размере 12 миллионов долларов от Национального научного фонда США в 2002 году. [9] Среди исследователей были Сильвия Ратнасами , Ион Стоика , Хари Балакришнан и Скотт Шенкер . [10] За пределами академических кругов технология DHT была принята в качестве компонента BitTorrent и в проектах PlanetLab, таких как Coral Content Distribution Network. [11]
Для DHT характерны следующие свойства:
Ключевой метод, используемый для достижения этих целей, заключается в том, что любому узлу необходимо координировать работу только с несколькими другими узлами в системе
чаще всего с O (log n ) из n участников (см. ниже) так что для каждого изменения в составе необходимо выполнить лишь ограниченный объем работы.Некоторые проекты DHT стремятся обеспечить защиту от злонамеренных участников [13] и позволить участникам оставаться анонимными , хотя это встречается реже, чем во многих других одноранговых системах (особенно для обмена файлами ); см. анонимный P2P .
Структуру DHT можно разложить на несколько основных компонентов. [14] [15] Основой является абстрактное пространство ключей , например, набор 160-битных строк . Схема разбиения пространства ключей разделяет владение этим пространством ключей между участвующими узлами. Затем оверлейная сеть соединяет узлы, позволяя им находить владельца любого заданного ключа в пространстве ключей.
После того, как эти компоненты будут установлены, типичное использование DHT для хранения и извлечения может происходить следующим образом. Предположим, что пространство ключей представляет собой набор 160-битных строк. Чтобы индексировать файл с заданным именем файла и данными в DHT, генерируется хэш SHA-1 имени файла , что создает 160-битный ключ k , и сообщение put ( k, data ) отправляется любому узлу, участвующему в DHT. Сообщение пересылается от узла к узлу через оверлейную сеть, пока не достигнет единственного узла, ответственного за ключ k , как указано в разбиении пространства ключей. Затем этот узел сохраняет ключ и данные. Затем любой другой клиент может извлечь содержимое файла, снова хэшируя имя файла для получения k и запрашивая любой узел DHT найти данные, связанные с k , с помощью сообщения get ( k ) . Сообщение снова будет направлено через оверлей к узлу, ответственному за k , который ответит сохраненными данными .
Ниже описаны компоненты разделения пространства ключей и оверлейной сети с целью отражения основных идей, общих для большинства DHT; многие конструкции различаются в деталях.
Большинство DHT используют некоторые варианты согласованного хеширования или хеширования рандеву для сопоставления ключей с узлами. Оба алгоритма, по-видимому, были разработаны независимо и одновременно для решения проблемы распределенной хеш-таблицы.
Как согласованное хеширование, так и рандеву-хеширование имеют существенное свойство: удаление или добавление одного узла изменяет только набор ключей, принадлежащих узлам со смежными идентификаторами, и оставляет все остальные узлы нетронутыми. Сравните это с традиционной хеш-таблицей, в которой добавление или удаление одного контейнера приводит к перераспределению почти всего пространства ключей. Поскольку любое изменение владельца обычно соответствует интенсивному перемещению объектов, хранящихся в DHT, с одного узла на другой, требуется минимизация такой реорганизации для эффективной поддержки высоких показателей оттока (прихода и отказа узла).
Последовательное хеширование использует функцию , которая определяет абстрактное понятие расстояния между ключами и , которое не связано с географическим расстоянием или задержкой сети . Каждому узлу назначается один ключ, называемый его идентификатором (ID). Узел с ID владеет всеми ключами, для которых является ближайший ID, измеренный в соответствии с .
Например, Chord DHT использует согласованное хеширование, которое рассматривает узлы как точки на окружности, и является расстоянием, пройденным по часовой стрелке по окружности от до . Таким образом, круговое пространство ключей разделено на смежные сегменты, конечные точки которых являются идентификаторами узлов. Если и являются двумя соседними идентификаторами с более коротким расстоянием по часовой стрелке от до , то узел с идентификатором владеет всеми ключами, которые попадают между и .
При рандеву-хешировании, также называемом хешированием с наивысшим случайным весом (HRW), все клиенты используют одну и ту же хеш-функцию (выбранную заранее) для привязки ключа к одному из n доступных серверов. У каждого клиента есть один и тот же список идентификаторов { S 1 , S 2 , ..., S n } , по одному для каждого сервера. При наличии некоторого ключа k клиент вычисляет n хеш-весов w 1 = h ( S 1 , k ), w 2 = h ( S 2 , k ), ..., w n = h ( S n , k ) . Клиент связывает этот ключ с сервером, соответствующим наивысшему хеш-весу для этого ключа. Сервер с идентификатором владеет всеми ключами , для которых хеш-вес выше, чем хеш-вес любого другого узла для этого ключа.
Хеширование с сохранением локальности гарантирует, что схожие ключи назначаются схожим объектам. Это может обеспечить более эффективное выполнение запросов диапазона, однако, в отличие от использования последовательного хеширования, нет больше гарантий того, что ключи (и, следовательно, нагрузка) равномерно случайным образом распределены по пространству ключей и участвующим одноранговым узлам. Протоколы DHT, такие как Self-Chord и Oscar [16], решают такие проблемы. Self-Chord отделяет ключи объектов от идентификаторов одноранговых узлов и сортирует ключи по кольцу с помощью статистического подхода, основанного на парадигме роевого интеллекта . [17] Сортировка гарантирует, что схожие ключи хранятся соседними узлами и что процедуры обнаружения, включая запросы диапазона , могут быть выполнены за логарифмическое время. Oscar создает навигируемую сеть малого мира на основе случайной выборки, также гарантируя логарифмическое время поиска.
Каждый узел поддерживает набор ссылок на другие узлы (свои соседи или таблицу маршрутизации ). Вместе эти ссылки образуют оверлейную сеть. [18] Узел выбирает своих соседей в соответствии с определенной структурой, называемой топологией сети .
Все топологии DHT разделяют некоторый вариант наиболее существенного свойства: для любого ключа k каждый узел либо имеет идентификатор узла, которому принадлежит k , либо имеет ссылку на узел, идентификатор узла которого ближе к k , с точки зрения расстояния пространства ключей, определенного выше. Затем легко направить сообщение владельцу любого ключа k, используя следующий жадный алгоритм (который не обязательно является глобально оптимальным): на каждом шаге пересылать сообщение соседу, идентификатор которого ближе всего к k . Если такого соседа нет, то мы должны были прийти к ближайшему узлу, который является владельцем k , как определено выше. Этот стиль маршрутизации иногда называют маршрутизацией на основе ключей .
Помимо базовой корректности маршрутизации, два важных ограничения на топологию — гарантировать, что максимальное количество переходов в любом маршруте (длина маршрута) будет низким, чтобы запросы выполнялись быстро; и что максимальное количество соседей любого узла (максимальная степень узла ) будет низким, чтобы накладные расходы на обслуживание не были чрезмерными. Конечно, наличие более коротких маршрутов требует более высокой максимальной степени . Некоторые общие варианты максимальной степени и длины маршрута приведены ниже, где n — количество узлов в DHT, с использованием нотации Big O :
Наиболее распространенный выбор, степень/длина маршрута, не является оптимальным с точки зрения компромисса степени/длины маршрута, но такие топологии обычно обеспечивают большую гибкость в выборе соседей. Многие DHT используют эту гибкость для выбора соседей, которые близки с точки зрения задержки в физической базовой сети. В целом, все DHT создают управляемые топологии сетей малого мира, которые компромисс между длиной маршрута и степенью сети. [19]
Максимальная длина маршрута тесно связана с диаметром : максимальным числом переходов в любом кратчайшем пути между узлами. Очевидно, что длина маршрута в худшем случае сети по крайней мере равна ее диаметру, поэтому DHT ограничены компромиссом степени/диаметра [20], который является фундаментальным в теории графов . Длина маршрута может быть больше диаметра, поскольку жадный алгоритм маршрутизации может не найти кратчайшие пути. [21]
Помимо маршрутизации, существует множество алгоритмов, которые используют структуру оверлейной сети для отправки сообщения всем узлам или подмножеству узлов в DHT. [22] Эти алгоритмы используются приложениями для выполнения оверлейной многоадресной рассылки , запросов диапазона или сбора статистики. Две системы, основанные на этом подходе, — это Structella, [23] которая реализует лавинную рассылку и случайные блуждания на оверлее Pastry, и DQ-DHT, которая реализует динамический алгоритм поиска запросов по сети Chord. [24]
Благодаря децентрализации, отказоустойчивости и масштабируемости DHT по своей сути более устойчивы к атакам злоумышленников, чем централизованная система. [ неопределенно ]
Открытые системы для распределенного хранения данных , устойчивые к массированным атакам, вполне возможны. [25]
Система DHT, тщательно спроектированная с учетом византийской отказоустойчивости , может защитить от уязвимости безопасности, известной как атака Сивиллы , которая затрагивает большинство современных конструкций DHT. [26] [27] Whanau — это DHT, разработанная с учетом устойчивости к атакам Сивиллы. [28]
Петар Маймунков, один из первоначальных авторов Kademlia , предложил способ обойти уязвимость атаки Сивиллы, включив в конструкцию системы отношения социального доверия. [29] Новая система под кодовым названием Tonika или также известная по доменному имени как 5ttt, основана на алгоритме, известном как «электрическая маршрутизация» и созданном в соавторстве с математиком Джонатаном Кельнером. [30] Маймунков в настоящее время предпринял всеобъемлющие усилия по внедрению этой новой системы. Однако исследования эффективной защиты от атак Сивиллы обычно считаются открытым вопросом, и каждый год на ведущих конференциях по исследованию безопасности предлагается широкий спектр потенциальных защит. [ необходима ссылка ]
Наиболее заметные различия, встречающиеся на практике при реализации DHT, включают в себя, по крайней мере, следующее:
Значение может быть адресом, документом или произвольным элементом данных.