Просте основне пояснення розподіленої хеш-таблиці (DHT)


Відповіді:


237

Гаразд, вони принципово досить проста ідея. DHT надає інтерфейс, подібний до словника, але вузли розподіляються по мережі. Хитрість DHT полягає в тому, що вузол, який потрапляє для зберігання певного ключа, знайдеться шляхом хешування цього ключа, тому фактично ваші відрізки хеш-таблиць тепер є незалежними вузлами в мережі.

Це дає багато відмовостійкості та надійності та, можливо, певну користь від продуктивності, але також призводить до багатьох головних болів. Наприклад, що відбувається, коли вузол залишає мережу, виходячи з ладу чи іншим чином? І як ви перерозподіляєте клавіші, коли вузол приєднується, щоб навантаження приблизно збалансоване. Подумайте про це, як ви рівномірно розподіляєте ключі? А коли вузол приєднується, як уникнути повторної повторної переробки? (Пам'ятайте, що вам доведеться зробити це в звичайній хеш-таблиці, якщо збільшите кількість відра).

Одним із прикладів DHT, який вирішує деякі з цих проблем, є логічне кільце з n вузлів, кожен з яких несе відповідальність за 1 / n простору клавіш. Після того, як ви додасте вузол до мережі, він знайде місце на кільці, щоб сидіти між двома іншими вузлами, і бере на себе відповідальність за деякі клавіші у своїх братів. Краса такого підходу полягає в тому, що жоден з інших вузлів в кільці не зачіпається; лише два вузли братів мають перерозподілити ключі.

Наприклад, скажімо, що в кільці з трьох вузлів перший вузол має ключі 0-10, другий 11-20 і третій 21-30. Якщо з'являється четвертий вузол і вставляється між вузлами 3 і 0 (пам’ятайте, вони знаходяться в кільці), він може взяти на себе відповідальність за скажімо половину клавіш 3, тому тепер він займається 26-30, а вузол 3 - угодами з 21 -25.

Існує багато інших структур накладання, таких як ця, що використовують маршрутизацію на основі вмісту, щоб знайти потрібний вузол, на якому зберігати ключ. Для знаходження ключа в кільці потрібен пошук навколо кільця по одному вузлу (якщо ви не зберігаєте локальну таблицю огляду, проблематичну в DHT тисячах вузлів), що є маршрутизацією O (n) -hop. Інші конструкції - включаючи доповнені кільця - гарантують маршрутизацію O (log n) -hop, а деякі претензії до O (1) -hop маршрутизації ціною більшого обслуговування.

Прочитайте сторінку вікіпедії, і якщо ви дійсно хочете дізнатися трохи глибше, перегляньте цю сторінку курсу в Гарварді, яка має досить вичерпний список для читання.


23
+1 Гарна відповідь. Те, що ви маєте на увазі в третьому абзаці ("Один з прикладів DHT, який вирішує деякі з цих проблем, є логічним кільцем з n вузлів"), є послідовним хешированием. Це дійсно цікава тема, яка використовується в Apache Cassandra, розповсюдженій базі даних, створеній Facebook. Посилання на папір (варто прочитати): cs.cornell.edu/projects/ladis2009/papers/lakshman-ladis2009.pdf
santiagobasulto

5
Протокол пошуку на основі кільця, який досить легко зрозуміти, це акорд: pdos.csail.mit.edu/papers/chord:sigcomm01
ThomasWeiss

Чи можете ви, будь ласка, детальніше розповісти про збереження ключа-значення на вузлі? Це буде якась форма хеш-таблиці або БД ?.
Виробник

@HenryR, Чи не "вузол кільця" просто структура дерева?
Pacerier

Університет штату Іллінойс викладає протокол акорд кожного семестру в рамках класу розподілених систем, якщо хтось хоче більше матеріалів для читання - курси.engr.illinois.edu/ece428/sp2018/lectures.html
Сіддхартха

11

DHT надають користувачеві такий же тип інтерфейсу, що і звичайний хешбел (шукайте значення за ключем), але дані розподіляються по довільній кількості підключених вузлів. У Вікіпедії є гарне основне вступ, що я, по суті, буду регургітувати, якщо напишу більше -

http://en.wikipedia.org/wiki/Distributed_hash_table


7

Я хотів би додати корисну відповідь Генріра, оскільки я просто зрозумів послідовне хеширование. Нормальний / наївний пошук хешу - це функція двох змінних, одна з яких - кількість відро. Краса послідовного хешування полягає в тому, що ми виключаємо кількість відра "n" з рівняння.

При наївному хешировании перша змінна - це ключ об'єкта, який потрібно зберігати в таблиці. Ми будемо називати клавішу "x". Друга змінна - це кількість відра, "n". Отже, щоб визначити, у якому відрі / машині зберігається об’єкт, потрібно обчислити: hash (x) mod (n). Тому, змінюючи кількість відра, ви також змінюєте адресу, за якою зберігається майже кожен об’єкт.

Порівняйте це з послідовним хешированием. Давайте визначимо "R" як діапазон хеш-функції. R - лише якась константа. У послідовному хешировании адреса об'єкта розташована на хеш (х) / R. Оскільки наш пошук більше не є функцією кількості відра, ми закінчуємо меншим перезаписом, коли змінюємо кількість відра.

http://michaelnielsen.org/blog/consistent-hashing/


1
Ви все одно будете потребувати моди, чи не так? Скажіть, у вас є 3 сервери. hash(x)/Rдає 34500. Ще потрібно зробити 34500% 3 .
Pacerier

Ваш допис у блозі незрозумілий, BTW, ви повинні переглядати покроковий знімок робочого прикладу, де вузли додаються та видаляються разом із рядками, які додаються та видаляються.
Pacerier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.