Я намагаюся реалізувати таблицю розподілених хеш-консистентних виробів, але деякі речі уникають мого розуміння. Я сподівався, що хтось може уточнити.
Відмова : Я не студент інформатики. У житті я взяв саме два курси інформатики, і жоден із них не мав нічого складного. Я працював з програмним забезпеченням протягом багатьох років, тому відчуваю, що я вирішую завдання з реалізації, якби я міг просто обернути голову навколо ідеї. Тому я, можливо, просто пропускаю щось очевидне.
Я прочитав статтю, яку опублікували автори [1], і я досяг непоганого прогресу, але продовжую зависати на цьому конкретному етапі роботи таблиці маршрутизації:
У роботі стверджується, що
Таблиця маршрутизації вузла, , організована у ⌈ log 2 b N ⌉ рядків з 2 b - 1 записами кожен. 2 б - 1 записи в рядку п таблиці маршрутизації кожен відносяться до вузла , чиє NodeId акцій NodeId нинішнього вузла в першому п цифри, але чиї п + - - го цифра має один з 2 б - 1 можливих значень, крім п + 1 - го цифра ідентифікатора нинішнього вузла.
виступає за конкретного додатка, як правило , змінної 4 . Для простоти скористаємося b = 4 . Отже, сказане вище
Таблиця маршрутизації вузла, , організована у ⌈ log 16 N ⌉ рядків з 15 записами в кожному. Кожен з 15 записів у рядку n таблиці маршрутизації посилається на вузол, чий nodeId поділяє даний nodeId цього вузла на перших n цифрах, але чий n + 1- й розряд має одне з 2 b - 1 можливих значень, крім n + 1- а цифра в ідентифікаторі цього вузла
Я так багато розумію. Далі, - кількість серверів кластеру. Я також це розумію.
Моє запитання полягає в тому, що якщо рядок, в який розміщується запис, залежить від загальної довжини ключа, чому, здавалося б, випадковий ліміт кількості рядків? Кожен nodeId має 32 цифри, коли (128-бітний nodeIds поділений на цифри b біт). Отже, що відбувається, коли N стає досить високим, що ⌈ log 16 N ⌉ > 32 ? Я усвідомлюю, що для цього сценарію знадобиться 340,282,366,920,938,463,463,374,607,431,768,211,457 (якщо моя математика правильна), але це здається дивним включенням, і кореляція ніколи не пояснюється.
Крім того, що станеться, якщо у вас є невелика кількість серверів? Якщо у мене менше 16 серверів, у мене є лише один рядок у таблиці. Далі, за жодних обставин, кожен запис у рядку не матиме відповідного сервера. Чи слід залишати записи порожніми? Я усвідомлюю, що мені вдасться знайти сервер у наборі листів незалежно від того, враховуючи те, що мало серверів, але однаковий складник піднімається для другого ряду - що робити, якщо у мене немає сервера, який має nodeId такий, що я можу заповнити всі можливі перестановки n-ї цифри? Нарешті, якщо у мене, скажімо, чотири сервери, і у мене є два вузли, які поділяють, скажімо, 20 з їхніх 32 цифр, якимось випадковим флюком ... я повинен заповнити 20 рядків таблиці для цього вузла, хоча це набагато більше рядків, ніж я міг навіть наблизитись до заповнення?
Ось що я придумав, намагаючись пояснити це:
- Записи повинні бути встановлені на нульове значення, якщо немає вузла, який точно відповідає цьому префіксу.
- Порожні рядки потрібно додати до тих пір, поки не буде достатньо рядків, щоб відповідати загальній довжині nodeIds.
- Якщо і лише у тому випадку, якщо для потрібного ідентифікатора повідомлення немає відповідного запису, поверніться до пошуку таблиці маршрутизації для nodeId, загальна довжина якого більше або дорівнює поточному nodeId, і запис якого математично ближче поточного nodeId до потрібного ідентифікатора.
- Якщо в №3 не знайдено відповідного вузла, припустимо, що це адресат і доставити повідомлення.
Чи всі ці припущення виконуються? Чи є десь ще я мушу шукати інформацію про це?
- Кондитерські вироби: масштабоване, децентралізоване розташування об'єктів та маршрутизація для масштабних однорангових систем А. Роустронга та П. Друшеля (2001) - завантажити тут