#hash #redis #consistent-hashing
#хэш #redis #согласованное хэширование
Вопрос:
Я пытаюсь выяснить, на правильном ли я пути. Я создаю службу статистики / аналитики (в реальном времени) и использую redis для хранения некоторых наборов и хэшей.
Теперь давайте предположим, что у меня есть некоторый успех, и мне нужно масштабировать. Метод хэш-кольца выглядит неплохо, но у меня сложилось впечатление, что он подходит только для сценариев кэширования.
Что, если узел выходит из строя? Теоретически, его ключи теперь принадлежат другим узлам. На практике у них не будет данных. Оно потеряно, верно? То же самое с добавлением / удалением узлов.
Я упускаю какую-то фундаментальную вещь? Может ли это быть кластер бедняка?
Ответ №1:
Есть две причины использовать несколько узлов в кластере:
- Сегментирование для ограничения объема данных, хранящихся на каждом узле
- Дублирование для уменьшения нагрузки на чтение и позволяет удалять узел без потери данных.
Эти два метода принципиально отличаются, но вы можете реализовать оба — использовать согласованное хеширование для указания на набор узлов со стандартной настройкой master / slave, а не на один узел.
Если кластер является вашим основным хранилищем данных, а не кешем, вам потребуется другая стратегия перераспределения, которая включает копирование данных.
Моя реализация основана на том, что клиент выбирает одно из 64-тысячных сегментов для хэша и имеет таблицу, которая сопоставляет это сегмент с узлом. Изначально все сопоставляется узлу # 1.
Когда узел # 1 становится слишком большим, его подчиненный становится главным узлом # 2, а таблица обновляется, чтобы сопоставить половину ключей узла # 1 с узлом # 2. На этом этапе все операции чтения и записи будут работать с новым отображением, и вам просто нужно очистить ключи, которые теперь находятся не на том узле. В зависимости от требований к производительности вы можете проверить все ключи сразу или случайный выбор ключей, как это делает система истечения срока действия.
Комментарии:
1. Почти 10 лет спустя это все еще актуально. Всякий раз, когда в каком-либо хранилище данных упоминается согласованное хеширование, они должны простым языком объяснять, как перемещаются данные в случаях отключения / добавления узла.
2. Для репликации данных с согласованным хэшированием, должны ли мы использовать master slave или копировать данные в соседних узлах в кольце?