Files
hse-2026/materials/07-naming-lookup/seminar/chord/readme.md
T
2026-10-21 23:03:28 +03:00

4.9 KiB
Raw Blame History

Chord: найти ответственного за ключ

В распределённой хеш-таблице данные распределены между узлами. Чтобы прочитать значение, сначала нужно найти узел, отвечающий за его ключ. Chord решает эту задачу, располагая идентификаторы узлов и ключи на кольце.

В нашем примере пространство идентификаторов — 0…31, участники — 2, 7, 13, 20, 27. После 31 снова идёт 0. За ключ отвечает первый узел, встреченный при движении от ключа по часовой стрелке, включая узел с тем же ID. Он называется successor ключа.

Узел знает своего следующего соседа и хранит finger table — таблицу ссылок, позволяющую пропускать часть кольца при поиске. Для узла n её строки указывают на successor точек (n + 2^i) mod 32, где i = 0…4.

Задачи

  1. Кто отвечает за ключи 0, 18, 26?
  2. Постройте finger table узла 2: вычислите пять точек и найдите successor каждой.
  3. Найдите владельца ключа 26, начиная с узла 2. Сравните обход по соседям с использованием finger table.
  4. В кольцо вошёл узел 24. Какие ключи меняют владельца после обновления ссылок?
  5. Затем узел 24 отказал. После восстановления кольца кто отвечает за его ключи? Обязательно ли у него есть значения?

Для задачи 3 вспомните правило поиска. Если ключ находится между текущим узлом и следующим соседом, включая соседа, результат уже известен. Иначе запрос передаётся по самой далёкой ссылке из finger table, которая ещё не достигает ключа при движении по кольцу. Если подходящей ссылки нет, поиск продолжается у следующего соседа. Ключ, совпадающий с ID текущего узла, принадлежит ему самому.

Решения и пояснения

За ключи 0, 18, 26 отвечают соответственно 2, 20, 27.

Точка finger table узла 2 Ссылка на её successor
3 7
4 7
6 7
10 13
18 20

Для ключа 26 узел 2 выбирает ссылку на 20. Узел 20 знает своего следующего соседа 27 и возвращает его как результат поиска.

Маршрут обработки запроса с finger table: 2 → 20, результат — 27. Только по соседям: 2 → 7 → 13 → 20, результат — 27. Последующее обращение к узлу 27 за значением считается отдельно.

При присоединении 24 к нему переходят ключи 21…24 от узла 27. Например, следующий сосед узла 20 меняется с 27 на 24.

После отказа 24 и восстановления кольца за эти ключи снова отвечает 27. Возможность найти его не означает, что значения сохранились: для этого нужны реплики или другой механизм восстановления данных.

Проверить расчёты

Из каталога seminar, после подготовки стенда:

docker compose run --rm -T tools python3 chord/demo.py

Для этой части можно обойтись без Docker: при установленном Python 3.10+ выполните из того же каталога python chord/demo.py.

Модель рассчитывает таблицы и маршруты для кольца, в котором ссылки уже обновлены. В реальной системе после присоединения или отказа узла они меняются постепенно; этот процесс и хранение значений модель не воспроизводит.