График пропуска - Википедия - Skip graph
Пропустить графики представляют собой своего рода распределенную структуру данных, основанную на пропустить списки. Их изобрели в 2003 году Джеймс Аспнес и Гаури Шах. Почти идентичная структура данных под названием SkipNet была независимо изобретена Николасом Харви, Майклом Джонсом, Стефаном Саройу, Марвином Таймером и Алеком Вольманом также в 2003 году. [1]
Графики пропуска имеют полную функциональность сбалансированное дерево в распределенная система. Графики пропуска в основном используются при поиске одноранговые сети. Поскольку они дают возможность запрос к заказ ключей, они лучше инструментов поиска на основе хеш-таблица только функциональность. В отличие от пропустить списки и другие древовидные структуры данных, они очень устойчивы и могут переносить большую часть узел неудачи. Кроме того, построение, вставка, поиск и исправление графа пропусков, который был нарушен отказавшими узлами, можно выполнить с помощью простых алгоритмов.[2]
Описание
Граф пропуска - это распределен структура данных на основе пропустить списки разработан, чтобы напоминать сбалансированное дерево поиска. Это один из нескольких методов реализации распределенная хеш-таблица, которые используются для поиска ресурсов, хранящихся в разных местах в сети, с учетом имени (или ключа) ресурса. Графики пропуска предлагают несколько преимуществ по сравнению с другими схемами распределенных хеш-таблиц, такими как Аккорд (одноранговый) и Гобелен (DHT), включая добавление и удаление за ожидаемое логарифмическое время, логарифмическое пространство на ресурс для хранения информации индексации, отсутствие необходимых сведений о количестве узлов в наборе и поддержку сложных запросов диапазона. Основное отличие от Chord и Tapestry заключается в том, что здесь нет хеширования ключей поиска ресурсов, что позволяет связанным ресурсам находиться рядом друг с другом в графе пропуска; это свойство делает возможным поиск значений в заданном диапазоне. Еще одна сильная сторона графов пропуска - устойчивость к отказу узлов как в случайном, так и в случайном порядке. состязательный модели отказа.
Детали реализации
Как и с пропустить списки, узлы расположены в порядке возрастания на нескольких уровнях; каждый узел на уровне я содержится на уровне я+1 с некоторой вероятностью p (настраиваемый параметр). Уровень 0 состоит из одного двусвязный список содержащий все узлы в наборе. Списки становятся все более разреженными на более высоких уровнях, пока список не состоит только из одного узла. Графики пропуска отличаются от списков пропусков тем, что каждый уровень я≥1, будет содержать несколько списков; принадлежность ключа Икс в списке определяется вектор членства . Вектор принадлежности определяется как бесконечное случайное слово в фиксированном алфавите, каждый список в графе пропуска идентифицируется конечным словом ш из того же алфавита, если это слово является префиксом тогда узел x является членом списка.[2]
Операции
Графики пропуска поддерживают основные операции поиск, вставлять и Удалить. Графики пропуска также поддерживают более сложные поиск по диапазону операция.
Поиск
Алгоритм поиска для графов пропуска почти идентичен алгоритму поиска для списков пропуска, но он модифицирован для работы в распределенной системе. Поиск начинается с верхнего уровня и проходит по структуре. На каждом уровне поиск проходит по списку, пока следующий узел не будет содержать больший ключ. Когда найден больший ключ, поиск переходит на следующий уровень, продолжаясь до тех пор, пока ключ не будет найден или не будет определено, что ключ не содержится в наборе узлов. Если ключ не содержится в наборе узлов, возвращается наибольшее значение, меньшее, чем ключ поиска.
Каждый узел в списке имеет следующие поля:
ключ
- Значение узла.
сосед [R / L] [уровень]
- Массив, содержащий указатели на правого и левого соседа в дважды связанном узле на уровне i.
поиск (searchOp, startNode, searchKey, уровень) если (v.key = searchKey) тогда Отправить(foundOp, v) в startNode если (v.keyтогда пока уровень ≥ 0 если (v.neighbor [R] [уровень] .key ≤ searchKey) тогда Отправить(searchOp, startNode, searchKey, level) на v.neighbor [R] [level] перемена еще level = level - 1 еще пока уровень ≥ 0 если ((v.neighbor [L] [level]). ключ ≥ searchKey) тогда Отправить(searchOp, startNode, searchKey, level) на v.neighbor [L] [level] перемена еще level = level - 1 если (уровень <0) тогда Отправить(notFoundOp, v) в startNode
Анализ, проведенный Уильямом Пью, показывает, что в среднем список пропусков и, соответственно, граф пропусков содержат уровни для фиксированного значения п.[3] Учитывая, что самое большее узлы просматриваются в среднем на уровне, общее ожидаемое количество отправленных сообщений составляет и ожидаемое время поиска .[2] Следовательно, при фиксированном значении п, ожидается, что поисковая операция займет О(бревно п) время используя О(бревно п) Сообщения.[2]
Вставлять
Вставка выполняется в два этапа и требует, чтобы новый узел ты знает какой-то вводящий узел v; вводящий узел может быть любым другим узлом, находящимся в данный момент в графе пропуска. На первом этапе новый узел ты использует вводящий узел v искать собственный ключ; ожидается, что этот поиск завершится неудачно и вернет узел s с самым большим ключом меньше чем ты. На втором этапе ты вставляет себя на каждом уровне, пока не станет единственным элементом в списке на верхнем уровне.[2] Вставка на каждом уровне выполняется с помощью стандартных операций с двусвязным списком; следующий указатель левого соседа изменяется, чтобы указывать на новый узел, а предыдущий указатель правого соседа изменяется, чтобы указывать на узел.
insert () искать sL = 0пока истинная вставка ты на уровень L из s Сканирование через уровень L найти s ' такой, который имеет вектор принадлежности, соответствующий вектору принадлежности ты для первого L+1 символы если нет s ' существует выход еще s = s ' L = L + 1
Как и при поиске, операция вставки занимает ожидаемое О(бревно п) сообщения и О(бревно п) время. При фиксированном значении p; ожидается, что операция поиска на этапе 1 займет О(бревно п) время и сообщения. В фазе 2 на каждом уровне L ≥ 0, ты общается со средним 1 /п другие узлы, чтобы найти s', для этого потребуется О(1/п) время и сообщения, ведущие к О(1) время и сообщения для каждого шага в фазе 2.[2]
Удалить
Узлы могут быть удалены параллельно на каждом уровне в О(1) время и О(бревно п) Сообщения.[2] Когда узел желает покинуть граф, он должен послать сообщения своим ближайшим соседям, чтобы переставить их следующий и предыдущий указатели.[2]
Удалить()за L = от 1 до максимального уровня, параллельно Удалить ты с каждого уровня.Удалить ты с уровня 0
График пропусков содержит в среднем О(бревно п) уровни; на каждом уровне ты должен отправить 2 сообщения для завершения операции удаления двусвязного списка. Поскольку операции на каждом уровне могут выполняться параллельно, операцию удаления можно завершить, используя О(1) время и ожидаемое О(бревно п) Сообщения.
Отказоустойчивость
В графах пропуска отказоустойчивость описывает количество узлов, которые могут быть отключены от графа пропуска из-за отказов других узлов.[2] Были изучены две модели отказа; случайные неудачи и состязательные неудачи. В модели случайного отказа любой узел может выйти из строя независимо от любого другого узла с некоторой вероятностью. Состязательная модель предполагает, что отказы узлов запланированы таким образом, что на каждом шаге достигается наихудший возможный отказ, известна вся структура графа пропусков и отказы выбираются для максимального отключения узла. Недостатком графов пропуска является отсутствие ремонтный механизм; в настоящее время единственный способ удалить и восстановить граф пропуска - это построить новый граф пропуска с уцелевшими узлами.
Случайный сбой
Графики пропуска очень устойчивы к случайным сбоям. Сохраняя информацию о состоянии соседей и используя избыточные ссылки, чтобы избежать сбоев соседей, нормальные операции могут продолжаться даже при большом количестве сбоев узлов. Пока количество отказавших узлов меньше график пропусков может продолжать нормально функционировать.[2] Моделирование, проведенное Джеймсом Аспнесом, показывает, что граф пропуска с 131072 узлами выдерживал отказ до 60% своих узлов до того, как оставшиеся узлы были изолированы.[2] В то время как другие распределенные структуры данных могут обеспечить более высокий уровень отказоустойчивости, они, как правило, намного сложнее.
Состязательная неудача
Состязательный отказ трудно смоделировать в большой сети, так как становится трудно найти схемы отказа наихудшего случая.[2] Теоретический анализ показывает, что устойчивость зависит от коэффициент расширения вершины графа, определяемого следующим образом. Для набора узлов A в графе G коэффициент расширения - это количество узлов не в A, а смежных с узлом в A, деленное на количество узлов в A. Если графы пропуска имеют достаточно большой коэффициент расширения, равный то самое большее узлы могут быть разделены, даже если до f отказов специально предназначены.[2]
Рекомендации
- ^ Николас Дж. А. Харви, Майкл Б. Джонс, Стефан Саройу, Марвин Таймер, Алек Вольман. «SkipNet: масштабируемая оверлейная сеть с практическими свойствами местности» (PDF). https://www.usenix.org/legacy/events/usits03/tech/harvey/harvey.pdf.CS1 maint: несколько имен: список авторов (связь) CS1 maint: location (связь)
- ^ а б c d е ж грамм час я j k л м Джеймс Аспнес; Гаури Шах. «Пропустить графики» (PDF). http://www.cs.yale.edu/: Компьютерные науки - Йельский университет.
Графы пропуска - это новая распределенная структура данных, основанная на списках пропуска, которые обеспечивают полную функциональность сбалансированного дерева в распределенной системе, где ресурсы хранятся в отдельных узлах, которые могут выйти из строя в любой момент. Они предназначены для использования при поиске в одноранговых системах и, предоставляя возможность выполнять запросы на основе упорядочения ключей, улучшают существующие инструменты поиска, которые предоставляют только функции хеш-таблицы. В отличие от списков пропуска или других древовидных структур данных, графы пропуска очень устойчивы, выдерживая большую часть отказавших узлов без потери связи. Кроме того, можно использовать простые и понятные алгоритмы для построения графа пропуска, вставки в него новых узлов, поиска по нему, а также обнаружения и исправления ошибок в графе пропуска, возникших из-за сбоев узлов.
- ^ Уильям Пью. «Пропускные списки: вероятная альтернатива сбалансированным деревьям» (PDF). http://web.stanford.edu/class/cs161/skiplists.pdf.CS1 maint: location (связь)