Я хочу распространять файлы на нескольких серверах и иметь их с очень небольшими накладными расходами. Поэтому я думал о следующем наивном алгоритме:Алгоритм разбиения файлов между серверами
Если у каждого файла есть уникальный идентификационный номер: 120151
Я думаю о сегментировании файлов с помощью оператора modulo (%)
. Это работает, если я знаю, что количество серверов заранее:
Пример 2 серверов (стенды для русских серверов):
server 1 : ID % 2 = 0 (contains even IDs)
server 2 : ID % 2 = 1 (contains odd IDs)
Однако, когда мне нужно масштабировать это и добавить больше серверов, мне придется повторно -shuffle файлы, чтобы подчиняться новым правилам алгоритма, и мы этого не хотим.
Пример:
Say добавить сервер 3 в смеси, потому что не может справиться с нагрузкой. Сервер 3 будет содержать файлы, которые соблюдают следующие критерии:
server 3 : ID%3 = 2
Шаг 1 является для перемещения файлов с сервера 1 и сервера 2, где ID%3 = 2
. Однако, я должен переместить некоторые файлы между сервером 1 и сервером 2, так что происходит следующее:
server 1 : ID%3 = 0
server 2 : ID%3 = 1
Что оптимальный путь для достижения этой цели?
Я, вероятно, что-то пропустил здесь, потому что, насколько я могу судить, есть только один способ сделать это, что является тривиально оптимальным способом. – harold
«Мне придется перетасовывать файлы, чтобы подчиняться новым правилам алгоритма» - это именно то, что делают хэш-карты. Если бы было легко исправить, они бы сделали это вместо этого. – Dukeling
Checkmark последовательное хеширование ниже, оно делает правильную вещь без перетасовки между существующими узлами. В зависимости от того, какой язык вы используете, вероятно, есть библиотеки, которые предоставляют это уже, но алгоритм не такой сложный. – U2EF1